【解耦:只需要完成一个简单的功能】
那些给你安利什么gevent/xpath什么的人,一定没有写过爬千万级或者亿级以上数据量的爬虫。按照你的需求,你有1500万条数据需要抓取,这1500万条数据分布在100万页网页中。那么,从以下几个方面给题主一点建议。


首先,存储的问题,爬虫的数据,尤其到了一个比较大的两极,sqlite3这种文件型的数据库最好不要用了,建议使用MongoDB做存储,简单实用,方便拓展爬虫的数据。其次,如果可以,将这100万页页码分解成100万个任务,放到一个MessageQueue中。


接着,在写程序的时候,不要考虑任何多线程多进程gevent或者任何会让你的程序“提速”的东西,你的爬虫只要完成一个简单的功能:接受一个输入,这里就是某一页的页码,得到的输出是这一页的15条数据,最好直接存储到数据库中。


最后一步,将上两步具体实现,建议使用RabbitMQ或者ActiveMQ,然后在上一步的接受输入变成从Queue中取一条任务。如果源网站不会因为访问频率过高而封你的IP,那么你可以在一台机器上多部几个爬虫实例,否则的话,你可以将你的代码部署到多台机器上。


aliyun按时间付费的机器很便宜,你可以开多点机器以加快速度。这样的好处是,你可以随时新增或减少一个爬虫实例,而不会影响之前已经部署的任何爬虫,也可以随时将抓取失败的页码数再次放入Queue中,而不影响正在抓取任务的爬虫。


作者:xlzd
链接:www.zhihu.com
展开
评论