这是崔斯特的第十九篇原创文章
先来首火影压压惊 (。・`ω´・)
最开始接触 Rules
是在Scrapy的文档上看到的,但是并看读懂这是什么意思。接下来看别人的案例,有使用到Rules,便花了很多时间去了解。
解释:
Rule是在定义抽取链接的规则,上面的两条规则分别对应列表页的各个分页页面和详情页,关键点在于通过restrict_xpath
来限定只从页面特定的部分来抽取接下来将要爬取的链接。
其实用我的话来说就是,一个是可以便捷的进行翻页操作,二是可以采集二级页面,相当于打开获得详情页内容。所以若使用了 Rules
,可以便捷的帮助我们采集批量网页。
官方文档
|
|
该spider将从example.com的首页开始爬取,获取category以及item的链接并对后者使用 parse_item 方法。 对于每个item response,将使用XPath从HTML中提取一些数据,并使用它填充Item。
实际应用
为了更好的理解,我们来看看实际案例中Rules
如何使用
豆瓣应用
|
|
如果接触过django
,那么可以发现这个规则与django
的路由系统十分相似(django都已经忘完了 -_-!),其实这里使用的正则匹配。
使用 r'https://movie.douban.com/top250\?start=\d+.*'
来匹配翻页链接,如:
使用https://movie.douban.com/subject/\d+
来匹配具体电影的链接,如:
链家应用
爬虫的通常需要在一个网页里面爬去其他的链接,然后一层一层往下爬,scrapy提供了LinkExtractor类用于对网页链接的提取,使用LinkExtractor需要使用CrawlSpider
爬虫类中,CrawlSpider
与Spider
相比主要是多了rules
,可以添加一些规则,先看下面这个例子,爬取链家网的链接
|
|
同样的,使用r'http://bj.lianjia.com/ershoufang/pg\s+$'
来匹配下一页链接,如:
还可以使用 r'https://bj.lianjia.com/ershoufang/\d+.html'
来匹配详情页链接,如:
- https://bj.lianjia.com/ershoufang/101102126888.html
- https://bj.lianjia.com/ershoufang/101100845676.html
学习参数
Rule对象
Role对象有下面参数
link_extractor
:链接提取规则callback
:link_extractor提取的链接的请求结果的回调cb_kwargs
:附加参数,可以在回调函数中获取到follow
:表示提取的链接请求完成后是否还要应用当前规则(boolean),如果为False则不会对提取出来的网页进行进一步提取,默认为Falseprocess_links
:处理所有的链接的回调,用于处理从response提取的links,通常用于过滤(参数为link列表)process_request
:链接请求预处理(添加header或cookie等)
LinkExtractor
LinkExtractor常用的参数有:
allow
:提取满足正则表达式的链接deny
:排除正则表达式匹配的链接(优先级高于allow)allow_domains
:允许的域名(可以是str或list)deny_domains
:排除的域名(可以是str或list)restrict_xpaths
:提取满足XPath选择条件的链接(可以是str或list)restrict_css
:提取满足css选择条件的链接(可以是str或list)tags
:提取指定标签下的链接,默认从a和area中提取(可以是str或list)attrs
:提取满足拥有属性的链接,默认为href(类型为list)unique
:链接是否去重(类型为boolean)process_value
:值处理函数(优先级大于allow)
关于LinkExtractor的详细参数介绍见官网
注意:在编写抓取Spider规则时,避免使用
parse
作为回调,因为CrawlSpider
使用parse
方法自己实现其逻辑。因此,如果你覆盖parse
方法,爬行Spider
将不再工作。
最后说一个自己犯过的低级错误,我用Scrapy有个习惯,创建一个项目之后,直接cd
目录,然后使用genspider
命令,然后。。
|
|
然后我的em.py
就变成了这样:
|
|
注意,这个时候是不能使用Rules
方法的,因为object不对,应该是
class EmSpider(CrawlSpider)
而不是class EmSpider(scrapy.Spider):
共勉!!!
下一节应该会讲到Scrapy中各个组件的作用,以及这张神图