Scrapy1.5基本概念(十)——链接提取器(Link Extractors)

本文为译文,原文见地址:https://docs.scrapy.org/en/latest/topics/link-extractors.html

链接提取器(Link Extractors)

链接提取器是只用于从web页面(scrapy.http.Response对象)中提取链接的对象,这些链接最终会被继续追踪。

在Scrapy中有一个可用的scrapy.linkextractors.LinkExtractor,但是你也可以根据你自己的需求,通过实现几个简单的接口来创造你自己的链接提取器。

每个链接提取器唯一的公共方法是extract_links,它接收一个响应对象并返回一个scrapy.link.Link对象的列表。链接提取器应该只被初始化一次,并根据不同的响应调用链接提取器的extract_links函数来提取要继续追踪的链接。

链接提取器被用于CrawlSpider类中(Scrapy中可用),并设置了一组提取规则。当然你也可以在你自己的爬虫类中使用,即使你不是继承于CrawlSpider类,这样的目的只有一个,为了提取链接。

内置链接提取器的引用

链接提取器的类可以在scray.linkextractors模块中找到。

默认的链接提取器是LinkExtractor,与LxmlLinkExtractor完全一致:

from scrapy.linkextractors import LinkExtractor

在之前的Scrapy版本中还有其他的链接提取器类,但是现在它们都被弃用了。

LxmlLinkExtractor

class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=(‘a’, ‘area’), attrs=(‘href’, ), canonicalize=False, unique=True, process_value=None, strip=True)

LxmlLinkExtractor是推荐的链接提取器,它具有便利的过滤选项。它是使用lxml的HTMLParser实现的。

参数:

扫描二维码关注公众号,回复: 4781143 查看本文章
  • allow(一个正则表达式(或者一组))- 一个正则表达式(或者一组正则表达式),用于匹配(绝对)url,以便提取链接。如果没有给定(或者为空),它将匹配所有链接。

  • deny(一个正则表达式(或者一组))- 一个正则表达式(或者一组正则表达式),用于匹配(绝对)url,以便排除链接(也就是不提取)。这个参数优先于allow参数。如果没有给出(或者为空),它不会排除任何链接。

  • allow_domains(str或者列表)- 单个字符串或者字符串列表,包含了域名,将提取这些域名的链接。

  • deny_domains(str或者列表)- 单个字符串或者字符串列表,包含了域名,将排除这些域名的链接。

  • deny_extensions(列表)- 单个字符串或者字符串列表,包含了扩展名,将在提取链接时忽略这些扩展。如果没有给出,它将默认使用scrapy.linkextractors包中定义的IGNORED_EXTENSIONS列表。

  • restrict_xpaths(str或者列表)- 一个XPath(或者一组XPath),定义了响应内部应该提取链接的区域。如果给出,则只从这些XPath选定的文本中提取链接。后面有示例。

  • restrict_css(str或者列表)- 一个CSS选择器(或者一组CSS选择器),定义了响应内部应该提取链接的区域。与restrict_xpaths的行为一致。

  • tags(str或者列表)- 一个标签或者一组标签,表示提取链接的标签元素。默认为(‘a’, ‘area’)。

  • attrs(列表)- 一个属性或者一组属性,当提取链接时考虑从标签的哪个属性提取(只针对在tags参数中指定的标签)。默认为(‘href’, )。

  • canonicalize(boolean)- 将每个提取的url进行规范化(使用w3lib.url.canonicalize_url)。默认为False。注意canonicalize_url是用于重复检测的,它可以改变服务器端可见的URL,因此对于使用规范化URL和原始URL的请求,响应可能会有所不同。如果你是用LinkExtractor来追踪链接,则推荐设置canonicalize=False。

  • unique(boolean)- 重复过滤器是否能应用于提取链接。

  • process_value(callable)- 一个函数,接受每一个从标签和浏览的属性中提取的值,它可以修改该值并返回一个新的值,或者返回None以用来完全忽略链接。如果没有给定,process_value默认为lambda x: x。

    举个栗子,为了从下面的代码中提取链接:

    <a href="javascript:goToPage('../other/page.html'); return false">Link text</a>
    

    你可以使用在process_value中使用下面的方法:

    def process_value(value):
    	m = re.search("javascript:goToPage\('(.*?)'", value)
    	if m:
    		return m.group(1)
    
  • strip(boolean)- 是否从提取的属性中去掉空白格。根据标准HTML5,这些元素的属性必须剥离开头和结尾的空白,<a>、<area>以及其他元素的href属性,<img>、<iframe>元素的src属性,等等,因此LinkExtractor默认会剥离空白字符。设置strip=False则会关闭此功能(比如,如果你希望从允许开头和结尾带有空白的元素中提取url)。

猜你喜欢

转载自blog.csdn.net/ReganDu/article/details/85778667