我们从浏览器看小说的时候总是跳出来一些广告影响我们阅读体验,我们为了解决这些不好的体验,可以爬虫获取我们想要阅读的小说
这个教程采用最简单且操作易上手的爬虫方法,适合小白入门,代码易懂
首先下载安装pycharm或者Visual Studio,在这里就不过多介绍安装过程,如果有需要的可以私信
1、准备工作
我使用的是pycharm这款软件,首先在D盘中添加一个文本文档,然后将文件名改成自己想要的名字,把文本文档的后缀.text改为.py文件,改好之后就是这个图标
2、库的安装
在自己的屏幕界面使用Windows+R的快捷键输入cmd的命令按确定进入命令提示符界面
进入命令提示符界面中输入pip install requests 这一步是配置requests库,在获取小说要使用到的
我出现这个是因为我已经安装过了的requests库和lxml库了,如果安装的很慢,可以使用这个命令
pip install -i http://mirrors.aliyun.com/pypi/simple/ requests(这个是安装requests库的)
安装完成之后我们打开浏览器,按照步骤一步一步的操作
点击获取Microsoft Edge扩展
搜索XPath_helper
点击下载安装之后,点开管理扩展
将这个扩展插件打开
接下来就可以打开我们创建的.py文件开始写代码了。
3、代码及流程解读
(1)发送请求
import requests
from lxml import etree
(2)我们要考虑发送发给谁,谁是接收者
ur1 = 'https://www.remxiaos.com/dafengdagengren/32230.html'
其中 'https://www.remxiaos.com/dafengdagengren/32230.html'这个网络地址是打开浏览器,选择你要下载的小说内容,进入小说内容之后鼠标右键点击一下,选择检查(这里我以庆余年为例子)
选择网络,然后点击出现的第一个图标像文本一样的,有一个请求URL 复制这个到代码中
(3)伪装自己,把自己伪装成网站上的请求
while True:
# 伪装自己
headers = { # {相当于词典,headers为变量
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
}
其中
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
这部部分还是在我们的网络获取往下翻会出现一个User-Agent,复制里面的内容,注意 'User-Agent':这个部分一定要带上,不然就会报错
(4)发送请求
这里需要注意的是看看你网站网络请求方式中的是不是get类型的
resp = requests.get(ur1, headers=headers)
resp2 = requests.get(ur1, headers=headers)
(5)设置编码
不设置编码的话,把小说内容写入text中是中文会出现乱码
resp.encoding = 'utf-8'
(6)响应信息
print(resp.text)
e = etree.HTML(resp.text)
info = '\n'.join(e.xpath('//div/p/text()'))
title_elements = e.xpath('//div/h1/text()')
if len(title_elements) > 0:
title = title_elements[0]
else:
title = "No title found"
href_elements = e.xpath("//div/a[3]/@href")
其中 “//div/p/text()”这部分的获取就要用到XPath_helpers插件的扩展了,打开XPath这个插件,ctrl+shift+X的快捷键启用XPath插件(可能会要刷新一下)就会出现这个界面
同时右键单击一下,打开检查,查看元素这一类
其中"//div"网页界面全选
“/p”是选中正文内容
我们这里如果不添加“/text()”的话就会将网络内容写进text中,
要输出标题的时候,我们可以在网络界面标题部分右键点击打开检查就可以看到标题在网页所在的位置了,我们可以看到标题前面有一个<h1就是我们要获取的内容使用“//div/h1/text()”命令
同样,小说我们不可能只看一章,我们需要的是把整部小说下载下来,那就要读取下一章的内容,操作方法是和上面一样的,但是我们上面获取的是文字内容,我们跳转到下一章的时候是网址进入的,所以我们要在后面加入一个@href获取网址
同样的我们在获取小说的时候代码是个死循环,一直在不断的获取下一章内容和写入我们的文本中,那么我们怎么知道它是不是已经获取完了呢,那么我们就直接在目录中点到倒数第二章,把倒数第二章中的下一章网址对它进行if判断,当执行到最后一个网址时就会跳出循环了
if len(href_elements) > 0:
ur1 = f'https://www.remxiaos.com{href_elements[0]}'
else:
ur1 = 'https://www.remxiaos.com/dafengdagengren/default.html'
(7)保存
我们把小说获取了,可以保存到庆余年.text中,不需要我们自己去单独创建一个文本文档了
with open('大奉打更人222.txt', 'a', encoding='utf-8') as f:
f.write(title + '\n\n' + info + '\n\n')
4、源代码展示
好了上面就是操作的流程了,下面把源代码展示给大家
import requests
from lxml import etree
ur1 = 'https://www.remxiaos.com/dafengdagengren/32230.html'
while True:
headers = { # {相当于词典,headers为变量
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
}
resp = requests.get(ur1, headers=headers)
resp2 = requests.get(ur1, headers=headers)
resp.encoding = 'utf-8'
print(resp.text)
e = etree.HTML(resp.text)
info = '\n'.join(e.xpath('//div/p/text()'))
title_elements = e.xpath('//div/h1/text()')
if len(title_elements) > 0:
title = title_elements[0]
else:
title = "No title found"
href_elements = e.xpath("//div/a[3]/@href")
if len(href_elements) > 0:
ur1 = f'https://www.remxiaos.com{href_elements[0]}'
else:
# 此处可根据具体情况处理,例如给 ur1 赋默认值或跳出循环等
ur1 = 'https://www.remxiaos.com/dafengdagengren/default.html'
# 或使用 continue 跳过本次迭代
print(title)
with open('大奉打更人222.txt', 'a', encoding='utf-8') as f:
f.write(title + '\n\n' + info + '\n\n')