之前一直没有使用到Rule , Link Extractors,最近在读scrapy-redis给的example的时候遇到了,才发现自己之前都没有用过。Rule , Link Extractors多用于全站的爬取,学习一下。
Rule
Rule是在定义抽取链接的规则
class scrapy.contrib.spiders.
Rule
(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)
具体使用可以看下面的例子
———————————-分割线———————————-
Link Extractors
官方解释是:
Link Extractors 是用于从网页(scrapy.http.Response )中抽取会被follow的链接的对象。
简单的理解就是:
用于从网页返回的response里抽取url,用以进行之后的操作。
我们用豆瓣top250写一个小例子
from scrapy.spiders.crawl import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor
class DoubanSpider(CrawlSpider):
name = "test"
allowed_domains = ["book.douban.com"]
start_urls = ['https://book.douban.com/top250']
rules = (
Rule(LinkExtractor(allow=('subject/\d+/$',)),callback='parse_items'),
)
def parse_items(self, response):
pass
需要注意的点:
运行爬虫,效果如下:
可见爬取了很多url,这些url是怎么获得的呢?
就是Link Extractors 提取出来的。
我们在上面的rule中定义了Link Extractors,LinkExtractors接收的一个参数是allow=(‘subject/\d+/$’,) ,是一个正则表达式。
运行流程是
1.scrapy 请求 start_urls , 获取到response
2.使用LinkExtractors中allow的内容去匹配response,获取到url
3.请求这个url , response交给,callback指向的方法处理
Scrapy默认提供2种可用的 Link Extractor,可以通过实现一个简单的接口创建自己定制的Link Extractor来满足需求。
如果不自定义的话,默认的link extractor 是 LinkExtractor ,其实就是 LxmlLinkExtractor:
LinkExtractor的参数有:
class scrapy.contrib.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), tags=('a', 'area'), attrs=('href', ), canonicalize=True, unique=True, process_value=None)
以上参考链接http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/link-extractors.html
以上是follow没有设置(默认为False的情况),在爬取到25个url的时候程序终止了。而如果将follow设置为True,将程序改成如下:
from scrapy.spiders.crawl import Rule, CrawlSpider
from scrapy.linkextractors import LinkExtractor
class DoubanSpider(CrawlSpider):
name = "test"
allowed_domains = ["book.douban.com"]
start_urls = ['https://book.douban.com/top250']
rules = (
Rule(LinkExtractor(allow=('subject/\d+/$',)),callback='parse_items',follow=True),
)
def parse_items(self, response):
pass
再次运行爬虫,发现爬虫(不被反爬的话)会跑很久不停下。因为在页面中有这样的地方:
他们的url也符合规则,就会被不断的爬下来。
项目代码地址:https://github.com/dangsh/hive/tree/master/scrapySpider/ruleTest