前期回顾
Python爬虫学习之requests
Python爬虫学习之数据提取(XPath)
Python爬虫学习之数据提取(Beautiful Soup)
Python爬虫学习实战
概述
Ajax全称是Asynchronous JavaScript and XML,即异步的JavaScript和XML。它不是一门编程语言,而是利用JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页内容的技术。
案例分析
这里以某小说网站为例。如下图所示。
在看小说的时候,我们可以看到右侧菜单栏有目录选项,点击可以查看目录。但是当我们直接请求这个网址的时候,并没有获取到目录。代码如下:
import requests
url = 'https://www.qidian.com/chapter/1036370336/745977561/'
response = requests.get(url)
print(response.text.find("第十章"))
-1
从结果可以看到,我们并没有找到第十章这个字符串,而这本小说实际的章节数远远大于10章。那么为什么没有获取到目录呢?
这是因为目录的加载使用的是Ajax技术。我们打开开发者模式,重新刷新界面。
因为Ajax是一种特殊请求,叫做xhr,所以我们可以先通过点击图片中标记1的位置来过滤请求。之后我们按下ctrl+F
,打开图中右侧部分,并输入第十一章
进行搜索。发现没有搜索到数据,说明网页没有加载这个数据。接下来,我们点击目录按钮。
可以明显的看到,请求列表里面多了一个请求,并且再次搜索以后,出现包含条件的搜索结果。这个请求就是Ajax请求,也是我们将要通过requests请求的目标。
数据获取
分析完成以后,就可以开始爬取了。
url = 'https://www.qidian.com/ajax/book/category?_csrfToken=9bsOyqItQXVZO4oGUp0oRJskhsEkkOZV9MUUd50T&bookId=1036370336'
response = requests.get(url)
response.encoding = 'utf-8'
print(response.json())
# 部分数据
{'data': {'isPublication': 0, 'salesMode': 1, 'vs': [{'vId': 107643583, 'cCnt': 1, 'vS': 0, 'isD': 0, 'vN': '作品相关', 'cs': [{'uuid': 1, 'cN': '欢迎收藏', 'uT': '2023-02-24 13:46:46', 'cnt': 30, 'cU': 'y6QZ6vcuJnJH9vdK3C5yvw2/Yi7vb4yRHUHwrjbX3WA1AA2', 'id': 745302300, 'sS': 1}], 'wC': 30, 'hS': False}, {'vId': 107643584, 'cCnt': 76, 'vS': 0, 'isD': 0, 'vN': '第一部 梦魇', 'cs': [{'uuid': 2, 'cN': '第一章 外乡人', 'uT': '2023-03-04 12:28:00', 'cnt': 3345, 'cU': 'y6QZ6vcuJnJH9vdK3C5yvw2/biHV5QU8iX5Ms5iq0oQwLQ2', 'id': 745977561, 'sS': 1}, {'uuid': 3, 'cN': '第二章 “恶作剧”', 'uT': '2023-03-04 19:00:00', 'cnt': 3333, 'cU': 'y6QZ6vcuJnJH9vdK3C5yvw2/YRUaomAc9jpOBDFlr9quQA2', 'id': 745977837, 'sS': 1}.......
这里需要注意把response的编码设置为utf-8
,要不然会出现中文乱码。
总结
本次爬虫学习了Ajax分析与爬取的基本流程,对于python爬取有了更深的理解。最后附上完整的代码链接。
本章代码