链接提取器¶
链接提取器是一个从响应中提取链接的对象。
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 (list) – 一个属性或属性列表,在查找要提取的链接时应考虑这些属性(仅对于
tags
参数中指定的那些标签)。默认为('href',)
。canonicalize (bool) – 对每个提取的 URL 进行规范化(使用 w3lib.url.canonicalize_url)。默认为
False
。请注意,canonicalize_url 用于重复检查;它可以更改服务器端可见的 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
属性(例如<a>
、<area>
等元素)以及src
属性(例如<img>
、<iframe>
等元素)的前导和尾随空格,因此 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 值。