Scrapy-Link Extractors(链接提取器)

本文详细介绍了Scrapy中的LinkExtractor,它是用于从网页中提取跟随链接的工具。LinkExtractor提供了多种过滤选项,如allow和deny,可以根据正则表达式或域名进行筛选。文章还讨论了内置的LxmlLinkExtractor类,以及如何在Spider和CrawlSpider中使用它。此外,文章通过示例展示了如何使用CrawlSpider的Rule进行全站爬取,并提供了豆瓣图书Top250、腾讯招聘职位信息和校花网图片爬取的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Link Extractors 中文文档:https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/link-extractors.html
Link Extractors 英文文档:http://doc.scrapy.org/en/latest/topics/link-extractors.html


利用爬虫Scrapy中的LinkExtractor(链接提取器)爬租房信息(全站爬虫):https://www.jianshu.com/p/57c1e34c03cb
scrapy高级用法之自动分页:https://my.oschina.net/u/2351685/blog/612940?fromerr=QnjXr0Pi

python爬虫之Scrapy框架( CrawlSpider ):https://www.cnblogs.com/sui776265233/p/9724147.html

CrawlSpider使用分析(详解):https://blog.csdn.net/godot06/article/details/81672900

链接提取器

链接提取器 的 目的 就是从 网页(scrapy.http.Response 对象中,将最终 跟随(follow) 网页(即 scrapy.http.Response 对象) 的 链接 提取出来。简单的说:就是用于从服务器返回的 response 里抽取 url,用以进行之后的操作。

可以在 Scrapy 中 直接使用 scrapy.linkextractors import LinkExtractor  提取链接,你也可以创建自己的自定义链接提取器,以满足您的需求通​​过实现一个简单的界面。

每个 link extractor(链接提取器)有唯一的公共方法是 extract_links, 它 接收一个Response对象 并返回一个 scrapy.link.Link对象 列表。链接提取器要被实例化一次,但是它的 extract_links 方法可以被 不同 的 网页( scrapy.http.Response 对象)调用好几次,用来 提取 不同 网页中  跟随 的 链接。

Link Extractors在 CrawlSpider 类( 在 Scrapy 可用 )中使用,通过一套规则,但你也可以用它在你的Spider中,即使你不是从 CrawlSpider 继承的子类,因为它的目的很简单:提取链接。

内置链接提取器参考

Scrapy 提供的 Link Extractor 类在 scrapy.linkextractors 模 块提供。 默认的 link extractor 是 LinkExtractor , 其实就是 LxmlLinkExtractor:

from scrapy.linkextractors import LinkExtractor

以前的 Scrapy 版本中曾经有过其他链接提取器类,但 现在已经过时了。

LxmlLinkExtractor

class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=()deny=()allow_domains=()deny_domains=()deny_extensions=Nonerestrict_xpaths=()restrict_css=()tags=('a''area')attrs=('href')canonicalize=Falseunique=Trueprocess_value=Nonestrip=True)

LxmlLinkExtractor 是推荐的 链接提取器 与 方便的 过滤选项。它使用 lxml 的强大的 HTMLParser 实现。

