网络爬虫笔记—Ajax数据抓取
有时我们向某一网站发起请求时,会发现该网站返回的内容和网页中显示的不一样。即在网页中可以正常显示,但通过网络爬虫技术,却不可以获取网页上显示的内容。这时网页可能不是静态网页,而是运用Ajax进行渲染的网页。下面以原书作者的微博内容抓取为例:
正常情况下通过向上述图片中的URL地址(https://www.weibo.com/2830678474) ,发起请求,便可以获取微博的第一条内容。下面来看一下实际运行情况。
import requests
url = 'https://www.weibo.com/2830678474'#w微博的URL地址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.26',
}#设置请求头
response = requests.get(url, headers=headers)#发起请求
print(response.text)#返回的请求内容
由于返回内容较多,这里就不展示出来,大家可以实际运行看一下,在返回内容里面是没有“寄了啊”这些内容信息的。
这是因为微博的内容是动态加载的,而且使用的是Ajax请求。这时浏览网页的URL地址并不是实际地址,接下来就变成了如何查找正确URL地址的问题。针对URL地址的查找,可以通过下面的方法来查找。
目标URL地址的查找方法
方法1:
首先,打开上述网页,在网页空白处单击右键,然后选择【检查】调出开发者工具;之后按照下图的步骤进行操作:
点击进去后,可以看到该链接的标头等信息。
方法2:
通过上面的步骤就可以找到微博内容正确的URL地址,然后向该地址发送请求,便可以正常获取内容了。下面看一下实际运行结果。
import requests
url="https://www.weibo.com/ajax/statuses/mymblog?uid=2830678474&page=1&feature=0"#ajax的正确请求地址
headers = {
"authority":"www.weibo.com",#网页端的authority字段前面有一个:号(:authority),实际运行中需要去掉该:号
"method":"GET",
"path":"/ajax/statuses/mymblog?uid=2830678474&page=1&feature=0",
"scheme": "https",
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"client-version": "v2.36.14",
"cookie": "UOR=www.baidu.com...",
"referer": "https://www.weibo.com/2830678474",
"sec-ch-ua": "'Microsoft Edge';v='107', 'Chromium';v='107', 'Not=A?Brand';v='24'",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "Windows",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"server-version": "v2022.11.03.1",
"traceparent": "00-3510f55fc64c53dde7b5e0d1e638ffe9-8af10fec367ec4c6-00",
"user-agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35",
"x-requested-with": "XMLHttpRequest",
"x-xsrf-token": "hvhCFVwWluphipcsxJqBPYsK"
}#请求头,最好将网页全部请求头复制进来,提高爬取成功率。
response = requests.get(url, headers=headers)
print(response.json())#返回的内容为json格式,所以可以用json方法进行解析
由于返回内容较多,这里也不进行展示了。
关于请求头的设置:
设置请求头时,最好将URL的请求头的全部内容粘贴到headers中,这样抓取的成功率会更高。上述代码中cookie字段进行了简写,大家在实际抓取过程中,可以替换成自己的cookie。网页请求头的查看方法如下图:
- 本文,主要根据崔庆才的《Python3网络爬虫开发实战》文章,编写的学习笔记。目前该文章的内容已在github上公开。点击此处查看公开内容。
- 另,本篇笔记首先在微信公众号“宏蜘蛛”上发布,链接为:网络爬虫笔记—Ajax数据抓取
参考资料: