当前位置:   article > 正文

初学者-Python 网页爬取小说_python爬取小说

python爬取小说

目录

前言

一、思路

二、具体步骤

1.找到小说网站

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

3.爬取每个章节的内容

三、总结


前言

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


一、思路

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

二、具体步骤

1.找到小说网站

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

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

首先用浏览器打开小说网站,按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

然后我们就可以开始写代码了需要用到两个库:

  1. #pip install requests,pip install lxml
  2. import requests
  3. from lxml import etree

开始解析网站 

  1. import requests
  2. from lxml import etree
  3. url = "https://www.777zw.net/42/42670/"
  4. re= requests.get(url)#访问小说网站
  5. re.encoding="utf-8"#改为utf-8格式,不然可能读取到的是乱码
  6. selector=etree.HTML(re.text)#解析网站,变成HTML格式
  7. urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")
  8. #利用Xpath,读取HTML里的信息,从而获取所以章节的链接 urs就包含了所以的章节链接地址。

打印一下:

['27769200.html', '27769202.html', '27769204.html', '27769206.html', '27769207.html'。。。。。 '31256765.html', '31256766.html']

爬取到的网站是不全的,我们需要在前面加上https://www.777zw.net/42/42670/ 就是url

  1. for i in urs:
  2. urls1=url+i
  3. re1 = requests.get(urls1)#re1章节页面
  4. re1.encoding = "utf-8"
  5. selector1 = etree.HTML(re1.text)

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

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()")

获取到的内容是一个列表形式所以我们还要优化下

  1. neir = ""
  2. for x in 内容:
  3. neir = neir + str(x) + "\n"

这样就在每句话后面加了一个换行符。

  1. with open("重生后,我娇养了反派镇北王.txt","a",encoding="utf-8") as f:
  2. f.write(neir)

最后写入txt就可以了

#with open("打开一个txt,没有就创建一个",a是追加写入,utf-8是写入文件格式) as f是该txt文件简称。

完整代码:

  1. import requests
  2. from lxml import etree
  3. url = "https://www.777zw.net/42/42670/"
  4. re= requests.get(url)
  5. re.encoding="utf-8"#re书名页
  6. selector=etree.HTML(re.text)#分析网站,变成HTML格式
  7. urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")#获取所以章节的链接
  8. for i in urs:
  9. urls1=url+i
  10. re1 = requests.get(urls1)#re1章节页面
  11. re1.encoding = "utf-8"
  12. selector1 = etree.HTML(re1.text)
  13. 内容=selector1.xpath("/html/body/div[4]/div/div/div[2]/div[2]//text()")
  14. neir = ""
  15. for x in 内容:
  16. neir = neir + str(x) + "\n"
  17. with open("重生后,我娇养了反派镇北王.txt","a",encoding="utf-8") as f:
  18. f.write(neir)

三、总结

代码优化:

  1. #pip install requests,pip install lxml
  2. import requests
  3. from lxml import etree
  4. url = "https://www.777zw.net/42/42670/"
  5. re= requests.get(url)
  6. re.encoding="utf-8"#re书名页
  7. selector=etree.HTML(re.text)#分析网站,变成HTML格式
  8. urs=selector.xpath("/html/body/div[3]/div[2]/div/div/ul//@href")#获取所以章节的链接
  9. shum=selector.xpath("/html/body/div[3]/div[1]/div/div/div[2]/div[1]/h1/text()")[0]#获取书名,因为得到是列表所以要【0】
  10. Y=0
  11. print(f"{shum}开始下载,共{len(urs)}章")
  12. for i in urs:
  13. urls1=url+i
  14. re1 = requests.get(urls1)#re1章节页面
  15. re1.encoding = "utf-8"
  16. selector1 = etree.HTML(re1.text)
  17. 内容=selector1.xpath("/html/body/div[4]/div/div/div[2]/div[2]//text()")
  18. neir=""
  19. for x in 内容:
  20. neir=neir+str(x)+"\n"
  21. with open(shum+".txt","a",encoding="utf-8") as f:
  22. f.write(neir)
  23. Y = Y + 1
  24. print(f"第{Y}章下载完成")
  25. if Y==10:#下载第10章后退出程序
  26. exit()

目前代码下载速度比较慢慢,后续还可以添加多线程运行2000章只需要1分钟左右就可下载完成。

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

欢迎指正和提问。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/792296
推荐阅读
相关标签
  

闽ICP备14008679号