参数 解释:

  • allow( 正则表达式 或 正则表达式列表 ): 一个单一的正则表达式(或正则表达式列表),(绝对)urls 必须匹配才能提取。如果没有给出(或为空),它将匹配所有链接。
  • deny( 正则表达式 或 正则表达式列表 ): 一个正则表达式(或正则表达式列表),(绝对)urls必须匹配才能排除(即不提取)。它优先于 allow 参数。如果没有给出(或为空),它不会排除任何链接。,可以 和 allow 配合一起用,前后夹击,参数和 allow 一样。
  • allow_domains( str 或 str 的 list ):允许 的 域名 或者 域名列表。即 会被提取的链接的 domains。其实这个和 spider 类里的 allowdomains 是一个作用,即 抓取哪个域名下的网站。
  • deny_domains(str 或 str 的 list ):拒绝 的 域名 或者 域名列表。即 不会被提取链接的 domains。和 allowdomains 相反,即 拒绝哪个域名下的网站。
  • deny_extensions( list ):包含在提取链接时应该忽略的扩展的单个值或字符串列表。即不允许的扩展名。如果没有给出(默认 是 None),它将默认为 IGNORED_EXTENSIONS 在 scrapy.linkextractors 包中定义的 列表 。(参考: http://www.xuebuyuan.com/296698.html)
  • restrict_xpaths( str 或 list ):一个XPath(或XPath的列表),它定义了从Response哪些区域中来提取链接。即 在网页哪个区域里提取链接,可以用 xpath 表达式和 css 表达式这个功能是划定提取链接的位置,让提取更加精准。如果给出,只有那些XPath选择的文本将被扫描链接。参见下面的例子。即 使用 xpath表达式,和allow共同作用过滤链接。
  • restrict_css( str 或 list ):一个CSS选择器(或选择器列表),用于定义响应中应提取链接的区域。同 restrict_xpaths。
  • tags( str 或 list ):提取链接时要考虑的 标签标签列表。默认为('a', 'area')。即 默认提取a标签和area标签中的链接
  • attrs( list ):在查找要提取的链接时应该考虑的属性或属性列表(仅适用于参数中指定的那些标签tags )。默认为('href',)。即 默认提取 tags 里的 href 属性,也就是 url 链接。
  • canonicalize( boolean ):规范化每个提取的url(使用 w3lib.url.canonicalize_url)。默认为True。 canonicalize each extracted url (using w3lib.url.canonicalize_url). Defaults to False. Note that canonicalize_url is meant for duplicate checking; it can change the URL visible at server side, so the response can be different for requests with canonicalized and raw URLs. If you’re using LinkExtractor to follow links it is more robust to keep the default canonicalize=False.
  • unique( boolean ):是否对提取的链接进行过滤。即 这个地址是否要唯一,默认true,重复收集相同的地址没有意义。
  • process_value ( callable ) – 它接收来自扫描标签和属性提取每个值,可以修改该值,并返回一个新的,或返回 None 完全忽略链接的功能。如果没有给出,process_value 默认是 lambda x: x。其实
### Scrapy-Redis 分布式爬虫框架概述 Scrapy-Redis 是一个扩展库,旨在使多个 Scrapy 爬虫实例共享相同的待爬取 URL 队列以及已处理过的指纹记录。这使得不同机器上的多个爬虫可以协同工作,从而提高效率并减少资源浪费[^1]。 #### 主要特性 - **URL 调度器集成**:通过配置 `SCHEDULER` 参数为 `'scrapy_redis.scheduler.Scheduler'` 来启用 Redis 作为调度器。 - **请求去重机制**:利用 Redis 的集合数据结构来存储已经访问过页面的唯一标识符(通常是哈希后的 URL 或者其他形式的指纹)。设置项 `DUPEFILTER_CLASS='scrapy_redis.dupefilter.RFPDupeFilter'` 可以激活此功能[^3]。 - **持久化支持**:即使在爬虫意外终止的情况下也能保持进度不变,因为所有的状态都保存到了 Redis 中。当重启服务时可以从上次停止的地方继续执行任务。 #### 安装与基本配置 为了开始构建基于 Scrapy 和 Redis 的分布式爬虫应用,首先需要安装必要的依赖包: ```bash pip install scrapy-redis ``` 接着,在项目的 settings 文件里加入如下几行代码来进行初始化配置: ```python # 启用 Redis 调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 不清除 Redis 队列中的请求队列, 允许暂停/恢复运行 SCHEDULER_PERSIST = True # 设置请求去重类 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 将所有抓取到的数据保存至指定的 Redis 键名下 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } # 连接本地 Redis 实例,默认端口6379 REDIS_HOST = 'localhost' REDIS_PORT = 6379 ``` #### 创建简单的 Spider 示例 下面是一个非常基础的例子展示如何定义一个新的 Spider 类继承自 `CrawlSpider` 并将其连接到 Redis 上面: ```python import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.utils import bytes_to_str class ExampleSpider(CrawlSpider): name = 'example_spider' allowed_domains = ['example.com'] start_urls = ['http://www.example.com'] rules = ( Rule(LinkExtractor(allow=r'/page/\d+$'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} # 提取所需字段... yield item if __name__ == '__main__': from scrapy.crawler import CrawlerProcess process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'FEED_FORMAT': 'json', 'FEED_URI': 'items.json', 'LOG_LEVEL': 'INFO', 'DOWNLOAD_DELAY': 2, 'CONCURRENT_REQUESTS_PER_DOMAIN': 8, # 添加 Scrapy-Redis 特定选项 'SCHEDULER': "scrapy_redis.scheduler.Scheduler", 'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter" }) process.crawl(ExampleSpider) process.start() ``` 上述例子展示了怎样创建一个名为 `example_spider` 的爬虫,并指定了它应该遵循哪些链接模式 (`Rule`) 。每当匹配成功的链接被发现时就会调用 `parse_item()` 方法进一步解析目标网页内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值