链接提取器
链接提取器是一个从响应中提取链接的对象。
LxmlLinkExtractor
的 __init__
方法接受用于确定可提取链接的设置。LxmlLinkExtractor.extract_links
从一个 Response
对象返回匹配的 Link
对象的列表。
链接提取器在 CrawlSpider
爬虫中通过一组 Rule
对象使用。
您也可以在常规爬虫中使用链接提取器。例如,您可以在爬虫中将 LinkExtractor
实例化为一个类变量,并在爬虫回调函数中使用它
def parse(self, response):
for link in self.link_extractor.extract_links(response):
yield Request(link.url, callback=self.parse)
链接提取器参考
链接提取器类是 scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor
。为方便起见,它也可以导入为 scrapy.linkextractors.LinkExtractor
from scrapy.linkextractors import LinkExtractor
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)[source]
LxmlLinkExtractor 是推荐的链接提取器,具有方便的过滤选项。它使用 lxml 强大的 HTMLParser 实现。
- 参数:
allow (str 或 list) – 一个正则表达式(或正则表达式列表),绝对 URL 必须匹配该表达式才能被提取。如果未给出(或为空),它将匹配所有链接。
deny (str 或 list) – 一个正则表达式(或正则表达式列表),绝对 URL 必须匹配该表达式才能被排除(即不提取)。它优先于
allow
参数。如果未给出(或为空),它将不排除任何链接。deny_extensions (list) –
单个值或字符串列表,包含在提取链接时应忽略的扩展名。如果未给出,它将默认为
scrapy.linkextractors.IGNORED_EXTENSIONS
。在 2.0 版本中更改:
IGNORED_EXTENSIONS
现在包含7z
,7zip
,apk
,bz2
,cdr
,dmg
,ico
,iso
,tar
,tar.gz
,webm
, 和xz
。restrict_xpaths (str 或 list) – 是一个 XPath(或 XPath 列表),定义了响应中应从中提取链接的区域。如果给出,将仅扫描由这些 XPath 选择的文本以查找链接。
restrict_css (str 或 list) – 一个 CSS 选择器(或选择器列表),定义了响应中应从中提取链接的区域。其行为与
restrict_xpaths
相同。restrict_text (str 或 list) – 一个正则表达式(或正则表达式列表),链接文本必须匹配该表达式才能被提取。如果未给出(或为空),它将匹配所有链接。如果给出了正则表达式列表,则链接将至少匹配其中一个时被提取。
attrs (列表) — 在查找要提取的链接时,一个或多个应被考虑的属性 (仅适用于
tags
参数中指定的那些标签)。默认为('href',)
canonicalize (bool) – 对每个提取的 URL 进行规范化处理(使用 `w3lib.url.canonicalize_url`)。默认为
False
。请注意,`canonicalize_url` 用于重复检查;它可能会改变服务器端可见的 URL,因此对于经过规范化和原始 URL 的请求,响应可能会不同。如果您使用 LinkExtractor 来跟踪链接,保持默认的canonicalize=False
会更健壮。unique (bool) – 是否应对提取的链接应用重复过滤。
process_value (collections.abc.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(r"javascript:goToPage\('(.*?)'", value) if m: return m.group(1)
strip (bool) – 是否从提取的属性中去除空白字符。根据 HTML5 标准,必须去除
、
和许多其他元素的
href
属性、
、元素的
src
属性等的开头和结尾空白字符,因此 LinkExtractor 默认去除空白字符。设置strip=False
以关闭此功能(例如,如果您从允许开头/结尾空白字符的元素或属性中提取 URL)。
Link
- class scrapy.link.Link(url: str, text: str = '', fragment: str = '', nofollow: bool = False)[source]
Link 对象表示由 LinkExtractor 提取的链接。
使用下面的锚标签示例来说明参数
<a href="https://example.com/nofollow.html#foo" rel="nofollow">Dont follow this one</a>
- 参数:
url – 锚标签中链接到的绝对 URL。根据示例,这是
https://example.com/nofollow.html
。text – 锚标签中的文本。根据示例,这是
Dont follow this one
。fragment – URL 中井号后面的部分。根据示例,这是
foo
。nofollow – 指示锚标签的
rel
属性中是否存在 nofollow 值。