《重生之我是爬虫高手》

​ 我缓缓睁开双眼,有些茫然地看着周围的一切。陈旧的课桌椅,熟悉的教室布置,还有讲台上正在授课的老师……我竟然重生了!回到了高中时代。

还没等我从震惊中缓过神来,身旁传来了一阵轻柔的声音。“喂,你睡醒啦?”我转过头,只见曾经的校花女神同桌正一脸苦恼地看着我。

她嘟着嘴说道:“我最近想看一篇小说,但是这篇小说需要 VIP 才能看,好烦呀。”看着她那无奈的表情,我心中一动。

突然回想起我大学时期所学的爬虫知识。我微笑着对她说:“别担心,我有办法。”

女神的眼睛一下子亮了起来,兴奋地说道:“真的吗?那太好了!”

我肯定地点点头:“那当然,包在我身上!”

放学回家后,我便为了女神就此开始了爬虫工作。

一、找到小说网站

​ 确定需要爬取小说的目标网站(本文以塔读文学为例)

1

​ 确定需要爬取的目标小说

2

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

3

二、获取小说页面并锁定局部文本HTTP请求

​ 点击左上角刷新页面我们发现文本刷新并监视到了一个XHR请求

4

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

5

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

6

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

7

​ 在编译软件中 编写URL代码 并 设置请求头(应对反爬机制)

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = (f'https://www.tadu.com/getPartContentByCodeTable/822527/{1}') #请求URL码

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}') #请求URL码

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) #将获取到的内容转换为json格式

text = text['data']['content'] #找到文本在字典中的位置

html = etree.HTML(text) #使用 lxml 库中的 HTML 类将文本内容转换为 HTML 格式

texts = html.xpath('//p/text()') #使用 xpath 表达式选取 HTML 中所有 <p> 元素的文本内容,并存储在 texts 变量中

四、处理小说章节

​ 识别小说的章节结构,获取每一章节的链接或内容。

​ 通过对比第一步中的第一页和第二页小说的XHR请求可发现换页的请求由最后一个数字控制

8

9

​ 我们可以通过设置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}') #请求URL码

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) #将获取到的内容转换为json格式

text = text['data']['content'] #找到文本在字典中的位置

html = etree.HTML(text) #使用 lxml 库中的 HTML 类将文本内容转换为 HTML 格式

texts = html.xpath('//p/text()') #使用 xpath 表达式选取 HTML 中所有 <p> 元素的文本内容,并存储在 texts 变量中

五、应对反爬机制

​ 为避免被网站的反爬机制限制,采取相应的措施,如使用代理服务器、设置请求头(前文有提到)等。

六、存储小说数据

​ 将爬取到的小说数据存储到合适的介质中,如文本文件、数据库等。

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}') #请求URL码

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) #将获取到的内容转换为json格式

text = text['data']['content'] #找到文本在字典中的位置

html = etree.HTML(text) #使用 lxml 库中的 HTML 类将文本内容转换为 HTML 格式

texts = html.xpath('//p/text()') #使用 xpath 表达式选取 HTML 中所有 <p> 元素的文本内容,并存储在 texts 变量中

for i in texts :

with open('./塔读文章.text','a',encoding='UTF-8') as fp :

fp.write(f'{i}\n')

七、测试程序

​ 运行程序发现文件夹中创建了一个塔读文章.text文件,查看内容与网页小说文章一致

10

结尾

​ 经过一番努力后,我成功地爬取到了女神想看的小说,并精心地打印装订成册。当我把这份特别的礼物递给女神时,她的眼中闪烁着惊喜和感激,对我满是崇拜和认可。

从那以后,女神对我越发关注和亲近,我们一起分享着阅读的快乐,彼此的关系也变得更加深厚。而我也因为这次的经历,在学校里逐渐声名鹊起,成为了众人瞩目的焦点。

我在女神崇拜的目光下,自信满满地走向了人生的巅峰,无论是学习还是生活,都充满了无限的可能和精彩。