《重生之我是爬虫高手》
我缓缓睁开双眼,有些茫然地看着周围的一切。陈旧的课桌椅,熟悉的教室布置,还有讲台上正在授课的老师……我竟然重生了!回到了高中时代。
还没等我从震惊中缓过神来,身旁传来了一阵轻柔的声音。“喂,你睡醒啦?”我转过头,只见曾经的校花女神同桌正一脸苦恼地看着我。
她嘟着嘴说道:“我最近想看一篇小说,但是这篇小说需要 VIP 才能看,好烦呀。”看着她那无奈的表情,我心中一动。
突然回想起我大学时期所学的爬虫知识。我微笑着对她说:“别担心,我有办法。”
女神的眼睛一下子亮了起来,兴奋地说道:“真的吗?那太好了!”
我肯定地点点头:“那当然,包在我身上!”
放学回家后,我便为了女神就此开始了爬虫工作。
一、找到小说网站
确定需要爬取小说的目标网站(本文以塔读文学为例)

确定需要爬取的目标小说

在小说页面按F12打开浏览器的开发者工具选择监视网络中的XHR请求

二、获取小说页面并锁定局部文本HTTP请求
点击左上角刷新页面我们发现文本刷新并监视到了一个XHR请求

点击下一章换页后我们发现文本刷新后监视到了新的XHR请求

通过查看这两个XHR请求的响应内容可发现该XHR请求给我们返回的正是我们需要的目标文章文本内容

通过使用Python的request库,发送该XHR标头的URL请求并获取小说本文的响应。

在编译软件中 编写URL代码 并 设置请求头(应对反爬机制)
1 2 3 4 5 6 7 8 9 10 11 12
| import requests
url = (f'https://www.tadu.com/getPartContentByCodeTable/822527/{1}')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
text = requests.get(url=url,headers=headers).text
|
三、解析小说内容
利用合适的库解析小说页面的结构,提取出小说的相关信息。
1.观察请求方法为: GET
2.观察文本类型为: json
3.观察响应数据中文本在HTML中的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import requests import json from lxml import etree
url = (f'https://www.tadu.com/getPartContentByCodeTable/822527/{1}')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
text = requests.get(url=url,headers=headers).text
text = json.loads(text)
text = text['data']['content']
html = etree.HTML(text)
texts = html.xpath('//p/text()')
|
四、处理小说章节
识别小说的章节结构,获取每一章节的链接或内容。
通过对比第一步中的第一页和第二页小说的XHR请求可发现换页的请求由最后一个数字控制


我们可以通过设置for循环实现爬取的换页操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import requests import json from lxml import etree
for i in range (1,100):
url = (f'https://www.tadu.com/getPartContentByCodeTable/822527/{1}')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
text = requests.get(url=url,headers=headers).text
text = json.loads(text)
text = text['data']['content']
html = etree.HTML(text)
texts = html.xpath('//p/text()')
|
五、应对反爬机制
为避免被网站的反爬机制限制,采取相应的措施,如使用代理服务器、设置请求头(前文有提到)等。
六、存储小说数据
将爬取到的小说数据存储到合适的介质中,如文本文件、数据库等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import requests import json from lxml import etree
for i in range (1,100):
url = (f'https://www.tadu.com/getPartContentByCodeTable/822527/{1}')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
text = requests.get(url=url,headers=headers).text
text = json.loads(text)
text = text['data']['content']
html = etree.HTML(text)
texts = html.xpath('//p/text()')
for i in texts :
with open('./塔读文章.text','a',encoding='UTF-8') as fp :
fp.write(f'{i}\n')
|
七、测试程序
运行程序发现文件夹中创建了一个塔读文章.text文件,查看内容与网页小说文章一致

结尾
经过一番努力后,我成功地爬取到了女神想看的小说,并精心地打印装订成册。当我把这份特别的礼物递给女神时,她的眼中闪烁着惊喜和感激,对我满是崇拜和认可。
从那以后,女神对我越发关注和亲近,我们一起分享着阅读的快乐,彼此的关系也变得更加深厚。而我也因为这次的经历,在学校里逐渐声名鹊起,成为了众人瞩目的焦点。
我在女神崇拜的目光下,自信满满地走向了人生的巅峰,无论是学习还是生活,都充满了无限的可能和精彩。