目录
前言
一、思路
二、具体步骤
1.找到小说网站
2.爬取小说所有章节的网站地址
3.爬取每个章节的内容
三、总结
最近自学了一点python,小说广告太多,研究了一下,爬取还是相对比较简单的。
找到想看的小说的网站地址→爬取小说所有章节的网站地址→爬取每章小说的标题和内容→把内容保存到TXT文件
百度上有很多小说网站但是有些网站有反爬需要注意。
首先用浏览器打开小说网站,按F12
我们看到章节链接在href里面,找到它的上一级
鼠标移动到上一级标签,左边章节全部高亮,表示这个标签里包含了所有章节的链接,所以我们只要提去这个标签里的所有href 就可以获得所有的章节的网站地址。
右键这个标签,复制,选择复制完整的xpath如下:
/html/body/div[3]/div[2]/div/div/ul
因为章节网站在href里所以加上//@href:
/html/body/div[3]/div[2]/div/div/ul//@href
然后我们就可以开始写代码了需要用到两个库:
#pip install requests,pip install lxml
import requests
from lxml import etree
开始解析网站
import requests
from lxml import etree
url = "https://www.777zw.net/42/42670/"
re= requests.get(url)#访问小说网站
re.encoding="utf-8"#改为utf-8格式,不然可能读取到的是乱码
selector=etree.HTML(re.text)#解析网站,变成HTML格式
urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")
#利用Xpath,读取HTML里的信息,从而获取所以章节的链接 urs就包含了所以的章节链接地址。
打印一下:
['27769200.html', '27769202.html', '27769204.html', '27769206.html', '27769207.html'。。。。。 '31256765.html', '31256766.html']
爬取到的网站是不全的,我们需要在前面加上https://www.777zw.net/42/42670/ 就是url
for i in urs:
urls1=url+i
re1 = requests.get(urls1)#re1章节页面
re1.encoding = "utf-8"
selector1 = etree.HTML(re1.text)
这样我们就爬取到了每个章节网站。
我们先进入第一章小说的网页,发现内容里包含了章节名称我们就不用提取章节名字了,爬取内容就可以使用F12 得到内容的xpath地址
/html/body/div[4]/div/div/div[2]/div[2]
需要得到里面的内容就是
/html/body/div[4]/div/div/div[2]/div[2]//text()
//text()是得到该节点下所有的文本,/text()是得到当前节点的文本
内容=selector1.xpath("/html/body/div[4]/div/div/div[2]/div[2]//text()")
获取到的内容是一个列表形式所以我们还要优化下
neir = ""
for x in 内容:
neir = neir + str(x) + "\n"
这样就在每句话后面加了一个换行符。
with open("重生后,我娇养了反派镇北王.txt","a",encoding="utf-8") as f:
f.write(neir)
最后写入txt就可以了
#with open("打开一个txt,没有就创建一个",a是追加写入,utf-8是写入文件格式) as f是该txt文件简称。
完整代码:
import requests
from lxml import etree
url = "https://www.777zw.net/42/42670/"
re= requests.get(url)
re.encoding="utf-8"#re书名页
selector=etree.HTML(re.text)#分析网站,变成HTML格式
urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")#获取所以章节的链接
for i in urs:
urls1=url+i
re1 = requests.get(urls1)#re1章节页面
re1.encoding = "utf-8"
selector1 = etree.HTML(re1.text)
内容=selector1.xpath("/html/body/div[4]/div/div/div[2]/div[2]//text()")
neir = ""
for x in 内容:
neir = neir + str(x) + "\n"
with open("重生后,我娇养了反派镇北王.txt","a",encoding="utf-8") as f:
f.write(neir)
代码优化:
#pip install requests,pip install lxml
import requests
from lxml import etree
url = "https://www.777zw.net/42/42670/"
re= requests.get(url)
re.encoding="utf-8"#re书名页
selector=etree.HTML(re.text)#分析网站,变成HTML格式
urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")#获取所以章节的链接
shum=selector.xpath("/html/body/div[3]/div[1]/div/div/div[2]/div[1]/h1/text()")[0]#获取书名,因为得到是列表所以要【0】
Y=0
print(f"{shum}开始下载,共{len(urs)}章")
for i in urs:
urls1=url+i
re1 = requests.get(urls1)#re1章节页面
re1.encoding = "utf-8"
selector1 = etree.HTML(re1.text)
内容=selector1.xpath("/html/body/div[4]/div/div/div[2]/div[2]//text()")
neir=""
for x in 内容:
neir=neir+str(x)+"\n"
with open(shum+".txt","a",encoding="utf-8") as f:
f.write(neir)
Y = Y + 1
print(f"第{Y}章下载完成")
if Y==10:#下载第10章后退出程序
exit()
目前代码下载速度比较慢慢,后续还可以添加多线程运行2000章只需要1分钟左右就可下载完成。
有一些网站有反爬虫,无法爬取。
欢迎指正和提问。