当前位置: 首页 > 科技观察

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

时间:2023-03-20 13:30:13 科技观察

Scrapy框架默认用于开发针对性的爬虫。一般来说,spiders文件夹下的一个.py文件对应的就是爬取一个网站。但是还有一种爬虫,它不拘泥于提取页面上的特定文本,而是专注于如何并行爬取非常多的网站。这种爬虫可以实现大规模爬取。这种爬虫通常从几个种子URL开始爬取。输入每一个URL后,继续爬取该页面的所有URL作为新的种子URL,源源不断,无休止。但是爬完之后,一般会直接保存整个页面的源码,通过Kafka或者其他组件传递给另外一个服务进行分析。为了让Scrapy适应这种通用的解析逻辑,需要进行一些自定义修改。在Scrapy官方文档中,给出了几个修改建议。修改调度队列Scrapy默认的调度队列为scrapy.pqueues.ScrapyPriorityQueue,适用于定向爬虫。对于一般的爬虫,我们应该修改为scrapy.pqueues.DownloaderAwarePriorityQueue。在settings.py文件中添加一行:SCHEDULER_PRIORITY_QUEUE='scrapy.pqueues.DownloaderAwarePriorityQueue'来增加并发量在settings.py中增加配置:CONCURRENT_REQUESTS=100CONCURRENT_REQUESTS_PER_DOMAIN=100但是并发量其实是受内存和CPU限制的,建议实际测试,选择最合适的数字。增加TwistedIO线程池的大小。Scrapy在做DNS解析时阻塞。所以请求量越大,解析DNS的速度就越慢。为避免这种情况,可以增加线程池的大小。在settings.py中添加配置:REACTOR_THREADPOOL_MAXSIZE=20,搭建专用的DNS服务器。如果爬虫进程过多,并发过快,则可能对DNS服务器形成Dos攻击。所以建议自己架设DNS服务器。减少日志量Scrapy默认的日志级别为DEBUG级别,每次爬取都会产生大量的日志。通过将日志级别调整为INFO,可以大大减少日志量。在settings.py中添加一行:LOG_LEVEL='INFO'禁用cookie并自动重试大型爬虫一般不需要使用cookie,所以可以禁用。自动重试失败的请求会减慢爬虫的速度。但是由于大型爬虫的爬取范围大,没有必要对个别失败的请求进行重试。因此,修改settings.py:COOKIES_ENABLED=FalseRETRY_ENABLED=False,减少请求超时时间,关闭自动重定向。有些网址因为远在大洋彼岸或受到干扰而需要很长时间才能响应请求。对于这种网址,要果断放弃,以免影响其他网址的抓取。禁用自动跳转功能也有助于提高网页访问速度。DOWNLOAD_TIMEOUT=10REDIRECT_ENABLED=False使用有限广度搜索Scrapy默认基于深度优先(DFO)搜索算法。但是在大型爬虫中,我们一般会使用广度限制(BFO)搜索算法:DEPTH_PRIORITY=1SCHEDULER_DISK_QUEUE='scrapy.squeues.PickleFifoDiskQueue'SCHEDULER_MEMORY_QUEUE='scrapy.squeues.FifoMemoryQueue'关注内存,谨防内存泄漏如果你发现爬虫占用了很多内存,但是速度却远低于你设置的并发速度,那么就要考虑是否发生了内存泄漏。