起薪2万的爬虫工程师,需要具备哪些技能?
优采云 发布时间: 2022-04-30 17:16起薪2万的爬虫工程师,需要具备哪些技能?
HTTP协议本身是无状态的,那么“登录”是怎么实现的?这就要求去了解一下session和cookies了。
(4)GET方法和POST方法的区别;
(5)浏览器要熟练;
爬虫的过程其实是模拟人类去浏览器数据的过程,所以浏览器是怎么访问一个网站的,要学会去观察。
Chrome的Developer Tools提供了访问网站的一切信息;
从traffic可以看到所有发出去的请求,copy as curl功能可以给你生成和浏览器请求完全一致的curl请求!
我写一个爬虫的一般流程是先用浏览器访问,然后copy as curl看看有哪些header,cookies,然后用代码模拟出来这个请求,最后处理请求的结果保存下来。
数据库
这个就不用多讲了,数据保存肯定会要用到数据库的。
有些时候一些小数据也可以保存成json或者csv等,推荐使用NoSQL的数据库,比如mongodb。
因为爬虫抓到的数据一般是都字段-值得对应,有些字段有的网站有有的网站没有。
mongo在这方面比较灵活,况且爬虫爬到的数据关系非常非常弱,很少会用到表与表的关系。
运 维
这个话题要说的有很多,实际工作中运维和开发的时间差不多甚至更多一些。
维护已经在工作的爬虫是一个繁重的工作,随着工作时间增加,一般我们都会学着让写出来的爬虫更好维护一些。
比如爬虫的日志系统,数据量的统计等,将爬虫工程师和运维分开也不太合理。
因为如果一个爬虫不工作了,那原因可能是要抓的网页更新了结构,也有可能出现在系统上,也有可能是当初开发爬虫的时候没发现反扒策略,上线之后出问题了。
也可能是对方网站发现了你是爬虫把你封杀了,所以一般来说开发爬虫要兼顾运维。
爬虫的运维我可以提供下面几个思路:
(1)从数据增量监控;
定向爬虫(指的是只针对一个网站的爬虫)比较容易,一段时间之后对一些网站的数据增量会有一个大体的了解。
经常看看这些数据的增加趋势是否是正常就可以了(Grafana),非定向爬虫的数据增量不是很稳定,一般看机器的网络状况,网站的更新情况等。
(2)看爬虫执行的成功情况;
在上面提到了用任务队列控制爬虫工作,这样解耦可以带来很多好处,其中一个就是可以就是可以对一次爬虫执行进行日志。
可以在每次爬虫任务执行的时候,将执行的时间、状态、目标url、异常等放入一个日志系统(比如kibana),然后通过一个可视化的手段可以清晰地看到爬虫的失败率。
(3)爬虫抛出的Exception;
几乎所有的项目都会用到错误日志收集(Sentry)
这里需要注意的一点是,忽略正常的异常(比如Connection错误,锁冲突等),否则的话你会被这些错误淹没。
爬虫与反爬
这是一个不断较量的过程,就像攻击武器与防御武器一样。
01 IP限制
网站可能将识别的ip永久封杀,这种方式需要的人力比较大,而且误伤用户的代价也很高。
但是破解办法却非常简单,目前代理池几乎是搞爬虫的标配了,甚至还有很多高匿代理等好用的东西,所以这基本上只能杀杀小爬虫。
02登录限制
这也比较常见,不过公开信息的网站一般不会有这个限制,其实反爬措施或多或少的都会影响真实用户,反爬越严格,误杀用户的可能性也越高。
对爬虫来说,登录同样可以通过模拟登录的方式解决,加个cookie就行了(话又说回来,网络的原理很重要)。
03访问频率
这很好理解,如果访问太频繁,网站可能针对你的ip封锁,这和防DDoS的原理一样。
碰到这样的,限制一下爬虫任务的频率和时间就可以了,尽量让爬虫想人类一样访问网页。
比如随机sleep一段时间,如果每隔3s访问一次网站很显然不是正常人的行为,也就是控制访问的时间和频率;
04通过Header封杀
一般浏览器访问网站会有header,比如Safari或者Chrome等等,还有操作系统信息,如果使用程序访问并不会有这样的header。
破解也很简单,访问的时候加上header就行。
05验证码
验证码的形式各种各样的都有,难度不小;
验证码是专门用来区分人和计算机的手段,对于反爬方来说,这种方式对真实用户和搜索引擎(其实可以通过记录搜索引擎爬虫的ip来区别对待,可以解决)的危害比较大。
但这种方法也并不是无敌的,通过现在很火的机器学习可以轻松的识别大部分的验证码!
Google的reCAPTCHA是一种非常高级的验证码,但是听说通过模拟浏览器也是可以破解的。
06网站内容反爬
有一些网站将网站内容用只有人类可以接收的形式来呈现(其实反爬就是区别对待人类和机器嘛)。
比如将内容用图片的形式显示,但是近几年来人类和机器的差别越来越小,图片可以用OCR准确率非常高地去识别。
07JavaScript脚本动态
JavaScript脚本动态获取网站数据;
有一些网站(尤其是单页面网站)的内容并不是通过服务器直接返回的,而是服务器只返回一个客户端JavaScript程序,然后JavaScript获取内容。
更高级的是,JavaScript在本地计算一个token,然后拿这个token来进行AJAX获取内容,而本地的JavaScript又是经过代码混淆和加密的。
这样我们做爬虫的通过看源代码几乎不可能模拟出来这个请求(主要是token不可能破解)。
但是我们可以从另一个角度:headless的浏览器,也就是我们直接运行这个客户端程序,这可以100%地模拟真实用户。
上面说的是几种比较主流的反爬,当然还有非常多奇葩的反爬。
比如返回假数据、返回图片化数据、返回乱序数据、返回骂人的数据、返回求饶的数据,就具体情况看着办吧。
这些反爬也得小心点,之前见过一个反爬直接返回 rm -rf / 的也不是没有,你要是正好有个脚本模拟执行返回结果,后果自己想象哈。