1. 利用API爬取数据
有时,使用BeautifulSoup解析和提取数据后,输出结果为空。这是由于网页使用了另一种加载数据的方式——通过API加载数据。API(Application Programming Interface)即应用程序编程接口,也就是网页和服务器交互的途径。
1) Network
开发者工具中的Network记录的是从打开工具到网页加载完毕之间的所有请求。其中,以All开头的一行是请求类型过滤器,可以展示对应类型的请求。爬虫中常用的有All、XHR、Img和Media。
2) XHR
XHR全称XMLHttpRequest,是浏览器内置的对象,使得JavaScript可以发送HTTP请求。
爬取需要的数据时,首先要在XHR的Name栏中找到数据所在的位置(可通过请求名称和数据大小判断),找到目标后点击这条请求,在Preview中查看数据,即可确认。数据有很多,需要按名称逐层展开。
接下来,点击Headers里的General就可以看到API的链接(即Request URL),这就是获取数据的真正链接。但这个链接一般又长又乱,这时可以用requests.get()方法的params参数,以字典的形式传递链接的查询字符串参数,使代码看上去更加简洁明了。利用Convert HTTP Query String to JSON网站,将网址问号后的参数粘贴到input框中,即可得到转换后的字典形式的参数。
例如,爬取QQ音乐《等你下课》的评论,可以将代码写为:
import requests
headers = {
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
params = {
'g_tk': '5381',
'loginUin': '0',
'hostUin': '0',
'format': 'json',
'inCharset': 'utf8',
'outCharset': 'GB2312',
'notice': '0',
'platform': 'yqq.json',
'needNewCode': '0',
'cid': '205360772',
'reqtype': '2',
'biztype': '1',
'topid': '212877900',
'cmd': '8',
'needmusiccrit': '0',
'pagenum': '0',
'pagesize': '25',
'lasthotcommentid': '',
'domain': 'qq.com',
'ct': '24',
'cv': '10101010'
}
res = requests.get('https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg', headers=headers, params=params)
print(res.text)
用res.text获取到的数据是字符串形式的,而如果是字典或列表的话&#