链接提取器
链接提取器是一个从响应中提取链接的对象。
LxmlLinkExtractor 的 __init__ 方法接受决定可以提取哪些链接的设置。LxmlLinkExtractor.extract_links 从 Response 对象中返回匹配的 Link 对象列表。
链接提取器通过一组 Rule 对象在 CrawlSpider 爬虫中使用。
您也可以在普通爬虫中使用链接提取器。例如,您可以在爬虫中将 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: str | Pattern[str] | Iterable[str | Pattern[str]] = (), deny: str | Pattern[str] | Iterable[str | Pattern[str]] = (), allow_domains: str | Iterable[str] = (), deny_domains: str | Iterable[str] = (), restrict_xpaths: str | Iterable[str] = (), tags: str | Iterable[str] = ('a', 'area'), attrs: str | Iterable[str] = ('href',), canonicalize: bool = False, unique: bool = True, process_value: Callable[[Any], Any] | None = None, deny_extensions: str | Iterable[str] | None = None, restrict_css: str | Iterable[str] = (), strip: bool = True, restrict_text: str | Pattern[str] | Iterable[str | Pattern[str]] | None = None, deny_tags: str | Iterable[str] = (), deny_attrs: str | Iterable[str] = ())[source]
LxmlLinkExtractor 是推荐的链接提取器,具有方便的过滤选项。它使用 lxml 强大的 HTMLParser 实现。
- 参数:
allow (str 或 list) – 一个正则表达式(或正则表达式列表),提取的(绝对)URL 必须匹配它。如果未给定(或为空),它将匹配所有链接。
deny (str 或 list) – 一个正则表达式(或正则表达式列表),提取的(绝对)URL 必须匹配它才能被排除(即不提取)。它优先于
allow参数。如果未给定(或为空),它将不会排除任何链接。deny_extensions (list) – 单个值或包含应在提取链接时忽略的扩展名的字符串列表。如果未给定,将默认为
scrapy.linkextractors.IGNORED_EXTENSIONS。restrict_xpaths (str 或 list) – 一个 XPath(或 XPath 列表),它定义了响应中应从中提取链接的区域。如果给定,则只有由这些 XPath 选择的文本才会被扫描以查找链接。
restrict_css (str 或 list) – 一个 CSS 选择器(或选择器列表),它定义了响应中应从中提取链接的区域。其行为与
restrict_xpaths相同。restrict_text (str 或 list) – 一个正则表达式(或正则表达式列表),链接文本必须匹配它才能被提取。如果未给定(或为空),它将匹配所有链接。如果给定了正则表达式列表,则只要链接匹配其中至少一个就会被提取。
tags (str 或 list) – 提取链接时要考虑的标签或标签列表。默认为
('a', 'area')。使用'*'表示考虑所有标签。attrs (list) – 查找要提取的链接时应考虑的属性或属性列表(仅适用于
tags参数中指定的标签)。默认为('href',)。使用'*'表示考虑所有属性。一个或多个在提取链接时不应考虑的标签。它优先于
tags参数,因此可以与tags='*'结合使用,以考虑除少数标签外的所有标签。默认为()(不排除任何标签)。在 2.17.0 版本中添加。
一个或多个在查找要提取的链接时不应考虑的属性。它优先于
attrs参数,因此可以与attrs='*'结合使用,以考虑除少数属性外的所有属性。默认为()(不排除任何属性)。在 2.17.0 版本中添加。
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 标准,
<a>、<area>和许多其他元素的href属性,<img>、<iframe>元素的src属性等必须去除首尾空白字符,因此 LinkExtractor 默认会去除空格字符。设置strip=False可将其关闭(例如,如果您正在从允许首尾空白字符的元素或属性中提取 URL)。
链接
- 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 值。