前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scrapy基础——CrawlSpider详解

Scrapy基础——CrawlSpider详解

作者头像
Python中文社区
发布2018-01-31 17:34:07
1.3K0
发布2018-01-31 17:34:07
举报
文章被收录于专栏:Python中文社区

專 欄

hotpot,Python中文社区专栏作者

博客:

http://www.jianshu.com/u/9ea40b5f607a

CrawlSpider基于Spider,但是可以说是为全站爬取而生。

简要说明

CrawlSpider是爬取那些具有一定规则网站的常用的爬虫,它基于Spider并有一些独特属性

1、rules: 是Rule对象的集合,用于匹配目标网站并排除干扰 2、parse_start_url: 用于爬取起始响应,必须要返回Item,Request中的一个。

因为rules是Rule对象的集合,所以这里也要介绍一下Rule。它有几个参数:link_extractor、callback=None、cb_kwargs=None、follow=None、process_links=None、process_request=None 其中的link_extractor既可以自己定义,也可以使用已有LinkExtractor类,主要参数为:

1、allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。 2、deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。 3、allow_domains:会被提取的链接的domains。 4、deny_domains:一定不会被提取链接的domains。 5、restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。还有一个类似的restrict_css

下面是官方提供的例子,我将从源代码的角度开始解读一些常见问题:

问题:CrawlSpider如何工作的?

因为CrawlSpider继承了Spider,所以具有Spider的所有函数。 首先由start_requests对start_urls中的每一个url发起请求(make_requests_from_url),这个请求会被parse接收。在Spider里面的parse需要我们定义,但CrawlSpider定义parse去解析响应(self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)) _parse_response根据有无callback,follow和self.follow_links执行不同的操作

其中_requests_to_follow又会获取link_extractor(这个是我们传入的LinkExtractor)解析页面得到的link(link_extractor.extract_links(response)),对url进行加工(process_links,需要自定义),对符合的link发起Request。使用.process_request(需要自定义)处理响应。

问题:CrawlSpider如何获取rules?

CrawlSpider类会在init方法中调用_compile_rules方法,然后在其中浅拷贝rules中的各个Rule获取要用于回调(callback),要进行处理的链接(process_links)和要进行的处理请求(process_request)

那么Rule是怎么样定义的呢?

因此LinkExtractor会传给link_extractor。

有callback的是由指定的函数处理,没有callback的是由哪个函数处理的?

由上面的讲解可以发现_parse_response会处理有callback的(响应)respons。 cb_res = callback(response, **cb_kwargs) or () 而_requests_to_follow会将self._response_downloaded传给callback用于对页面中匹配的url发起请求(request)。 r = Request(url=link.url, callback=self._response_downloaded)

如何在CrawlSpider进行模拟登陆

因为CrawlSpider和Spider一样,都要使用start_requests发起请求,用从Andrew_liu大神借鉴的代码说明如何模拟登陆:

理论说明如上,有不足或不懂的地方欢迎在留言区和我说明。 其次,我会写一段爬取简书全站用户的爬虫来说明如何具体使用CrawlSpider

最后贴上Scrapy.spiders.CrawlSpider的源代码,以便检查

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档