为什么单独学习爬取ajax数据:
问题:requests抓取的页面信息和浏览器中看到的不一样。
原因:requests获取的都是原始的HTML文档,浏览器中的页面很多都是经过javascript数据处理后的结果,这些数据可能通过AJax加载的,也可能是通过其他特定算法计算得到的
解决:对于通过Ajax加载的,叫异步加载,这种可以在web开发上做到前后端分离,降低服务器直接渲染页面带来的压力,如果遇到requests无法获取有效数据,需要进一步分析网页后台向接口发送的Ajax请求,然后用requests来模拟Ajax请求,就可以成功获取了
1.Ajax
1.1 什么是ajax
Ajax,全称为 Asynchronous JavaScript and XML,即异步的 JavaScript 和 XML。是利用 JavaScript 在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
实例:页面刷新后加载
1.2 基本原理
1)发送请求
新建了 XMLHttpRequest 对象,然后调用了onreadystatechange 属性设置了监听,然后调用 open() 和 send() 方法向服务器发送了一个请求,得到服务器返回响应,并解析
2)解析内容
得到响应之后,onreadystatechange 属性对应的方法便会被触发,此时利用 xmlhttp 的 responseText 属性便可以取到响应的内容。HTML或者Json
3)渲染网页
解析完响应内容之后,就可以调用 JavaScript 来针对解析完的内容对网页进行下一步的处理了。
DOM操作原理,即需要知道请求如何发送、发往哪里,发了哪些参数
1.3 分析处理
1)查看请求
访问地址:http://news.baidu.com/
例如打开百度新闻页面,F12进入检查模式
2)过滤请求
前面也提到过,这里其实就是在页面加载过程中浏览器与服务器之间发送请求和接收响应的所有记录。Ajax其实有其特殊的请求类型,它叫作xhr。在上图中,用鼠标点击这个请求,可以查看这个请求的详细信息,如下图所示。
3)例如文本信息“豪横!中学食堂买千只螃蟹免费吃,老师这句话亮了”,在页面展示,但是在源代码中不存在,
源代码:
4)查看请求
1.4 爬虫代码实现
url = "http://news.baidu.com/widget?id=LocalNews&ajax=json&t=1604537107370"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"authority": "ie.icoa.cn"}
res = requests.get(url)
res.encoding = "utf8"
print(res.json())
"""
{
'errno': 0,
'request_id': '2990659530',
'timestamp': 1604537390,
'data': {
'LocalNews': {
'errno': 0,
'data': {
'cityid': 8206,
'name': '西安',
'rows': {
'pic': {
'url': 'http://baijiahao.baidu.com/s?id=1682417291653208838',
'title': '豪横!中学食堂买千只螃蟹免费吃,老师这句话亮了...',
'time': '16:24',
'imgUrl': 'https://t11.baidu.com/it/u=1938383728,2162410531&fm=173&app=49&f=JPEG?w=312&h=208&s=67501B891A0374D69E2C858A0300F097'
},...
"""
注意:观察翻页规律