Python爬虫一天抓取百万张网页的方法是什么

  介绍

小编给大家分享一Python爬下虫一天抓取百万张网页的方法是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

<强>一、优化硬盘存储

所以千万级网页的抓取是需要先设计的,先来做一个计算题。共要抓取一亿张页面,一般一张网页的大小是400 kb左右,一亿张网页就是1个亿X200KB=36结核病。这么大的存储需求,一般的电脑和硬盘都是没法存储的,所以肯定要对网页做压缩后存储,可以用zlib压缩,也可以用压缩率更好的bz2或获取pylzma。

 Python爬虫一天抓取百万张网页的方法是什么

<强>二、优化内存,URL去重

再来说内存占用问题,做爬虫程序为了防止重复抓取URL,一般要把URL都加载进内存里,放()在组里面。拿天眼查的URL举例:https://www.tianyancha.com/company/23402373


这个完整URL有44个字节,一亿个URL就是4 g,一亿个URL就要占用4 g内存,这还没有算存这一亿个URL需要的数据结构内存,还有待抓取URL,已抓取URL还保存在内存中的html等等消耗的内存。

所以这样直接用集()保存URL是不建议的,除非你的内存有十几个g .

一个取巧的办法是截断URL。只把URL: https://www.tianyancha.com/company/23402373

的后缀:23402373放进组()里,23402373只占8个字节,一亿个URL占700多米内存。

但是如果你是用的野云主机,用来不断拨号用的非正规云主机,这700多米内存也是吃不消的,机器会非常卡。

就还需要想办法压缩URL的内存占用,可以使用BloomFilter算法,是一个很经典的算法,非常适用海量数据的排重过滤,占用极少的内存,查询效率也非常的高。它的原理是把一个字符串映射到一个点上,刚才23402373占8个字节,现在只占用1个点(1字节=8位),内存节省了近64倍,以前700米内存,现在只需要10多米了。

BloomFilter调用也非常简单,当然需要先安装安装bloom_filter:

得到bloom_filter  import  BloomFilter   #,生成一个装1亿大小的   时间=bloombloom  BloomFilter (max_elements=100000000,, error_rate=0.1)   #,向布鲁姆添加URL   bloom.add (& # 39; https://www.tianyancha.com/company/23402373& # 39;)   #判断URL是否在bloombloom.__contains__ (& # 39; https://www.tianyancha.com/company/23402373& # 39;)

不过奇怪,布鲁姆里没有公有方法来判断URL是否重复,我用的__contains__()方法,也可能是我没用对,不过判重效果是一样的。

<强>,三,反抓取访问频率限制

单台机器,单个IP大家都明白,短时间内访问一个网站几十次后肯定会被屏蔽的。每个网站对IP的解封策略也不一样,有1小的时候后又能重新访问,有的要一天,有的要几个月去了。突破抓取频率限制有两种方式,一种是研究网站的反爬策略。有的网站不对列表页做频率控制,只对详情页控制。有的针对特定UA,推荐人,或者微信的H5页面的频率控制要弱很多。

另一种方式就是多IP抓取,多IP抓取又分IP代理池和adsl拨号两种,这里说adsl拨号的方式。

adsl的特点是可以短时间内重新拨号切换IP, IP被禁止了重新拨号一下就可以了。这样你就可以开足马力疯狂抓取了,但是一天只有24小时合86400秒,要如何一天抓过百万网页,让网络性能最大化也是需要下一些功夫的,后面我再详说。

至于有哪些可以adsl拨号的野云主机,你在百度搜“vps adsl”,能选择的厂商很多的。大多宣称有百万级IP资源可拨的号,我曾测试过一段时间,把每次拨号的IP记录下来,有真实二三十万IP的就算不错了。

选adsl的一个注意事项是,有的厂商拨号IP只能播出C段和D段IP, 110(段).132 (B段)。3 (C段)2 (D段),A和B段都不会变,靠C, D段IP高频次抓取对方网站,有可能对方网站把整个C/D段IP都封掉。

C/D段加一起255 x255就是6万多个IP全都报废,所以要选拨号IP范围较宽的厂商。你要问我哪家好,我也不知道,这些都是野云主机、质量和稳定性本就没那么好。只有多试一试,试的成本也不大,买一台玩玩一个月也就一百多元,还可以按天买。

<强>四,网络性能,抓取技术细节调优

上面步骤做完了,每天能达到抓取五万网页的样子,要达到百万级规模,还需把网络性能和抓取技术细节调优。

<强> 1。调试开多少个线程,多长时间拨号切换IP一次最优。

Python爬虫一天抓取百万张网页的方法是什么