找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 9791|回复: 4

[代码与实例] 小说爬虫,按书名自动爬取生成.txt文件

0

主题

7

帖子

7

积分

贫民

积分
7
wussrc 发表于 2018-4-9 14:57:53 | 显示全部楼层 |阅读模式
本帖最后由 wussrc 于 2018-4-9 15:21 编辑

代码环境:
    操作系统:ubuntu 16
    python版本:3.5.2
    适用的爬取网站:笔趣阁
今天上笔趣阁看了看,想找个小说,记得以前好像是有完本txt下载的。但是看了两个好像都没有提供下载,只能在线读了
所以写了个小爬虫。去爬取一下笔趣阁的小说,然后自动按书名生成对应的txt文件。并没有太大的实用价值,毕竟现在流量
便宜了,大家看个在线小说的流量还是有的。
用法:
如图片显示,先在笔趣阁找到一个感兴趣的小说,打开后如图所示,会在当前页面显示小说所有的章节信息。点击对应的链接
跳到指定的章节。
此爬虫原理就是循环获取章节的url地址,拼接读取小说内容,写入文件。
程序接收两个命令行参数,第一个参数为某本小说的url地址。例如截图中的《巅峰文明》的地址为:http://www.biquge.com.tw/19_19001/
则使用命令:python xxx.py http://www.biquge.com.tw/19_19001/ /home/xxx/xiaoshuo/
其中/home/xxx/xiaoshuo/为生成的txt文件保存的目录。此处只写目录即可,文件名默认使用小说名字。
爬取过程如下:
等待全部爬取完毕,打开生成的txt文件即可。
代码如下:
  1. #coding=utf-8

  2. import requests
  3. import sys
  4. import bs4

  5. if len(sys.argv) < 3:
  6.     print("please enter the url, example: python3 test1.py http://xxx.xxx")
  7.     sys.exit()
  8. #某本书的url地址
  9. url = sys.argv[1]
  10. #生成的文件文件保存的位置
  11. directory = sys.argv[2]

  12. print('start spider...')
  13. #基础url地址,用作地址拼接,自动爬取所有章节的小说
  14. baseurl = "http://www.biquge.com.tw"
  15. res = requests.get(url)
  16. res.raise_for_status()
  17. soup = bs4.BeautifulSoup(res.text, 'lxml')
  18. #获取书名
  19. bookname = soup.select('#info > h1')[0].getText()
  20. #解析html结构,dl下边有N个dd,dd中的a标签的href属性保存了对应章节的具体url地址
  21. chapters = soup.select('#list > dl > dd')
  22. print(len(chapters))
  23. for chapter in chapters:
  24.     atag = chapter.select('a')[0]
  25.     chapter_url = atag.get('href')
  26.     #拼接完整的url地址逐个去爬取数据
  27.     full_url = baseurl + chapter_url
  28.     article_res = requests.get(full_url)
  29.     article_soup = bs4.BeautifulSoup(article_res.text, 'lxml')
  30.     #查找小说内容的标签,小说内容存在id为content的div中
  31.     article_content = article_soup.select('#content')[0]
  32.     #查找小说的章节标题
  33.     article_title = article_soup.select('.bookname > h1')[0]
  34.     print('爬取:' + article_title.getText().encode('iso-8859-1').decode('gbk') + ' 的内容中...')
  35.     #以\r\n为标示分割一篇文章,将一章的小说内容分割为一个列表
  36.     lines = article_content.getText().split('\r\n')
  37.     print('爬取章节完成,开始写入文件...')
  38.     myfile = open(directory + "/" + bookname.encode('iso-8859-1').decode('gbk') + ".txt", 'a', encoding='iso-8859-1')
  39.     myfile.write(article_title.getText() + '\n')
  40.     for line in lines:
  41.         myfile.write(line.strip() + '\n')
  42.     myfile.write('\n\n\n')
  43.     print('章节写入文件完毕!')
  44. myfile.close()
复制代码


笔趣阁.jpg
1111.jpg
回复

使用道具 举报

0

主题

5

帖子

5

积分

贫民

积分
5
轲凌 发表于 2018-4-27 13:18:26 | 显示全部楼层
虽然你们说简单,对于我这个零基础还是太高深,先收藏,后期慢慢研究
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

贫民

积分
2
果冻不冻 发表于 2020-9-22 16:36:05 | 显示全部楼层
楼主牛逼666
回复 支持 反对

使用道具 举报

1

主题

2

帖子

2

积分

贫民

积分
2
十方月 发表于 2020-11-10 15:12:46 | 显示全部楼层
感谢楼主,测试了一下。
把编码改为utf-8,网址改为https://www.biquge.com/,并且把书籍网址和保存地址改为用input接收,爬笔趣阁很好用
回复 支持 反对

使用道具 举报

0

主题

15

帖子

15

积分

贫民

积分
15
yang_jm 发表于 2022-5-7 15:28:10 | 显示全部楼层
仔细学习了一下!楼上提到的有道理!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表