找回密码
 立即注册

QQ登录

只需一步,快速开始

Python在Scrapy中设置收罗深度的实现

2024-11-5 01:46| 发布者: c2688| 查看: 474| 评论: 0

摘要: 目次1. 什么是收罗深度?2. 为什么要控制收罗深度?3. 怎样在 Scrapy 中设置收罗深度?3.1 使用 DEPTH_LIMIT 设置最大收罗深度3.2 启用深度统计信息:DEPTH_STATS3.3 结合 DEPTH_PRIORITY 控制收罗计谋4. 示例:控制
目次

Scrapy 是一个非常强大的 Python 爬虫框架,它允许开发者通过少量的代码爬取网站中的数据。为了控制爬虫的活动,Scrapy 提供了许多设置选项,此中 收罗深度 是一个关键参数。收罗深度控制爬虫从起始 URL 开始,深入爬取链接的层级。公道设置收罗深度可以资助你优化爬虫的服从,避免不必要的深度爬取,也可以防止爬虫陷入无尽的链接循环。

本文将具体先容在 Scrapy 中怎样设置收罗深度,以及怎样控制和监控爬取深度来进步爬虫的性能和数据质量。

1. 什么是收罗深度?

收罗深度(Crawl Depth)是指爬虫从初始 URL(种子 URL)出发,爬取页面中的链接时所递归的条理。假设你有以下网页条理布局:

[code]Page 1 (初始 URL)├── Page 2 (深度 1)│   ├── Page 3 (深度 2)│   └── Page 4 (深度 2)└── Page 5 (深度 1)[/code]

在这个例子中:

Page 1 是初始页面,深度为 0。
Page 2 和 Page 5 是初始页面的直接链接,深度为 1。
Page 3 和 Page 4 是从 Page 2 链接到的页面,深度为 2。
通过控制收罗深度,你可以限定爬虫在页面之间的递归条理,避免陷入过深的链接链条,从而更高效地爬取数据。

2. 为什么要控制收罗深度?

控制收罗深度有助于管理爬虫的性能,以下是常见的几个缘故因由:

  • 避免深条理链接循环:很多网站存在深条理的链接循环,爬虫在没有深度限定时可能会无限定地爬取,从而浪费大量时间和资源。
  • 进步爬取服从:通常,页面的核心内容存在于较浅的条理,深条理的页面可能是无关的或不紧张的。限定深度可以进步数据获取的服从。
  • 防止爬虫陷入死循环:通过限定深度可以防止爬虫在动态天生的或布局复杂的页面中迷失。
  • 淘汰数据量:收罗深度控制能够避免爬取过多不必要的页面,尤其是在大规模爬取中,有助于淘汰数据的冗余。

3. 怎样在 Scrapy 中设置收罗深度?

Scrapy 提供了几个关键设置项来控制爬虫的收罗深度:

  • DEPTH_LIMIT:用于限定爬虫的最大深度。
  • DEPTH_STATS:用于启用深度统计信息,资助你监控爬取的深度。
  • DEPTH_PRIORITY:用于设置爬虫的收罗计谋(深度优先或广度优先)。

3.1 使用 DEPTH_LIMIT 设置最大收罗深度

DEPTH_LIMIT 是 Scrapy 中用于限定爬虫最大爬取深度的设置项。你可以在 settings.py 中设置它。默认情况下,Scrapy 没有深度限定(即不限深度爬取),假如你想限定爬取的深度,可以通过设置该参数来实现。

示例:限定爬虫最多爬取 3 层页面

在 Scrapy 项目标 settings.py 文件中,添加以下设置:

[code]# settings.py # 设置爬虫的最大爬取深度为 3 DEPTH_LIMIT = 3 [/code]

这样,爬虫只会爬取到初始 URL 的 3 层深度。假如爬虫从 Page 1 开始,最多会爬取到 Page 4,深度为 2 的页面。

3.2 启用深度统计信息:DEPTH_STATS

Scrapy 允许你启用深度统计,通过 DEPTH_STATS 设置项来查看每层深度的页面抓取情况。这个功能非常有效,可以资助你相识爬虫的爬取深度和页面分布情况。

