本篇内容主要讲解“怎么改造Scrapy从而实现多网站大规模爬取”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么改造Scrapy从而实现多网站大规模爬取”吧!
修改调度队列
Scrapy 默认的调度队列是scrapy.pqueues.ScrapyPriorityQueue,它适合做定向爬虫使用,对于通用爬虫,我们应该修改为scrapy.pqueues.DownloaderAwarePriorityQueue。在 settings.py文件中添加一行:
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'
提高并发量在
settings.py中增加配置:
CONCURRENT_REQUESTS = 100 CONCURRENT_REQUESTS_PER_DOMAIN = 100
但是并发量实际上受内存和 CPU 的限制,建议实际测试,选择最适合的数字。
提高 Twisted IO 线程池大小
Scrapy 在做 DNS 解析的时候,是阻塞式的。所以请求量越高,解析 DNS 就会越慢。为了避免这个情况,可以提高线程池的大小。在 settings.py中增加一个配置:
REACTOR_THREADPOOL_MAXSIZE = 20
搭建专用 DNS 服务器
如果爬虫进程数太多,并发又太快,可能会对 DNS 服务器形成 Dos 攻击。所以建议自己单独搭建一个 DNS 服务器。
减少日志量
Scrapy 默认是 DEBUG 级别的日志等级,每次爬取会产生大量的日志。通过把日志等级调整到INFO 可以大大减少日志量。在 settings.py 中增加一行:
LOG_LEVEL = 'INFO'
禁用 Cookies 和自动重试
大规模爬虫一般不需要用到 Cookies,所以可以把它禁用。请求失败的自动重试会降低爬虫的速度。但是由于大规模爬虫的爬取范围很大,对于个别失败的请求没有必要重试。因此修改settings.py:
COOKIES_ENABLED = False RETRY_ENABLED = False
降低请求超时时间,禁用自动跳转
有些网址因为远在大洋彼岸或者受到了干扰,请求响应时间很长。对于这种网址,应该果断放弃,避免影响其他网址的爬取。
禁用自动跳转功能,也有助于提高网页访问速度。
DOWNLOAD_TIMEOUT = 10 REDIRECT_ENABLED = False
使用广度有限搜索
Scrapy 默认基于深度优先(DFO)搜索算法。但在大规模爬虫中,我们一般会使用广度有限(BFO)搜索算法:
DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
关注内存,谨防内存泄露如果你发现爬虫占用大量内存,但是速度远远低于你设置的并发速度,那么要考虑是否发生了内存泄露。
到此,相信大家对“怎么改造Scrapy从而实现多网站大规模爬取”有了更深的了解,不妨来实际操作一番吧!这里是天达云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!