你真的知道了吗,爬虫工程师( 三 )


用C语言写肯定是自找苦吃了 。2.任务队列当爬虫任务很大的时候 , 写一个程序跑下来是不合适的:1.如果中间遇到错误停掉 , 重头再来?这不科学2.我怎么知道程序在哪里失败了?任务和任务之间不应该相互影响3.如果我有两台机器怎么分工?所以我们需要一种任务队列 , 它的作用是:讲计划抓取的网页都放到任务队列里面去 。然后worker从队列中拿出来一个一个执行 , 如果一个失败 , 记录一下 , 然后执行下一个 。
这样 , worker就可以一个接一个地执行下去 。也增加了扩展性 , 几亿个任务放在队列里也没问题 , 有需要可以增加worker , 就像多一双亏筷子吃饭一样 。常用的任务队列有kafka , beanstalkd , celery等 。3.数据库这个不用讲了 , 数据保存肯定要会数据库的 。不过有时候一些小数据也可以保存成json或者csv等 。
我有时想抓一些图片就直接按照文件夹保存文件 。推荐使用NoSQL的数据库 , 比如mongodb , 因为爬虫抓到的数据一般是都字段-值得对应 , 有些字段有的网站有有的网站没有 , mongo在这方面比较灵活 , 况且爬虫爬到的数据关系非常非常弱 , 很少会用到表与表的关系 。4.HTTP知识HTTP知识是必备技能 。因为要爬的是网页 , 所以必须要了解网页啊 。
首先html文档的解析方法要懂 , 比如子节点父节点 , 属性这些 。我们看到的网页是五彩斑斓的 , 只不过是被浏览器处理了而已 , 原始的网页是由很多标签组成的 。处理最好使用html的解析器 , 如果自己用正则匹配的话坑会很多 。我个人非常喜欢xpath , 跨语言 , 表达比价好 , 但是也有缺点 , 正则、逻辑判断有点别扭 。HTTP协议要理解 。
HTTP协议本身是无状态的 , 那么“登录”是怎么实现的?这就要求去了解一下session和cookies了 。GET方法和POST方法的区别(事实上除了字面意思不一样没有任何区别) 。浏览器要熟练 。爬虫的过程其实是模拟人类去浏览器数据的过程 。所以浏览器是怎么访问一个网站的 , 你要学会去观察 , 怎么观察呢?Developer Tools!Chrome的Developer Tools提供了访问网站的一切信息 。
从traffic可以看到所有发出去的请求 。copy as curl功能可以给你生成和浏览器请求完全一致的curl请求!我写一个爬虫的一般流程是这样的 , 先用浏览器访问 , 然后copy as curl看看有哪些header , cookies , 然后用代码模拟出来这个请求 , 最后处理请求的结果保存下来 。5.运维这个话题要说的有很多 , 实际工作中运维和开发的时间差不多甚至更多一些 。
维护已经在工作的爬虫是一个繁重的工作 。随着工作时间增加 , 一般我们都会学着让写出来的爬虫更好维护一些 。比如爬虫的日志系统 , 数据量的统计等 。将爬虫工程师和运维分开也不太合理 , 因为如果一个爬虫不工作了 , 那原因可能是要抓的网页更新了结构 , 也有可能出现在系统上 , 也有可能是当初开发爬虫的时候没发现反扒策略 , 上线之后出问题了 , 也可能是对方网站发现了你是爬虫把你封杀了 , 所以一般来说开发爬虫要兼顾运维 。
所以爬虫的运维我可以提供下面几个思路:首先 , 从数据增量监控 。定向爬虫(指的是只针对一个网站的爬虫)比较容易 , 一段时间之后对一些网站的数据增量会有一个大体的了解 。经常看看这些数据的增加趋势是否是正常就可以了(Grafana) 。非定向爬虫的数据增量不是很稳定 , 一般看机器的网络状况 , 网站的更新情况等(这方面我的经验不多) 。

推荐阅读