前言

看小说是我这么多年来一直保持的习惯。《盘龙》、《斗破苍穹》、《仙逆》、《凡人修仙传》等等,陪伴了我整个学生时代。最近发现iOS上小说类app体验都不好,经常出现广告弹出、更新不及时、强制分享等情况。于是在一个下雨的晚上,我决定不再忍受这些app,自己强撸一个追书爬虫。

Scrapy介绍

Scrapy是python主流爬虫框架,可以很方便的通过url抓取web信息,同时与传统的requests库相比,提供了更多的工具和更高的并发。推荐从官方学习网站上学习。

不过,你一点scrapy资料都不知道也没有关系,读完本文一样能撸出来

Scrapy实战

在开始前,我们需要准备好以下几个东西:

  1. 想要爬取的小说url
  2. 环境搭建
  3. 入门级的python语法

选取网站

这里我选的是 m.book9.net/。 选这个网站是因为它有是三个优点

  1. 更新速度比较快 (服务稳定)
  2. 页面的结构简单 (易于解析)
  3. 没有做一些防爬虫的保护 (操作简单)

接下来,找到追更小说的主页。

比如 辰东的《圣墟》

假设现在我们要追更的话,需要每次打开这个网站,然后点击最新章节的第一个选项条,链接到具体的小说章节。

仿造以上的步骤,我画出了这样一个流程:

所以接下来,我们只需要根据这些流程来转化成我们的代码就好了

搭建工程

我们将要搭建一个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入门相关推荐

  1. React+Redux仿Web追书神器

    引言 由于 10 月份做的 React Native 项目没有使用到 Redux 等库,写了一段时间想深入学习 React,有个想法想做个 demo 练手下,那时候其实还没想好要做哪一个类型的,也看了 ...

  2. 追书神器 三星s8+ 语音朗读锁屏后中断问题解决办法

    1. 综述: 本人喜欢用追书神器听书, 使用的免费版,遇到问题是: 使用追书神器语音朗读, 屏幕亮着时没问题,锁屏也没问题,但是屏幕暗下后隔段时间,语音就停了, 按亮屏幕,不用解锁朗读声又响起了,为了 ...

  3. 看书软件哪个好?看连载神器、追书神器、笔趣阁的评测就知道了

    看书软件哪个好?看连载神器.追书神器.笔趣阁的评测就知道了你还在为不能在手机上免费看小说而烦恼吗? 你还在为搜索不到你想要看的小说而郁闷吗? 那么今天你就享福了! 今天为大家分享3个可以免费观看小说的 ...

  4. 安卓打包工具_【安卓+ios】追书神器爱阅书香182个书源配置更新~~

    回复公众号后台留言, 很多大兄弟要求推荐看小说的软件. 既然需求,那就满足你们 182个书源已经打包好. iOS端 iOS端的爱阅书香很久前就推荐过. 一个完全免费的小说阅读器,完全免费,自定义导入书 ...

  5. Android小说阅读器,追书神器API接口

    追书神器API接口 注:(所有的接口都是Get请求) 所有地址前要加上  api.zhuishushenqi.com 1. 获取所有分类 类型 值 接口地址 /cats/lv2/statistics ...

  6. 安卓追书神器1.3.7(清爽版)

    软件简介: 追书神器,专注免费阅读小说的追新更神器 .全网小说光速追更提醒,全站免费阅读无广告,多维推荐送好书,更有集吐槽书评交友等多位一体的高能社区,超好用的网文小说电子书追更神器! 软件截图: 下 ...

  7. 追书神器的api接口写的微信小程序

    @这是我基于追书神器的api接口写的微信小程序 这是我小程序的二维码

  8. vue仿追书神器,vue小说项目源码 1

    vue-reader 一点阅读器!API源自追书神器,免费使用!目前已初步开发完成! Github项目地址:https://github.com/AntonySufer/vue-readle 欢迎is ...

  9. 我用几行Java代码撸了一个追书神器,真的是技术改变生活!老同学:艾玛真香!

    大家好,我是Spring小杨,一个有梦想的Java司机. 前不久,有个老同学找到我,问有没有什么靠谱的追书神器? 我想着这玩意无非用爬虫,但是还是得尽量低调,不然牢底坐穿! 正版网站的资源很难爬下来的 ...

最新文章

  1. java 跳转 oop_Java基础之:OOP——接口
  2. 百度开源联邦学习框架 PaddleFL:简化大规模分布式集群部署
  3. liunx导出mysql慢查询日志查看_查看 MySQL 慢查询日志文件-问答-阿里云开发者社区-阿里云...
  4. 安装版 修改mysql最大连接数_修改MySQL最大连接数
  5. HTML5中各种标签总结(超链接标签、锚点设置)
  6. 滴滴顺风车GM:大多数产品经理定义是狭隘的
  7. Android入门之常用控件
  8. MyBatis 缓存详解-第三方缓存做二级缓存
  9. 创建maven项目多模块项目
  10. Samsung Galaxy S III GT-I9300详细刷机教程
  11. Adobe Reader 下载
  12. 制作字幕.html教程,手机拍的视频如何加字幕 字幕制作软件使用教程
  13. 【vue+springboot】excel模板下载、导入功能实现
  14. 自动驾驶汽车也要驾考了,能否上路在此一举,老司机看了考试内容惊呆了!
  15. PPT文件不能编辑可以这样解决
  16. 在线上也能进行商标注册
  17. 棋牌游戏服务端架构(总)
  18. 网络工程师认证:HCIE(华为ICT专家认证)
  19. 计算机知识考试试题及答案,计算机基础知识试题及答案 计算机基础知识试题...
  20. 时钟树综合(CTS)

热门文章

  1. ShockwaveFlash 详解
  2. window.load和window.onload
  3. 如何查看网页端所占的内存大小
  4. 【第51篇】用于交通预测的时空交互动态图卷积网络
  5. pytorch图片分割原理
  6. windows4t硬盘Linux分区工具,linux挂载windows下的硬盘分区
  7. 常见计算机从零开始 E.读屏软件的使用(转)
  8. 英语计算机统考成绩多久出来,计算机二级考试成绩多久出来
  9. 完全卸载SQL server2019的完整步骤
  10. GIS二次开发:实验一 ArcGIS Engine 开发初步