1.熟悉Python大部分的API
这是为了能够更好的处理程序所必须花费的代价。
对我来说我很熟悉Java,那么python就类比着了解。
2.批处理序列化
在爬取一本漫画时,非常的耗时。
需要将任务分成任务队列。
常用的任务队列有kafka,beanstalkd,celery等。
3.灵活&熟练1门最火的开源的数据库技术
有时候一些小数据也可以保存成json或者csv等。我有时想抓一些图片就直接按照文件夹保存文件。
推荐使用NoSQL的数据库,比如mongodb,因为爬虫抓到的数据一般是都字段-值得对应,有些字段有的网站有有的网站没有,mongo在这方面比较灵活,况且爬虫爬到的数据关系非常非常弱,很少会用到表与表的关系。
4.熟悉编译前端的技术
xpath
,Regex
。自不必说。
5.搜集关于HTTP相关的内容
最典型的就是请求头fake-header。最好将资源汇总到博客或github。
6.了解应对措施&知己知彼
爬虫与反爬
这同样是很深的一个话题,就像攻击武器与防御武器一样,双方总是在不断升级。常见的反爬措施(我遇到过的)有下面几种:
1.访问频率
很好理解,如果访问太频繁网站可能针对你的ip封锁一段时间,这和防DDoS的原理一样。对于爬虫来说,碰到这样的限制一下任务的频率就可以了,可以尽量让爬虫想人类一样访问网页(比如随机sleep一段时间,如果每隔3s访问一次网站很显然不是正常人的行为)。
2.登录限制
也比较常见。不过公开信息的网站一般不会有这个限制,这样让用户也麻烦了。其实反爬措施都或多或少的影响真实用户,反爬越严格,误杀用户的可能性也越高。对爬虫来说,登录同样可以通过模拟登录的方式解决,加个cookie就行了(话又说回来,网络的原理很重要)。
3.通过Header封杀
一般浏览器访问网站会有header,比如Safari或者Chrome等等,还有操作系统信息。如果使用程序访问并不会有这样的header。破解也很简单,访问的时候加上header就行。
4.JavaScript脚本动态获取网站数据
有一些网站(尤其是单页面网站)的内容并不是通过服务器直接返回的,而是服务器只返回一个客户端JavaScript程序,然后JavaScript获取内容。更高级的是,JavaScript在本地计算一个token,然后拿这个token来进行AJAX获取内容。而本地的JavaScript又是经过代码混淆和加密的,这样我们做爬虫的通过看源代码几乎不可能模拟出来这个请求(主要是token不可能破解),但是我们可以从另一个角度:headless的浏览器,也就是我们直接运行这个客户端程序,这可以100%地模拟真实用户!
5.验证码
这几乎是终极武器了,验证码是专门用来区分人和计算机的手段。对于反爬方来说,这种方式对真实用户和搜索引擎(其实可以通过记录搜索引擎爬虫的ip来区别对待,可以解决)的危害比较大,相信读者都有输入验证码的痛苦经历。但这种方法也并不是无敌的!通过现在很火的机器学习可以轻松的识别大部分的验证码!Google的reCAPTCHA是一种非常高级的验证码,但是听过通过模拟浏览器也是可以破解的。
6.ip限制
网站可能将识别的ip永久封杀,这种方式需要的人力比较大,而且误伤用户的代价也很高。但是破解办法却非常简单。目前代理池几乎是搞爬虫的标配了,甚至还有很多高匿代理等好用的东西。所以这基本上只能杀杀小爬虫。
7.网站内容反爬
有一些网站将网站内容用只有人类可以接收的形式来呈现(其实反爬就是区别对待人类和机器嘛)。比如将内容用图片的形式显示。但是近几年来人类和机器的差别越来越小,图片可以用OCR准确率非常高地去识别。
7.职业道德
成规模的爬虫一般都会使用集群,一般的小网站服务器规模可能不如爬虫集群的规模大。所以很多时候我们最好对要爬的网站限制一下频率。否则这些爬虫就相当于DoS攻击集群了!一般的网站都会有robots.txt可以参考。
作者:xlzd
链接:https://www.zhihu.com/question/36832667/answer/73237444
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
那些给你安利什么gevent/xpath什么的人,一定没有写过爬千万级或者亿级以上数据量的爬虫。按照你的需求,你有1500万条数据需要抓取,这1500万条数据分布在100万页网页中。那么,从以下几个方面给题主一点建议。首先,存储的问题,爬虫的数据,尤其到了一个比较大的两极,sqlite3这种文件型的数据库最好不要用了,建议使用MongoDB做存储,简单实用,方便拓展爬虫的数据。其次,如果可以,将这100万页页码分解成100万个任务,放到一个MessageQueue中。接着,在写程序的时候,不要考虑任何多线程多进程gevent或者任何会让你的程序“提速”的东西,你的爬虫只要完成一个简单的功能:接受一个输入,这里就是某一页的页码,得到的输出是这一页的15条数据,最好直接存储到数据库中。最后一步,将上两步具体实现,建议使用RabbitMQ或者ActiveMQ,然后在上一步的接受输入变成从Queue中取一条任务。如果源网站不会因为访问频率过高而封你的IP,那么你可以在一台机器上多部几个爬虫实例,否则的话,你可以将你的代码部署到多台机器上。阿里云按时间付费的机器很便宜,你可以开多点机器以加快速度。这样的好处是,你可以随时新增或减少一个爬虫实例,而不会影响之前已经部署的任何爬虫,也可以随时将抓取失败的页码数再次放入Queue中,而不影响正在抓取任务的爬虫。最后,如果你按照这样的思路完成,你只需要写爬虫和搭建MessageQueue,它们之间的交互已经有了现成的库xtls可以帮你:pypi: https://pypi.python.org/pypi/xtls/文档:xtls: awesome tools by xlzdgithub:xlzd/xtls · GitHub
ssl认证:模拟浏览器
代理池:request:可以填