要启用深度统计,在 settings.py 中设置:

[code]# settings.py # 启用深度统计 DEPTH_STATS = True # 启用统计信息的打印输出 DEPTH_STATS_VERBOSE = True [/code]

当你启用 DEPTH_STATS_VERBOSE 后,Scrapy 会在爬取结束时打印出每个深度的抓取统计信息,包罗每一层有多少页面被抓取。

输出示例:

[code]Depth stats:    depth=0 - 1 pages   depth=1 - 10 pages   depth=2 - 25 pages   depth=3 - 30 pages[/code]

这份陈诉清楚地显示了爬虫在每一层抓取了多少页面,资助你评估爬取的覆盖范围。

3.3 结合 DEPTH_PRIORITY 控制收罗计谋

除了限定爬取深度外,Scrapy 还允许你通过 DEPTH_PRIORITY 控制爬虫是采用 深度优先(DFS)还是 广度优先(BFS)计谋。

设置 DEPTH_PRIORITY = 1 可以使爬虫更倾向于深度优先搜刮。
设置 DEPTH_PRIORITY = -1 则可以使爬虫更倾向于广度优先搜刮(这是默认值)。
比方,假如你盼望爬虫使用深度优先收罗,优先抓取新发现的页面:

[code]# settings.py # 设置为深度优先搜刮 DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue' [/code]

假如你盼望爬虫默认使用广度优先搜刮(即逐层抓取,直到抓取到最大深度),可以保存默认设置或将 DEPTH_PRIORITY 设置为 -1:

[code]# settings.py # 使用广度优先搜刮(默认) DEPTH_PRIORITY = -1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue' [/code]

4. 示例:控制 Scrapy 爬虫的收罗深度

以下是一个简朴的 Scrapy 爬虫示例,展示怎样使用 DEPTH_LIMIT 控制爬取深度,并启用深度统计。

爬虫代码:

[code]import scrapy class DepthSpider(scrapy.Spider): name = 'depth_spider' start_urls = ['https://example.com'] def parse(self, response): self.log(f'爬取页面: {response.url}') # 提取页面中的链接并继承爬取 for href in response.css('a::attr(href)').getall(): yield scrapy.Request(url=response.urljoin(href), callback=self.parse) [/code]

settings.py 文件:

[code]# settings.py # 设置最大爬取深度为3 DEPTH_LIMIT = 3 # 启用深度统计 DEPTH_STATS = True DEPTH_STATS_VERBOSE = True # 使用深度优先计谋 DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue' [/code]

运行爬虫:
在下令行中运行爬虫:

[code]scrapy crawl depth_spider [/code]

爬虫将会遵照深度优先计谋,最多爬取 3 层页面,并在爬取完成后输出每个深度的统计信息。

5. 怎样动态调整收罗深度?

除了在 settings.py 中设置收罗深度,还可以在运行爬虫时动态设置深度限定。你可以通过下令行传递 DEPTH_LIMIT 参数,而不需要修改 settings.py 文件。

比方,在运行爬虫时设置深度限定为 2:

[code]scrapy crawl depth_spider -s DEPTH_LIMIT=2 [/code]

这种方式非常灵活,适合在不同的场景下快速调整爬虫的活动。

6. 总结

通过公道控制 Scrapy 爬虫的收罗深度,可以资助你优化爬取服从,避免陷入无尽的链接循环,并限定爬虫获取过多不相干的内容。Scrapy 提供了 DEPTH_LIMIT、DEPTH_STATS 和 DEPTH_PRIORITY 等设置选项,允许你灵活地控制爬虫的深度、监控抓取过程,并设置适合的收罗计谋。

到此这篇关于Python在Scrapy中设置收罗深度的实现的文章就先容到这了,更多相干Scrapy设置收罗深度内容请搜刮脚本之家从前的文章或继承欣赏下面的相干文章盼望各人以后多多支持脚本之家!


来源:https://www.jb51.net/python/328811w2h.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

最新评论

关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 19:18 , Processed in 0.042843 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部