初学者-Python 网页爬取小说

目录

前言

一、思路

二、具体步骤

1.找到小说网站

2.爬取小说所有章节的网站地址

3.爬取每个章节的内容

三、总结


前言

最近自学了一点python,小说广告太多,研究了一下,爬取还是相对比较简单的。


一、思路

找到想看的小说的网站地址→爬取小说所有章节的网站地址→爬取每章小说的标题和内容→把内容保存到TXT文件

二、具体步骤

1.找到小说网站

百度上有很多小说网站但是有些网站有反爬需要注意。

2.爬取小说所有章节的网站地址

首先用浏览器打开小说网站,按F12

 初学者-Python 网页爬取小说_第1张图片

我们看到章节链接在href里面,找到它的上一级

初学者-Python 网页爬取小说_第2张图片

鼠标移动到上一级标签,左边章节全部高亮,表示这个标签里包含了所有章节的链接,所以我们只要提去这个标签里的所有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)

这样我们就爬取到了每个章节网站。

3.爬取每个章节的内容

初学者-Python 网页爬取小说_第3张图片

我们先进入第一章小说的网页,发现内容里包含了章节名称我们就不用提取章节名字了,爬取内容就可以使用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分钟左右就可下载完成。

有一些网站有反爬虫,无法爬取。

欢迎指正和提问。

你可能感兴趣的:(Python,python,爬虫)