本人是一个小说迷,喜欢用电纸书看小说,但苦于难以寻找网络小说的txt版本,加之最近学习了一下怎么用scrapy爬取网页数据,所以想到去使用scrapy框架来爬取笔趣阁小说存为txt文件,在爬取过程中对于并发请求的章节排序是一个难点,本代码采用字典来解决这一问题。废话不多说,直接上思路和代码。

首先看一下小说的网页界面,今天爬取的小说是最近比较火的大奉打更人

首先在终端创建一个scrapy项目

 scrapy startproject dagengren

终端输出:

按照提示在终端输入:

cd dagengren
scrapy genspider quge quge7.com

在pycharm打开这个项目:

首先编辑quge.py这个文件:

import re
import scrapy
import urllibclass QugeSpider(scrapy.Spider):name = 'quge'allowed_domains = ['quge7.com']# start_urls填入爬取的网页链接start_urls = ['https://www.quge7.com/book/1472/']def parse(self, response):items = {}# 'cur'项记录爬取的章节数items['cur'] = 0# 'xpath'提取小说标题items['title'] = response.xpath("//div[@class='info']/h1/text()").extract_first()# 'xpath'提取小说作者items['author'] = response.xpath("//div[@class='small']/span[1]/text()").extract_first()# 'xpath'提取小说目录dd_list = response.xpath('//div[@class="listmain"]/dl/dd')# 'max_page_href'为最后一章的链接max_page = dd_list[-1]max_page_href = max_page.xpath('./a/@href').extract_first()# 因为'max_page_href'得到的链接不完整,如/book/1472/1.html# 通过urlib.parse.urljoin()方法可将链接补全max_page_href = urllib.parse.urljoin('https://www.quge7.com/book/1472/',max_page_href)# 提取最大章节数max_number = int(re.findall(r'https://www.quge7.com/book/1472/(.*?)\.html', max_page_href)[-1])# 生成爬取的网页链接列表url_list = ["https://www.quge7.com/book/1472/"+str(i)+".html" for i in range(1,max_number+1)]# 爬取网页链接列表里面的网页for url in url_list:# 创造请求,交给parse_content处理响应yield scrapy.Request(url,callback=self.parse_content,meta={'items':items})# 在item里面存入章节数items['max_page'] = max_numberdef parse_content(self,response):# 拿出itemsitems = response.meta['items']# 爬取的章节数加一items['cur'] += 1# 'current_page'为当前第几章current_page = int(re.findall(r'https://www.quge7.com/book/1472/(.*?)\.html',response.url)[-1])# 提取章节标题small_title = response.xpath("//span[@class='title']/text()").extract_first()# 提取章节文本texts = response.xpath("//div[@id='chaptercontent']/text()").extract()# 过滤文本texts = [re.sub(r'\u3000\u3000',r'\n',text) for text in texts]# 把文本列表转换成字符串items[current_page] = "".join(texts)# 将章节标题加入到文本中items[current_page] = small_title+'\n'+items[current_page]# 把item传递给piplines处理yield items

这里有一个很巧妙的地方就是将章节数与章节文本做了一个键值对:

items[current_page] = small_title+'\n'+items[current_page]

到时候写入文本的时候就可以依照这个键值对按顺序写入文件中,解决章节排序问题

pipelines.py中的配置

from itemadapter import ItemAdapterclass DagengrenPipeline:def process_item(self, item, spider):# 显示爬取的章节数目print(item['cur'])# 如果爬取的章节数目等于最大章节数,开始将小说写入文件if item['cur']==item['max_page']:with open("novel.txt",'w+') as file_object:try:# 写入小说标题file_object.write(item['title']+'\n')# 写入作者名file_object.write(item['author']+'\n')# 按章节顺序写入小说正文for i in range(1,item['max_page']+1):file_object.write(item[i])except:pass

注意到这段处理代码中只有当爬取的章节数等于最大章节数时,才在文件中写入小说文本,方便在接下来的循环中按顺序写入小说。

settings.py配置:

BOT_NAME = 'dagengren'SPIDER_MODULES = ['dagengren.spiders']
NEWSPIDER_MODULE = 'dagengren.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'# Obey robots.txt rules
ROBOTSTXT_OBEY = True
LOG_LEVEL = 'WARNING'# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
SPIDER_MIDDLEWARES = {'dagengren.middlewares.DagengrenSpiderMiddleware': 543,
}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'dagengren.middlewares.DagengrenDownloaderMiddleware': 543,
#}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'dagengren.pipelines.DagengrenPipeline': 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

爬取速度:

可以看到下载速度已经很快了,这还只是使用了默认的16线程的结果,想要更快的话可以在settings.py里面修改并发数目。

最终成品:

