一只优雅的小爬虫诞生记

爬虫,几家欢喜几人愁。爬者,拿到有利数据,分析行为,产生价值。被爬者,一是损失数据,二是遇到不怀好意的爬虫每每被全站复制或服务器受冲击而没法服务。今天说的是一只友好的爬虫是如何构建出来的,请勿用它伤害他人。python

爬虫一辈子所遇ajax

俗话说,若是我比别人看得远些,那是由于我站在巨人们的肩上。前人之鉴,后人之师。小爬虫在胎教的时候就该传授它的前辈参悟的人生经验,了解网络的可怕之处。看看我提供的胎教课程:redis

  • 被爬网站偶然出现服务没法响应,需重试
  • 网站检查某些header,特别是referer这个参数,请警戒
  • 访问频率限制,短期单IP或者单账号内每每有频率限制。更高级的还可能用近段时间访问频率,时间段请求频率来识别爬虫行为。
  • 目标爬取网站须要登陆
  • 网站采用js运算产生最终页面

小爬虫身份成谜docker

爬虫如此泛滥,网站安能不防备,识别之,封禁之爬虫就迫不得已了。你问该如何作?咱们从tcp/ip的角度来看,网站能够识别到ip地址。那么如此说来,网站封的颇有可能就是ip地址。网络上但是有代理服务器这种可怕东西存在的,爬虫依靠代理服务器假装身份,一旦被封禁,换代理又能够愉快的玩耍了。跨域

代理服务器那里来?这种东西,用搜索引擎一搜索就有了。若是你想省时省力,直接购买。然而在手头拮据的时候,只能寻找一些免费的代理。通常来讲每一个网站都会提供一点点免费代理,咱们只要勤快定时定后抓取入库便可,集腋成仇。浏览器

千万不要相信代理服务器就是可用的,要定时检查入库的代理是否有用,除了定时检查以外,咱们还能够借助squid,咱们只要把代理往里面一丢,爬虫代理直接设置成squid的ip和端口,这货就会自动挑选可用代理来使用,省了本身定时检测。服务器

题外话:免费的每每是最贵的,特别ip,带宽这种资源。网上提供的代理每每会注入一些广告js等东西,这个本身想解决方案了。网络

一个坚持不懈的爬虫多线程

一只爬虫的最高境界就是全自动化,无需人为干预,不过这种事情想一想便可,不可能实现的。可是小爬虫也有本身的修养的,最起码在各类异常面前不能一次就退缩了吧,出错重试屡次是必须的,最重要的是出现异常进程不能中断,任务仍是得接着完成的。架构

最简单的方法是什么呢?在循环里面搞一个try catch,是否是完美呢?大伙来看看这个例子:

一个简单粗暴的方式

然而这样子写是不道德,最重要的还不够优雅,因此再看看下面这个例子:

优雅的错误处理

应该分别抓取各类错误来分别处理,由于各类出错的应对策略是不同的。

小爬虫也须要团队做战

假如说,某一天爬虫接到任务,一天以内要爬取100万个网页。假设一个网页须要10秒,单进程单线程的爬虫是无法实现的。这个时候咱们能够利用下面几个方案:

  • 多线程(然而对于python来讲有GIL问题,因此优点不明显)
  • 多进程,一旦使用多进程就须要解决任务分配问题,和进程管理问题,这个时候咱们可使用消息中间件来分配任务,简简单单上一个redis队列,问题就迎刃而解了。
  • 爬虫集群,任务分配依旧可使用消息中间件,而部署咱们可使用伟大的docker,环境都无需配置了。

爬虫与浏览器的爱恨情愁

有不少网站呢,要么登陆的时候须要提交一些js计算后的值。有些数据还要js处理生成,若是咱们的爬虫要模拟js来运算,还得针对每个网站进行处理,这可一点都不优雅。

那么咋办呢?最简单的方案是,既然咱们的浏览器能渲染,那么咱们就去调用浏览器来拿到最终页面嘛,平时那些稀奇古怪的交互也一并解决了。对于python来讲,调用浏览器一点难度都没有,由于有神器selenium。

selenium能够很方便的使用python与谷歌呀火狐呀PhantomJS等这些浏览器交互,缺点是只是模拟了GET请求,也许你会说不是能够执行ajax,听我一句劝,你会被跨域请求坑住的。为了实现其它请求请再上一个库selenium-requests,然而这库的使用方法请查考requests,文档这样子也是无奈。

小爬虫优雅架构

优雅的小爬虫架构图

爬虫与反爬虫的较量是长久的,爬取过程千万要注意抓取页面异常的状况,触发反爬虫预警达到必定次数,账号或者IP就会被冻结。模拟登录验证码识别能够借助第三方平台,起码比本身写的验证码识别高效得多。

相关文章
相关标签/搜索