开头来波小程序摇一摇:php
最近皮爷读书,看到了一个很牛逼的理论:html
注意力 > 时间 > 金钱复制代码
具体怎么理解,各位看官各有各的理解,我就很少说了。面试
近几篇文章,能够说的上是精品文章,并且是精品中的精品。请诸位看官仔细阅读。我准备给你们好好的说道说道Scrapy的爬虫具体应该怎么写,怎么用CrawSpider,这几篇文章,算是一个进阶内容,短期暴力进阶?具体目标:读过文章以后,你就能够写一个通用的爬虫,超级灵活的爬虫。shell
如今看来,市面上大部分关于讲爬虫的文章,均可以算是入门级别。虽然有些文章说的很巧,好比有些场合适合用requests直接写啊,有些场合用NumPy就能够搞定,还有些场合没有必要用Scrapy这么厉害的框架来作之类的。可见,你学习爬虫现在面临这么几个问题和思考:编程
综上所述,才有了这几篇爬虫进阶文章,专门为你拔高 Scrapy 的使用上限。等你读完,你就知道,以前你本身写的 Scrapy 爬虫,都是屎,相信我,你确定会有,我本身就有这种感受。小程序
既然是干货公号,那么咱们基本就是以实战为主。不知你们是否还看过我以前写的一篇文章『Python爬虫加速神器的牛刀小试,就问你怕不怕』,没有看过的,能够在公众号里面的历史文章里面查阅,这篇文章主要就是讲了一下用 aiohttp 来作爬虫。目标是爬取的美剧排行榜里面的信息。bash
目标网页是下面这个:框架
http://www.ttmeiju.me/index.php/summary/index/p/1.html复制代码
长这个样子:
scrapy
那篇文章只是简单的介绍一下 aiohttp 的使用,其实并不能做为爬虫生产工具。因此,从这篇文章开始,我会系统的给大家讲解 Scrapy ,最后让大家能够产出一个能够实际生产的爬虫工具。ide
在此以前,皮爷写的爬虫,基本上都是选用的 scrapy.Spider 里面的最基本款,即 spider。其实 scrapy 的 spider 还有好多种:CrawlSpider, XMLFeedSpider, CSVFeedSpider, SitemapSpider。今天咱们作通用爬虫的须要用到 CrawSpider。
仍是很简单,和上回同样,爬取全部排行榜网页(总共36页),而后将每一条的关键信息存到一个类里面,最后把全部信息存入到阿里云上的 MongoDB 里面。
此次,咱们准备用 CrawlSpider 来作。
CrawlSpider 是 scrapy.Spider 的一个子类,他是在原有 spider 上面的扩展。他拥有父类全部的特性,同时也有本身独特的地方:经过 Rule 来提取网页信息。
通俗的说,就是爬虫经过开发者定义的爬取规则(Rule),来从网页信息里面提取 link,而后作相应的操做处理。
这其中,咱们使用 xpath 来作提取器,固然也可使用CSS selector,可是咱们再也不使用 BeautifulSoup。虽然 BeautifulSoup 写起来更加简单易懂,适合萌新使用,可是从速度方面考虑, xpath 要更胜一筹,并且若是运用熟练以后, xpath 的开发速度是要比 BeautifulSoup 快不少的。
建立 Scrapy 项目很简单,咱们只须要在终端里面输入指令就好。若是对 Scrapy 命令不是很熟悉的,能够选择百度,也能够选择输入 scrapy --help
来查看帮助文档。
固然,若是遇到哪一个 scrapy 的指令不会,也能够用 --help
来查看文档。
建立项目,只须要挨个输入如下命令就能够了:
$ scrapy startproject HellProject$ cd HellProject/$ scrapy genspider -t crawl playranking www.ttmeiju.me复制代码
这一系列命令敲好以后,咱们就成功的建立了咱们的 Scrapy 工程。下面,咱们用 PyCharm 打开,就长下面这个样子:
至此,建立项目的任务就告一段落,接下来就是咱们的撸码环节。
这里咱们是经过命令行 scrapy genspider -t crawl <spiderName> <hostAddress>
建立的CrawlSpider,并不是以前的 scrapySpider,因此,代码的样子长得和以前有所区别。
其实,CrawlSpider最关键的部分就是红色框框里面的 rules 的编写。由于 CrawlSpider 每次会按照 rules 的规则来提取出来页面中的 link,再遍历访问全部提取出来的 link,处理爬取结果。
因此,针对咱们这里的需求,咱们能够预估出来咱们只要写一个 Rule 就能够,即:
每一页面最下面的 页数 部分,并且,咱们只要提取出来 下一页
的连接就能够,即图中蓝色圈圈对应的地方。咱们检查
网页:
发现 >>
对应的是一个 ul
标签底下的 a
标签,而且这个 a
标签有明显的特征,就是 class=next
,这就简单了。
咱们这里为了提取网页信息内容,再也不采起以前的BeautifulSoup 方法,并且采起更加快捷的 xpath 方法来提取分析网页。
刚开始接触 xpath 的同窗,可能对我这里的写法有一些跳跃,可是不要慌,等你看完个人这几篇文章以后,我在项目里面所用到的 xpath 的那几种写法,其实就已经彻底可以覆盖到你 95% 以上的平常所需了。因此,别慌,静下心来细细读文章。
接着说,咱们这里要编写 Rule, 看到项目例子里面给的是一个叫 LinkExtractor 的东西,这个从字面意思就能看出来是一个 Link提取器,咱们这里就照猫画虎的来写咱们第一个 LinkExtractor 。
因为咱们是采用 xpath 来定位数据,这里多给你们说一个调试 xpath 的小技巧: 使用 scrapy shell
来进行调试!!!
在终端,直接输入 $ scrapy shell
命令,就进入了大名鼎鼎的 scrapy shell 里面了。退出scrapy shell直接输入 exit
而后按回车便可。
咱们要在:
http://www.ttmeiju.me/index.php/summary/index/p/1.html复制代码
这个页面调用 xpath 来分析,因此,咱们有两种方式来调试:
$ scrapy shell
进入 shell 中,而后直接调用 fetch()
函数便可,括号里面填写要访问的url地址。$ scrapy shell http://www.ttmeiju.me/index.php/summary/index/p/1.html
,即在最后一个参数直接跟页面url便可。我采用的是第二种方法,成功打开shell以后长下面这个样子:
其实到这里,shell 已经将咱们的页面访问过了,而且放到了 response 里面,你直接输入 response
、 response.text
或者 response.body
是能够看到结果的。
在这个 shell 界面,咱们就能够调试 xpath 了,怎么调试?这么调试,直接写代码:
response.xpath('//ul//a[@class="next"]')response.xpath('//ul//a[@class="next"]').extract()response.xpath('//ul//a[@class="next"]//text()').extract()复制代码
这三个对应的就是你要的在 ul
标签下的 a
标签,而且 a
标签的 class=next
:
你看,这里是否是提取出来的 text
是 >>
?
若是你要提取别的东西,直接输入 response.xpath()
括号里面填写选择条件便可:
这个就是选出来页面中全部的 li
标签。
接下来咱们就返回来看咱们的 LinkExtractor 怎么写:
rules = ( Rule(LinkExtractor(restrict_xpaths='//ul[@class="pagination"]//a[@class="next"]'), callback='parse_item', follow=True), )复制代码
看到这里咱们就把以前的xpath的 (Items/)
改成 (//ul[@class="pagination"]//a[@class="next"])
。
同时,咱们把 start_urls
改成:
start_urls = ['http://www.ttmeiju.me/']复制代码
稍微修改一下底下的 parse_item() 函数:
def parse_item(self, response): print(response.url)复制代码
咱们的目的就是看咱们的爬虫是否能够顺利的一页一页的按照 下一页
来爬取网页,而后咱们经过命令 scrapy crawl playranking
运行一下爬虫,看一下结果:
这里能够看到,log里面顺利的打出了从 1 ~ 36 页的 URL,证实咱们的程序没有问题。那么接下来的爬虫,咱们将在以后的章节讲述。
这里说一下哈,全部的爬虫代码,我均已发布到网上了,获取方法很简单,关注公号『皮爷撸码』,回复『代码』便可找到,记住对应的代码编号是『CS001』,代码编号是『CS001』,代码编号是『CS001』。
『皮爷撸码』,一个很硬核的公号,若是你能从这里学到知识,皮爷很高兴,很但愿你也可以将这分内容分享出去,让更多的人感觉到编程的乐趣。