Scrapy爬虫进阶操做之CrawlSpider(一)

开头来波小程序摇一摇:php

最近皮爷读书,看到了一个很牛逼的理论:html

注意力 > 时间 > 金钱复制代码

具体怎么理解,各位看官各有各的理解,我就很少说了。面试

近几篇文章,能够说的上是精品文章,并且是精品中的精品。请诸位看官仔细阅读。我准备给你们好好的说道说道Scrapy的爬虫具体应该怎么写,怎么用CrawSpider,这几篇文章,算是一个进阶内容,短期暴力进阶?具体目标:读过文章以后,你就能够写一个通用的爬虫,超级灵活的爬虫。shell

如今看来,市面上大部分关于讲爬虫的文章,均可以算是入门级别。虽然有些文章说的很巧,好比有些场合适合用requests直接写啊,有些场合用NumPy就能够搞定,还有些场合没有必要用Scrapy这么厉害的框架来作之类的。可见,你学习爬虫现在面临这么几个问题和思考:编程

  1. 市面上的爬虫文章种类繁多,并且方法各异,对于萌新选择入门学习形成困扰,由于太多了。
  2. 种类繁多,百花争鸣是好事儿,并且丰富了你们的眼界,但是,你是否曾想过,你学习爬虫是为了干什么?
  3. 爬虫若是是为了本身玩,那么,学习百家戏,确实没有问题;可是若是为了面试找工做呢?
  4. 不少萌新是读大学的学生,他们基础比较差(不要嫌我说的重,如今大学生的基础,确实不好,不信你工做几年回头看当时的本身,固然,若是你工做也不进步的话,能够忽略我说的),因此,他们的目标很简单,就是为了求职找工做。
  5. 若是为了面试,那么你有没有想过用人单位最须要什么样的人啊?固然是面试经过以后就能直接来上班的人。什么样的人能上班?固然是会使用企业爬虫框架的人啊。
  6. 这就引出了一个新的问题:什么爬虫框架企业会使用?
  7. 目前来讲,通常企业用的都是本身修改过的Scrapy框架,因此,你若是学好Scrapy框架的话,对于找工做颇有优点。
  8. 再多一句,你若是有所研究Scrapy爬虫框架的话,那么对于其余的爬虫框架或者原理,你也能够作到举一反三的层面。

综上所述,才有了这几篇爬虫进阶文章,专门为你拔高 Scrapy 的使用上限。等你读完,你就知道,以前你本身写的 Scrapy 爬虫,都是屎,相信我,你确定会有,我本身就有这种感受。小程序

既然是干货公号,那么咱们基本就是以实战为主。不知你们是否还看过我以前写的一篇文章『Python爬虫加速神器的牛刀小试,就问你怕不怕』,没有看过的,能够在公众号里面的历史文章里面查阅,这篇文章主要就是讲了一下用 aiohttp 来作爬虫。目标是爬取的美剧排行榜里面的信息。bash

目标网页是下面这个:框架

http://www.ttmeiju.me/index.php/summary/index/p/1.html复制代码

长这个样子:
scrapy

那篇文章只是简单的介绍一下 aiohttp 的使用,其实并不能做为爬虫生产工具。因此,从这篇文章开始,我会系统的给大家讲解 Scrapy ,最后让大家能够产出一个能够实际生产的爬虫工具。ide

0x00_序

在此以前,皮爷写的爬虫,基本上都是选用的 scrapy.Spider 里面的最基本款,即 spider。其实 scrapy 的 spider 还有好多种:CrawlSpider, XMLFeedSpider, CSVFeedSpider, SitemapSpider。今天咱们作通用爬虫的须要用到 CrawSpider。

0x01_需求分析

仍是很简单,和上回同样,爬取全部排行榜网页(总共36页),而后将每一条的关键信息存到一个类里面,最后把全部信息存入到阿里云上的 MongoDB 里面。

此次,咱们准备用 CrawlSpider 来作。

0x02_CrawlSpider

CrawlSpider 是 scrapy.Spider 的一个子类,他是在原有 spider 上面的扩展。他拥有父类全部的特性,同时也有本身独特的地方:经过 Rule 来提取网页信息。

通俗的说,就是爬虫经过开发者定义的爬取规则(Rule),来从网页信息里面提取 link,而后作相应的操做处理。

这其中,咱们使用 xpath 来作提取器,固然也可使用CSS selector,可是咱们再也不使用 BeautifulSoup。虽然 BeautifulSoup 写起来更加简单易懂,适合萌新使用,可是从速度方面考虑, xpath 要更胜一筹,并且若是运用熟练以后, xpath 的开发速度是要比 BeautifulSoup 快不少的。

0x03_建立项目

建立 Scrapy 项目很简单,咱们只须要在终端里面输入指令就好。若是对 Scrapy 命令不是很熟悉的,能够选择百度,也能够选择输入 scrapy --help 来查看帮助文档。

固然,若是遇到哪一个 scrapy 的指令不会,也能够用 --help 来查看文档。

建立项目,只须要挨个输入如下命令就能够了:

$ scrapy startproject HellProject$ cd HellProject/$ scrapy genspider -t crawl playranking www.ttmeiju.me复制代码

这一系列命令敲好以后,咱们就成功的建立了咱们的 Scrapy 工程。下面,咱们用 PyCharm 打开,就长下面这个样子:

至此,建立项目的任务就告一段落,接下来就是咱们的撸码环节。

0x05_编写CrawlSpider

这里咱们是经过命令行 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 来分析,因此,咱们有两种方式来调试:

  1. 终端经过命令 $ scrapy shell 进入 shell 中,而后直接调用 fetch() 函数便可,括号里面填写要访问的url地址。
  2. 或者直接在命令行输入后 $ scrapy shell http://www.ttmeiju.me/index.php/summary/index/p/1.html ,即在最后一个参数直接跟页面url便可。

我采用的是第二种方法,成功打开shell以后长下面这个样子:

其实到这里,shell 已经将咱们的页面访问过了,而且放到了 response 里面,你直接输入 responseresponse.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』。

皮爷撸码』,一个很硬核的公号,若是你能从这里学到知识,皮爷很高兴,很但愿你也可以将这分内容分享出去,让更多的人感觉到编程的乐趣。

相关文章
相关标签/搜索