Rule

Rule是在定义抽取链接的规则,上面的两条规则分别对应列表页的各个分页页面和详情页,关键点在于通过restrict_xpath来限定只从页面特定的部分来抽取接下来将要爬取的链接。
CrawlSpider的rules属性是直接从起始url请求返回的response对象中提取url,然后自动创建新的请求返回response, 由callback解析规则提取url返回的的response。

Rule 类的构造函数原型如下
Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

link_extractor:LinkExtractor 对象,定义了如何从爬取到的页面提取链接;
callback:回调函数,也可以是回调函数的字符串名。接收 Response 对象作为参数,返回包含 Item 或者 Request 对象列表;
cb_kwargs:用于作为 **kwargs 参数,传递给 callback;
follow:布尔值,默认是 False,用于判断是否继续从该页面提取链接;
process_links:指定该 spider 中哪个函数将会被调用,从 link_extractor 中获取到链接列表后悔调用该函数,该方法主要用来过滤 url;
process_request:回调函数,也可以是回调函数的字符串名。用来过滤 Request ,该规则提取到每个 Request 时都会调用该函数。

使用样例:

    rules = (
        Rule(LinkExtractor(allow=r'.*/portal/content\?caid=\d+&feedType=2&lcid=\d+$'), callback="parse_item"),
        # 寻找下一页 url 地址
        Rule(LinkExtractor(restrict_xpaths="//a[@title='下一页']"), follow=True),
    )

LinkExtractor

导入

from scrapy.linkextractors import LinkExtractor

LinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(), tags=(‘a’, ‘area’),attrs=(‘href’,), canonicalize=False, unique=True, process_value=None, deny_extensions=None,restrict_css=(), strip=True, restrict_text=None,)

其中比较重要的参数如下所示:
allow:正则表达式,满足的会被提取,默认为空,表示提取全部超链接;
deny:正则表达式,不被提取的内容;
allow_domains:允许的 domains;
deny_domains:不允许的 domains;
restrict_xpaths:xpath 表达式\ntags:提取的标签;
attrs:默认属性值;
restrict_css:css 表达式提取;
restrict_text:文本提取。

le = LinkExtractor(restrict_xpaths="//ul[@class='first-title']/li/div/a[3]")
a_list = le.extract_links(resp)
print(a_list.text,a_list.url)