simpx
2014-02-12 10:21:18 +08:00
刚结束了自己的一个项目(爬虫+搜索),爬虫部分用的就是python gevent,我的经验可供参考下。
项目初期,我仅仅实现了一个demo,最简单的多线程+requests库+beautiful soup
后来为了性能,重构为异步IO,在tornado和gevent之间选择了一下,最后选择了gevent,倒不是因为技术原因,而是因为gevent更好写:) 而且还monkey patch了线程等库。此次重构还用自己写的正则匹配,替代了beautiful soup
再后来,爬虫抓取的目标增加了访问频率限制,不得不为爬虫增加了一个动态选择代理的功能,此次的重构耗时较多,也是此次重构为之后埋下了坑,动态选择的过程、代理的不稳定也成了耗时的原因。
为了进一步提速,但又需要绕过访问限制,而自己的服务器资源又不多(其实就一台爬虫服务器)。进行了又一次重构,此次重构可以说是业务上的进步,技术上的“倒退”,我发现如果进一步理解用户需求的话,其实用户需要的80%都是热点数据,而热点数据并不多。
于是改成了最简单的构架,多进程+requests库,用不到200行代码写了爬虫,把复杂的动态选择代理功能去了,仅仅用一个进程一个ip的原始策略抓取热点数据。多运行几个爬虫,问题就都解决了,而且稳定性,可维护性极大提升。
作为总结的废话是,如果楼主是打算做实际的项目,上线、盈利甚至以后会交给别人维护项目、代码,可以多分析一下用户需求,和自己的资源能力。写个爬虫做项目简单,解决自己埋下的坑很难。