2021年scrapy一分钟内爬取笔趣阁整本小说存为txt|解决章节排序问题相关推荐

  1. python爬取小说写入txt_Python BeautifulSoup 爬取笔趣阁所有的小说

    这是一个练习作品.用python脚本爬取笔趣阁上面的免费小说. 环境:python3 类库:BeautifulSoup 数据源:http://www.biqukan.cc 原理就是伪装正常http请求 ...

  2. Python爬虫(scrapy模块、bs4模块) 爬取笔趣阁全本小说(三级页面)

    今天要做的是一个爬虫小项目,爬取小说网站,那么首先呢先对网站进行分析,这里要想爬取到每部小说的全部章节,需要爬取到三级页面,让我们看看代码实现.(https://m.wanwenhui.com/shu ...

  3. java爬取笔趣阁魔道祖师小说

    @RequestMapping("biquge")@ResponseBodypublic void biquge() throws Exception {int i=1;Strin ...

  4. python3+正则(re)增量爬虫爬取笔趣阁小说( 斗罗大陆IV终极斗罗)

    python3+re 爬虫爬取笔趣阁小说 斗罗大陆IV终极斗罗 爬取前准备 导入的模块 分析 正则的贪婪与非贪婪 附完整代码示例 爬取前准备 导入的模块 import redis #redis数据库 ...

  5. python爬取小说爬取_用python爬取笔趣阁小说

    原标题:用python爬取笔趣阁小说 首先打开笔趣阁网址,链接,搜索自己想要的小说. 在网站内单击右键,点击检查,会出现如下界面! 我们需要的章节信息就在我划的这块, 可以将每个标签点一下,它对应的内 ...

  6. python爬取最新说章节_练习_Python3 爬取笔趣阁最新小说章节

    警告:本文代码仅供学习,禁止违法使用或商用. 这里拿人气小说<黎明之剑>来举个栗子,喜欢小说<黎明之剑>的朋友们请支持正版阅读. 笔趣阁网站上的其他书籍基本上的都可以套用,其他 ...

  7. spider_使用随机User-Agent库, 爬取笔趣阁万古天帝章节目录_(fake_useragent)

    """使用随机User-Agent库,爬取笔趣阁万古天帝章节目录 """ import requestsfrom fake_useragen ...

  8. python爬取笔趣阁小说(附源码)

    python爬取笔趣阁小说 文章目录 python爬取笔趣阁小说 前言 一.获取小说目录结构 获取目录连接 请求代码 解析目录 XPath tqdm 解析 二.获取小说章节结构 请求代码 解析章节 代 ...

  9. 爬取笔趣阁小说网站上的所有小说(二)

    爬取笔趣阁小说网站上的所有小说(二) 网址为:https://www.biqukan.cc/topallvisit/1.html 我们已经拿到了所有小说的地址爬取笔趣阁小说网站上的所有小说(一),现在 ...

最新文章

  1. python编程标准_python编程规范
  2. 2016年第七届蓝桥杯C/C++ B组国赛 —— 第一题:一步之遥
  3. P3768-简单的数学题【莫比乌斯反演,杜教筛】
  4. linux检测硬件驱动,linux查看硬件信息及驱动设备相关整理
  5. 如何避免DevOps变革的六大“焦油坑”
  6. 2.3 指数加权平均
  7. JAVA程序设计第十版第七章_java程序设计第七章答案
  8. Swing组件集合的事件处理(六)
  9. Java加密:一、Base64算法
  10. 移动通信发展史及原理学习
  11. 局域网共享工具_win10一键局域网共享工具使用教程
  12. 关于睡眠分期中人工判读的一些个人总结
  13. 水经注全球离线地图数据3.0即将发布
  14. DCOS快速部署手册
  15. 为省手续费 上淘宝拍“生活费”
  16. 车间ERP管理系统软件哪家好(上)
  17. 数据库函数依赖与候选码求解
  18. 【老码农的技术理想】
  19. office 2016 安装
  20. PTA题目 谁是赢家

热门文章

  1. Matlab气液相界面,MATLAB,气液相平衡程序,求帮忙改一下。
  2. 【tomcat】6、调优
  3. 如何去写一手好SQL ?
  4. 大专学的计算机如何进国企,专科毕业生想进国企?这三大专业不要错过,成功率高达60%...
  5. 存储、计算、分布式知识点思维导图(收集整理适合小白)
  6. javaSE探赜索隐之三--<类与对象的爱恨情仇下>
  7. 学习编程从坚定路线开始
  8. 5g的八大关键指标_5G的七大关键性能指标5G对生活的改变新5G时代的来临身边巨变...
  9. 力扣 1598. 文件夹操作日志搜集器
  10. 最小公倍数C语言怎么算,算法:最大公约数和最小公倍数(C语言表示)