03.爬虫---解析数据与提取数据---Network和json

 

访问动态页面时,会有很多请求,如果用BeautifulSoup只能访问第0个请求,所以爬取大多数网页需要在Network中查找到所需要的请求页面。以QQ音乐的网站为例,在QQ音乐中搜索孙燕姿。

  • 找到Network

网页中点击右键,进入检查(ctrl+shift+i),第一行第四个是Network

  • Network的功能

记录在当前页面上发生的所有请求。现在点进去看上去好像空空如也的样子,这是因为Network记录的是实时网络请求。现在网页都已经加载完成,所以不会有东西。如果此时点击刷新,浏览器会重新访问网络,Network中就会有记录。

  • 红框框里表示共有25个请求,31.0KB流量,黄框框里是具体的25个请求。

03.爬虫---解析数据与提取数据---Network和json_第1张图片

(有些网页,直接把所有的关键信息都放在第0个请求里,尤其是一些比较老(或比较轻量)的网站,用requests和BeautifulSoup就能解决它们(前两篇里用的requests和BeautifulSoup只能访问第0个请求)。比如豆瓣TOP。)

当我们在QQ音乐中搜索时,会有很多个请求,要在黄框框中找到我们搜索的那个请求所在的具体位置,一般在右边(下面红框框中)的Preview中查看我们想要的内容到底在哪个请求中(搜索的话一般是client_search_cp....那个请求)。再用requests库,去模拟这个请求。然后在Header的General中找到Request URL,就是我们的请求链接了。

03.爬虫---解析数据与提取数据---Network和json_第2张图片

  • 这一行是对请求进行分类查看,一般查看XHR

  • 什么是XHR

使用浏览器上网的时候,经常有这样的情况:浏览器所访问的网址没变,但是网页里却新加了内容。如购物网站,下滑自动加载出更多商品。在线翻译网站,输入中文实时变英文。这叫Ajax技术,用于更新页面而不用重新加载整个页面。这种技术在工作时会创建一个XHR(或是Fetch)对象,然后利用XHR对象实现服务器和浏览器之间传输数据。

  • json

json一种组织数据的格式,长得和Python中的列表/字典非常相像。它和html一样,常用来做网络数据传输。因为不是所有的编程语言都能读懂Python里的数据类型(如,列表/字符串),但是所有的编程语言,都支持文本(比如在Python中,用字符串这种数据类型来表示文本)这种最朴素的数据类型。如此,json数据才能实现,跨平台,跨语言工作。

而json和XHR之间的关系:XHR用于传输数据,它能传输很多种数据,json是被传输的一种数据格式。我们总是可以将json格式的数据,转换成正常的列表/字典,也可以将列表/字典,转换成json。

Response类支持使用json()方法来将数据转为list/dic,所以请求动态网页时,直接把请求到的response对象转换成json数据类型,就可以对其进行与列表/字典一样的操作了。res.json()

  • 简单的练习(自己写的)

爬取QQ音乐中周杰伦的歌

import requests
from bs4 import BeautifulSoup

res=requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=61886235353531642&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=943413047&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')
#上面get的网址是network中,client_search_cp...中Header中URL的网址
js=res.json()  
#使用json()方法将response对象转换为字典/列表
list_m=js['data']['song']['list']
for m in list_m:
    print(m['name'])

 爬取QQ音乐中孙燕姿的前五首歌的歌词

import requests
#----获取歌词----
def get_lyric():
	url='https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&remoteplace=txt.yqq.lyric&searchid=92551292525596106&aggr=0&catZhida=1&lossless=0&sem=1&t=7&p=1&n=5&w=%E5%AD%99%E7%87%95%E5%A7%BF&g_tk=5381&loginUin=943413047&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0'
	res=requests.get(url)
	js=res.json()
	songs=js['data']['lyric']['list']
	for i in songs:
		print(i['content'].replace('\\n ','\n'))
		print('\n')
get_lyric()

 

你可能感兴趣的:(03.爬虫---解析数据与提取数据---Network和json)