打造一条爬虫
根据知名网站 stackoverflow 调查,被调查者 69% 都是非科班出生。
很多人学习一门语言的第一件事情不是做一个大的项目,而且用它来写一个爬虫,那么如何写好一条爬虫呢?这也是一个值得探讨的问题,爬虫与反爬虫就是实力的较量。
比如我们想爬豆瓣的热门书籍,热门电影,或者想把豆瓣的图书数据都爬下来,那我们应该怎么做呢?中间会遇到什么问题呢?
反爬虫措施一般有哪些呢?
-
验证码的方式,验证方式多种多样,图片验证码、拖动验证码、更加复杂变态的验证码等等。对于图片验证码,有一些简单的库来识别这些验证码图片,但是效果并不是很好。
-
频率、IP 限制,比如豆瓣网页,他是允许你少量爬一些资源的,但是如果同一个IP、同一个账号在比较短的时间内爬取大量的内容,他也会通过技术手段阻止你,往往是图片验证码
-
全局动态加载,要想爬别人的资源,那么首先需要得到网页的内容,但有些网站就是这么牛,网页最开始只加载一个 JS 文件,然后通过 JS 再去加载其他的内容信息,这样对爬虫是非常不友好的。因为爬虫不能像浏览器一样渲染页面啊,臣妾真的做不到。微博就是这样滴,要想爬取微博内容,做好心理准备。
那我们应该怎样取和这些反爬虫措施做斗争呢?
-
如果对方是图片验证码的方式、图片滑块的方式,完全可以使用人工打码的方式,就是把图片验证码或者滑块位置信息传输到第三方系统里面,让那些工人人工识别这些验证码,这还是一个产业链哦。
-
如果对方限制频率,那则可以采取分布式爬虫来工作,在云主机厂商多购买一些廉价的VPS,把任务分散开来,满足爬取频率上的需求。如果对方采取IP限制的方式,那就可以使用代理的方式工作,国内的一些代理网站出售的代理服务器地址非常糟糕,上次以学习为目的购买的代理,质量非常差,几百个IP里面也许只有几个可以正常 work,所以不建议购买,建议使用国外网站提供的,例如这家网站的免费代理质量非常高 freeproxylists
-
如果对方采取全局动态加载的方式来难为爬虫,那也不怕,selenium,将助你一臂之力,selenium 是一个中间的桥梁,他提供一个浏览器驱动程序,驱动程序能够驱动不同的浏览器达到相同的效果,他把细节封装在内部,对外提供统一的API,是不是很酷?当然搭配上 PhamtomJS 效果会更好,PhamtomJS 是一款无界面浏览器,他能够像 chrome、firefox 那样执行桌面浏览器的功能,适合在服务器端渲染页面,他的作者开发他的目的是用来进行 web 自动化测试的,但是用来做爬虫是灰常不错的哦。
-
智斗,一定要先分析被爬网站的特点,再不断修正自己的爬虫方案,这样才能让爬虫更加完美。
实战篇
看来大家对爬虫的兴趣还是挺高的,决定今天把实战内容加上。
实战目标是:爬取 freeproxylists 上的内容,并且尝试自动发布到简书上来。目标虽然看起来简单,但是他使用了 Google 验证的,本文主要是讲解如何有条理地制作一条爬虫,以及如何绕过它的验证。