追书神器(一)—Scrapy入门
前言
看小说是我这么多年来一直保持的习惯。《盘龙》、《斗破苍穹》、《仙逆》、《凡人修仙传》等等,陪伴了我整个学生时代。最近发现iOS上小说类app体验都不好,经常出现广告弹出、更新不及时、强制分享等情况。于是在一个下雨的晚上,我决定不再忍受这些app,自己强撸一个追书爬虫。
Scrapy介绍
Scrapy是python主流爬虫框架,可以很方便的通过url抓取web信息,同时与传统的requests库相比,提供了更多的工具和更高的并发。推荐从官方学习网站上学习。
不过,你一点scrapy资料都不知道也没有关系,读完本文一样能撸出来
Scrapy实战
在开始前,我们需要准备好以下几个东西:
- 想要爬取的小说url
- 环境搭建
- 入门级的python语法
选取网站
这里我选的是 m.book9.net/。 选这个网站是因为它有是三个优点
- 更新速度比较快 (服务稳定)
- 页面的结构简单 (易于解析)
- 没有做一些防爬虫的保护 (操作简单)
接下来,找到追更小说的主页。
比如 辰东的《圣墟》
假设现在我们要追更的话,需要每次打开这个网站,然后点击最新章节的第一个选项条,链接到具体的小说章节。
仿造以上的步骤,我画出了这样一个流程:
所以接下来,我们只需要根据这些流程来转化成我们的代码就好了
搭建工程
我们将要搭建一个Scrapy壳工程,在这之前要先确保自己安装了python的环境。框架自身兼容2、3版本,所以不需要担心版本的差异。
我本地的环境是python3,所以可能会和2有细微的差异操作。
1.安装Scrapy
> pip3 install scrapy
复制代码
2.创建爬虫工程,将其命名为NovelCrawler
> scrapy startproject NovelCrawler
复制代码
3. 创建一个基于 url 的爬虫服务
> scrapy genspider novel m.book9.net
复制代码
以上就是基本的工程创建过程,执行完毕之后就可以使用
> scrapy crawl novel
复制代码
命令去开启爬虫服务。不过当前我们的爬虫还没有实现任何的规则,所以即使执行了命令也不会做任何事,所以我们需要在工程中添加一些爬虫规则。
爬虫编写
接下来我们用Pycharm来打开刚刚创建好的工程。
scrapy的所有爬虫服务都集中在spiders目录下,我们也在这里添爬虫文件novel.py
请求小说主页
我们打开文件,添加一些基础的配置
# encoding:utf-8import scrapyclass NovelSpider(scrapy.Spider):#配置服务名称,与上文创建服务的名称相同name = 'novel' #允许访问的域,与上文创建服务的名称相同allowed_domains = ['m.book9.net'] #发起请求的url,《圣墟》小说主页start_urls = ['https://m.book9.net/wapbook/10.html'] #默认的请求成功的回调函数def parse(self, response): pass复制代码
上面的代码中,parse函数的入参数response对象里面有什么参数对我们来说是未知的,这也是初学python很头疼的地方。这里给大家提供一个方法:用Pycharm的debug功能查看参数
从上图中我们可以发现,response包含了请求的html信息。因此我们只需要其稍加处理,截取出我们需要的部分。
获取最新章节url
那么如何解析我们需要的节点呢,response给我们提供了 xpath方法,我们只需要输入的xpath规则就可以定位到相应html标签节点。
不会xpath语法没关系,Chrome给我们提供了一键获取xpath地址的方法(右键->检查->copy->copy xpath),如下图:
通过xpath,我们可以从这个页面获取到最新章节的地址
# encoding:utf-8import scrapyclass NovelSpider(scrapy.Spider):name = 'novel'allowed_domains = ['m.book9.net']start_urls = ['https://m.book9.net/wapbook/10.html']def parse(self, response):#指定的<a>标签的跳转链接context = response.xpath('/html/body/div[3]/div[2]/p[1]/a/@href') #提取数组的第一个结果 即最新章节的urlurl = context.extract_first() print(url) pass复制代码
请求章节信息
有了链接之后,我们就可以跳转到下一个页面。而response也提供了follow方法,便于我们在站内进行短链的跳转。
# encoding:utf-8import scrapyclass NovelSpider(scrapy.Spider):name = 'novel'allowed_domains = ['m.book9.net']start_urls = ['https://m.book9.net/wapbook/10.html']def parse(self, response):context = response.xpath('/html/body/div[3]/div[2]/p[1]/a/@href') url = context.extract_first()#获取短链后继续请求,并将结果返回指定的回调yield response.follow(url=url, callback=self.parse_article)#自定义回调方法def parse_article(self,response): #这里的response 就是我们具体的文章页print(response)pass复制代码
(如对代码中关键字yield感到疑惑的请点击传送门)
有了文章的页面,我们只需要对他的html进行解析。这部分内容过于面向细节。只适用于这个网站,因此我不过多进行赘述。附上注释代码:
# encoding:utf-8
import reimport os
import scrapyclass NovelSpider(scrapy.Spider):name = 'novel'allowed_domains = ['m.book9.net']start_urls = ['https://m.book9.net/wapbook/10.html']def parse(self, response):# 指定的<a>标签的跳转链接context = response.xpath('/html/body/div[3]/div[2]/p[1]/a/@href') #获取短链后继续请求,并将结果返回指定的回调url = context.extract_first() yield response.follow(url=url, callback=self.parse_article) def parse_article(self, response):#获取文章的标题title = self.generate_title(response) #构建文章的htmlhtml = self.build_article_html(title, response) #将章节html存至本地self.save_file(title + ".html", html)#用自带的浏览器打开本地htmlos.system("open " + title.replace(" ", "\ ") + ".html") pass @staticmethoddef build_article_html(title, response):#获取文章内容context = response.xpath('//*[@id="chaptercontent"]').extract_first()#过略文章中<a> 标签跳转内容re_c = re.compile('<\s*a[^>]*>[^<]*<\s*/\s*a\s*>')article = re_c.sub("", context) #拼接文章htmlhtml = '<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><div align="center" style="width:100%;text-alight:center"><b><font size="5">' \+ title + '</font></b></div>' + article + "</html>" return html @staticmethoddef generate_title(response):title = response.xpath('//*[@id="read"]/div[1]/text()').extract()return "".join(title).strip() @staticmethoddef save_file(file_name, context):fh = open(file_name, 'wb')fh.write(context.encode(encoding="utf-8"))fh.close()pass
复制代码
现在我们可在再当前目录下运行以下命令:
> scrapy crawl novel
复制代码
展示视频
思考
整体写完下来,发现很难做到一份代码适用于多个站点。因此遇到在多站点抓取的需求时,为每个站点建立一个爬虫文件会更为适合。
源码地址(听说年底点了star的年终会加倍哦)
追书神器(一)—Scrapy入门相关推荐
- React+Redux仿Web追书神器
引言 由于 10 月份做的 React Native 项目没有使用到 Redux 等库,写了一段时间想深入学习 React,有个想法想做个 demo 练手下,那时候其实还没想好要做哪一个类型的,也看了 ...
- 追书神器 三星s8+ 语音朗读锁屏后中断问题解决办法
1. 综述: 本人喜欢用追书神器听书, 使用的免费版,遇到问题是: 使用追书神器语音朗读, 屏幕亮着时没问题,锁屏也没问题,但是屏幕暗下后隔段时间,语音就停了, 按亮屏幕,不用解锁朗读声又响起了,为了 ...
- 看书软件哪个好?看连载神器、追书神器、笔趣阁的评测就知道了
看书软件哪个好?看连载神器.追书神器.笔趣阁的评测就知道了你还在为不能在手机上免费看小说而烦恼吗? 你还在为搜索不到你想要看的小说而郁闷吗? 那么今天你就享福了! 今天为大家分享3个可以免费观看小说的 ...
- 安卓打包工具_【安卓+ios】追书神器爱阅书香182个书源配置更新~~
回复公众号后台留言, 很多大兄弟要求推荐看小说的软件. 既然需求,那就满足你们 182个书源已经打包好. iOS端 iOS端的爱阅书香很久前就推荐过. 一个完全免费的小说阅读器,完全免费,自定义导入书 ...
- Android小说阅读器,追书神器API接口
追书神器API接口 注:(所有的接口都是Get请求) 所有地址前要加上 api.zhuishushenqi.com 1. 获取所有分类 类型 值 接口地址 /cats/lv2/statistics ...
- 安卓追书神器1.3.7(清爽版)
软件简介: 追书神器,专注免费阅读小说的追新更神器 .全网小说光速追更提醒,全站免费阅读无广告,多维推荐送好书,更有集吐槽书评交友等多位一体的高能社区,超好用的网文小说电子书追更神器! 软件截图: 下 ...
- 追书神器的api接口写的微信小程序
@这是我基于追书神器的api接口写的微信小程序 这是我小程序的二维码
- vue仿追书神器,vue小说项目源码 1
vue-reader 一点阅读器!API源自追书神器,免费使用!目前已初步开发完成! Github项目地址:https://github.com/AntonySufer/vue-readle 欢迎is ...
- 我用几行Java代码撸了一个追书神器,真的是技术改变生活!老同学:艾玛真香!
大家好,我是Spring小杨,一个有梦想的Java司机. 前不久,有个老同学找到我,问有没有什么靠谱的追书神器? 我想着这玩意无非用爬虫,但是还是得尽量低调,不然牢底坐穿! 正版网站的资源很难爬下来的 ...
最新文章
- java 跳转 oop_Java基础之:OOP——接口
- 百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署
- liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...
- 安装版 修改mysql最大连接数_修改MySQL最大连接数
- HTML5中各种标签总结(超链接标签、锚点设置)
- 滴滴顺风车GM:大多数产品经理定义是狭隘的
- Android入门之常用控件
- MyBatis 缓存详解-第三方缓存做二级缓存
- 创建maven项目多模块项目
- Samsung Galaxy S III GT-I9300详细刷机教程
- Adobe Reader 下载
- 制作字幕.html教程,手机拍的视频如何加字幕 字幕制作软件使用教程
- 【vue+springboot】excel模板下载、导入功能实现
- 自动驾驶汽车也要驾考了,能否上路在此一举,老司机看了考试内容惊呆了!
- PPT文件不能编辑可以这样解决
- 在线上也能进行商标注册
- 棋牌游戏服务端架构(总)
- 网络工程师认证:HCIE(华为ICT专家认证)
- 计算机知识考试试题及答案,计算机基础知识试题及答案 计算机基础知识试题...
- 时钟树综合(CTS)