本文为译文,原文见地址: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实现的。
参数:
-
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)。