scrapy.org / docs

入门

  • Scrapy 一览
  • 安装指南
  • Scrapy 教程
  • 示例

基本概念

  • 命令行工具
  • 爬虫 (Spiders)
  • 选择器 (Selectors)
  • 项目 (Items)
  • 项目加载器 (Item Loaders)
  • Scrapy 终端 (Scrapy shell)
  • 项目管道 (Item Pipeline)
  • Feed 导出 (Feed exports)
  • 请求与响应 (Requests and Responses)
  • 链接提取器 (Link Extractors)
    • 链接提取器参考
      • LxmlLinkExtractor
        • LxmlLinkExtractor
      • Link
        • Link
  • 设置 (Settings)
  • 异常 (Exceptions)

内置服务

  • 日志记录 (Logging)
  • 统计收集 (Stats Collection)
  • Telnet 终端 (Telnet Console)

解决特定问题

  • 常见问题 (FAQ)
  • 调试爬虫
  • 爬虫契约 (Spiders Contracts)
  • 常用实践
  • 安全
  • 通用爬取 (Broad Crawls)
  • 使用浏览器的开发者工具进行抓取
  • 选择动态加载的内容
  • 调试内存泄漏
  • 下载并处理文件和图像
  • 部署爬虫
  • 自动限速 (AutoThrottle) 扩展
  • 基准测试 (Benchmarking)
  • 作业:暂停与恢复爬取
  • 协程 (Coroutines)
  • asyncio

扩展 Scrapy

  • 架构概览
  • 插件 (Add-ons)
  • 下载器中间件 (Downloader Middleware)
  • 爬虫中间件 (Spider Middleware)
  • 扩展 (Extensions)
  • 信号 (Signals)
  • 调度器 (Scheduler)
  • 项目导出器 (Item Exporters)
  • 下载处理器 (Download handlers)
  • 组件 (Components)
  • 核心 API

其他内容

  • 发行说明
  • 为 Scrapy 贡献代码
  • 版本控制与 API 稳定性
Scrapy
  • 链接提取器 (Link Extractors)
  • 在 GitHub 上编辑

链接提取器

链接提取器是一个从响应中提取链接的对象。

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 参数。如果未给定(或为空),它将不会排除任何链接。

  • allow_domains (str 或 list) – 单个值或包含域名的字符串列表,这些域名将被考虑用于提取链接

  • deny_domains (str 或 list) – 单个值或包含域名的字符串列表,这些域名将不会被考虑用于提取链接

  • 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',)。使用 '*' 表示考虑所有属性。

  • deny_tags (str 或 list) –

    一个或多个在提取链接时不应考虑的标签。它优先于 tags 参数,因此可以与 tags='*' 结合使用,以考虑除少数标签外的所有标签。默认为 ()(不排除任何标签)。

    在 2.17.0 版本中添加。

  • deny_attrs (str 或 list) –

    一个或多个在查找要提取的链接时不应考虑的属性。它优先于 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)。

extract_links(response: TextResponse) → list[Link][source]

从指定的 response 返回 Link 对象的列表。

只返回与传递给链接提取器 __init__ 方法的设置匹配的链接。

如果 unique 属性设置为 True,则省略重复链接,否则将返回它们。

链接

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 值。

上一页 下一页

© 版权所有 Scrapy 开发者。最后更新于 2026年7月7日。

使用 Sphinx 构建,采用 Read the Docs 提供的 主题。