前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何改造 Scrapy 从而实现多网站大规模爬取?

如何改造 Scrapy 从而实现多网站大规模爬取?

作者头像
崔庆才
发布2020-10-30 11:13:42
1.8K0
发布2020-10-30 11:13:42
举报
文章被收录于专栏:进击的Coder进击的Coder

阅读本文大概需要 2 分钟。”

Scrapy 框架默认是用来开发定向爬虫的。一般情况下,在 spiders 文件夹下面的一个.py 文件对应了一个网站的爬取。

但还有另外一种爬虫,它不会拘泥于提取页面上的特定文字,而是关注如何并行爬取非常多的网站。这种爬虫可以实现大规模的爬取。这种爬虫,一般是从若干个种子网址开始爬。进入每个网址后,把该页面的所有网址作为新的种子网址继续爬取,源源不断,生生不息。但爬到以后,一般直接把整个页面的源代码保存下来,通过 Kafka 或者其他组件传给另外的服务进行解析。

为了让 Scrapy 适配这种通用的解析逻辑,需要做一些定制化修改。Scrapy 官方文档中,给出了几点修改建议[1]。

修改调度队列

Scrapy 默认的调度队列是scrapy.pqueues.ScrapyPriorityQueue,它适合做定向爬虫使用,对于通用爬虫,我们应该修改为scrapy.pqueues.DownloaderAwarePriorityQueue。在 settings.py文件中添加一行:

代码语言:javascript
复制
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'

提高并发量

settings.py中增加配置:

代码语言:javascript
复制
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_DOMAIN = 100

但是并发量实际上受内存和 CPU 的限制,建议实际测试,选择最适合的数字。

提高 Twisted IO 线程池大小

Scrapy 在做 DNS 解析的时候,是阻塞式的。所以请求量越高,解析 DNS 就会越慢。为了避免这个情况,可以提高线程池的大小。在 settings.py中增加一个配置:

代码语言:javascript
复制
REACTOR_THREADPOOL_MAXSIZE = 20

搭建专用 DNS 服务器

如果爬虫进程数太多,并发又太快,可能会对 DNS 服务器形成 Dos 攻击。所以建议自己单独搭建一个 DNS 服务器。

减少日志量

Scrapy 默认是 DEBUG 级别的日志等级,每次爬取会产生大量的日志。通过把日志等级调整到INFO 可以大大减少日志量。在 settings.py 中增加一行:

代码语言:javascript
复制
LOG_LEVEL = 'INFO'

禁用 Cookies 和自动重试

大规模爬虫一般不需要用到 Cookies,所以可以把它禁用。请求失败的自动重试会降低爬虫的速度。但是由于大规模爬虫的爬取范围很大,对于个别失败的请求没有必要重试。因此修改settings.py

代码语言:javascript
复制
COOKIES_ENABLED = False
RETRY_ENABLED = False

降低请求超时时间,禁用自动跳转

有些网址因为远在大洋彼岸或者受到了干扰,请求响应时间很长。对于这种网址,应该果断放弃,避免影响其他网址的爬取。

禁用自动跳转功能,也有助于提高网页访问速度。

代码语言:javascript
复制
DOWNLOAD_TIMEOUT = 10
REDIRECT_ENABLED = False

使用广度有限搜索

Scrapy 默认基于深度优先(DFO)搜索算法。但在大规模爬虫中,我们一般会使用广度有限(BFO)搜索算法:

代码语言:javascript
复制
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

关注内存,谨防内存泄露

如果你发现爬虫占用大量内存,但是速度远远低于你设置的并发速度,那么要考虑是否发生了内存泄露。

参考资料

[1]

修改建议: https://doc.scrapy.org/en/latest/topics/broad-crawls.html

好文和朋友一起看~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击的Coder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 修改调度队列
  • 提高并发量
  • 提高 Twisted IO 线程池大小
  • 搭建专用 DNS 服务器
  • 减少日志量
  • 禁用 Cookies 和自动重试
  • 降低请求超时时间,禁用自动跳转
  • 使用广度有限搜索
  • 关注内存,谨防内存泄露
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档