程序员有时候很难和外行人讲明白本身的工做是什么,甚至有些时候,跟同行的人讲清楚“你是干什么的”也很困难。好比我本身,就对Daivd在搞的语义网一头雾水。因此我打算写一篇博客,讲一下“爬虫工程师”的工做内容是什么,须要掌握哪些技能,难点和好玩的地方等等,讲到哪里算哪里吧。html
1、爬虫工程师是干吗的?node
1.主要工做内容?android
互联网是由一个一个的超连接组成的,从一个网页的连接能够跳到另外一个网页,在新的网页里,又有不少连接。理论上讲,从任何一个网页开始,不断点开连接、连接的网页的连接,就能够走遍整个互联网!这个过程是否是像蜘蛛沿着网同样爬?这也是“爬虫”名字的由来。git
做为爬虫工程师,就是要写出一些可以沿着网爬的”蜘蛛“程序,保存下来得到的信息。通常来讲,须要爬出来的信息都是结构化的,若是不是结构化的,那么也就没什么意义了(百分之八十的数据是非结构化的)。爬虫的规模可达可小,小到能够爬取豆瓣的top 250电影,定时爬取一个星期的天气预报等。大到能够爬取整个互联网的网页(例如google)。下面这些,我认为均可以叫作爬虫:程序员
到这里,咱们知道爬虫的任务是获取数据。如今比较流行大数据,从互联网方面讲,数据能够分红两种,一种是用户产生的(UGC),第二种就是经过一些手段得到的,一般就是爬虫。爬虫又不只仅局限于从网页中得到数据,也能够从app抓包等。简而言之,就是聚合数据并让他们结构化。那么,哪些工做须要爬虫呢?github
2.爬虫能作什么?算法
典型的数据聚合类的网站都须要爬虫。好比Google搜索引擎。Google能在几毫秒以内提供给你包含某些关键字的页面,确定不是实时给你去找网页的,而是提早抓好,保存在他们本身的数据库里(那他们的数据库得多大呀)。因此种子搜索引擎,网盘搜索引擎,Resillio key引擎等都是用爬虫实现抓好数据放在数据库里的。mongodb
另外有一些提供信息对比的网站,好比比价类的网站,就是经过爬虫抓取不一样购物网站商品的价格,而后将各个购物网站的价格展现在网站上。购物网站的价格时时都在变,可是比价网站抓到的数据不会删除,因此能够提供价格走势,这是购物网站不会提供的信息。chrome
除此以外,我的还能够用爬虫作一些好玩的事情。好比咱们想看大量的图片,能够写一个爬虫批量下载下来,没必要一个一个点击保存,还要忍受网站的广告了;好比咱们想备份本身的资料,例如保存下来咱们在豆瓣发布过的全部的广播,可使用爬虫将本身发布的内容所有抓下来,这样即便一些网站没有提供备份服务,咱们也能够本身丰衣足食。数据库
2、爬虫工程师须要掌握哪些技能?
我见过这样的说法:“爬虫是低级、重复性不少的工做,没有发展前途”。这是误解。首先,对于程序员来讲基本上不存在重复性的工做,任何重复劳动均可以经过程序自动解决。例如博主以前要抓十几个类似度很高可是html结构不太同样的网站,我就写了一个简单的代码生成器,从爬虫代码到单元测试代码均可以自动生成,只要对应html结构稍微修改一下就好了。因此我认为,重复性的劳动在编程方面来讲基本上是不存在的,若是你认为本身作的工做是重复性的,说明你比较勤快,不肯意去偷懒。而我还认为,勤快的程序员不是好程序员。下面我根据本身这段时间的工做经历,讲一讲爬虫须要哪些相关的技能。
1.基本的编码基础(至少一门编程语言)
这个对于任何编程工做来讲都是必须的。基础的数据结构你得会吧。数据名字和值得对应(字典),对一些url进行处理(列表)等等。事实上,掌握的越牢固越好,爬虫并非一个简单的工做,也并不比其余工做对编程语言的要求更高。熟悉你用的编程语言,熟悉相关的框架和库永远是百益无害。
我主要用Python,用Java写爬虫的也有,理论上讲任何语言均可以写爬虫的,不过最好选择一门相关的库多,开发迅速的语言。用C语言写确定是自找苦吃了。
2.任务队列
当爬虫任务很大的时候,写一个程序跑下来是不合适的:
因此咱们须要一种任务队列,它的做用是:讲计划抓取的网页都放到任务队列里面去。而后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)。非定向爬虫的数据增量不是很稳定,通常看机器的网络情况,网站的更新状况等(这方面个人经验很少)。
而后看爬虫执行的成功状况。在上面提到了用任务队列控制爬虫工做,这样解耦能够带来不少好处,其中一个就是能够就是能够对一次爬虫执行进行日志。能够在每次爬虫任务执行的时候,将执行的时间、状态、目标url、异常等放入一个日志系统(好比kibana),而后经过一个可视化的手段能够清晰地看到爬虫的失败率。
爬虫抛出的Exception。几乎全部的项目都会用到错误日志收集(Sentry),这里须要注意的一点是,忽略正常的异常(好比Connection错误,锁冲突等),不然的话你会被这些错误淹没。
3、爬虫与反爬
这一样是很深的一个话题,就像攻击武器与防护武器同样,双方老是在不断升级。常见的反爬措施(我遇到过的)有下面几种:
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准确率很是高地去识别。
反爬总结
爬虫和反爬是典型的攻防双方的互相升级。可是我认为,这种升级不像军事,军事是无尽头的,可是爬虫和反爬是有尽头的。
爬虫的尽头就是浏览器,一旦使用浏览器,程序彻底能够模拟真实用户发出请求,缺点是就是消耗资源,由于须要新开一个进程,解析DOM,运行客户端JavaScript代码。(chrome的node api在github开源仅仅两天,就拿到8k个star)
反爬的尽头就是像Google这种超级厉害的验证码,毕竟验证码的根本目的就是识别人类和机器的。
我正好有一个反爬作的很是好的例子。Google Arts Project项目是一个汇聚世界名画的艺术长廊,我比较喜欢里面的一些画,因此想下载一些(固然这是不对的),而后发现这个网站反爬作的至关好(由于版权属于收藏做品的博物馆,因此Google Arts Project确定不会提供下载),要下载几乎是不可能的。我有点不服,开始用各类手段试图下载原图。尝试了一番,发现这个网站block掉了鼠标右键功能、审查元素发现图片并非一个常规的图片、追踪网络包发现原图居然不是一次网络请求拿到的,而是分红了好几回请求base64编码的字符流每次请求图片的一部分,而后在客户端组装起来图片!固然在客户端的代码也是通过加密和混淆的!这彻底能够做为反爬的教科书了,既没有误伤用户,又让爬虫没法下手。
图片每次只请求部分
4、职业道德
成规模的爬虫通常都会使用集群,通常的小网站服务器规模可能不如爬虫集群的规模大。因此不少时候咱们最好对要爬的网站限制一下频率。不然这些爬虫就至关于DoS攻击集群了!通常的网站都会有robots.txt能够参考。
好了,总结来讲,写爬虫须要经验积累,须要灵活的思路。好比说我以前就遇到过网站,须要验证码验证拿到一个token,但是经过看网络请求发现这个token长得很像一个时间戳,而后本地本身生成一个时间戳发现也是能用的!因而就这样绕过了验证码。因此多多积累和尝试,能够偷很多懒,嘿嘿。
另外爬虫也不是和我以前想的那样是一个枯燥无味的工做,好比我就发现了很多很垃圾,很搞笑的网站,乐趣也蛮多的。学到的东西也很多。万变不离其宗嘛。
5、工做机会
若是你看到这里,说明对爬虫有兴趣吧!若是想应用于实践中,咱们公司能够提供很好的平台。下面贴出来咱们公司招聘(点击),若是对职位有兴趣,能够经过邮件或者私聊发送给我简历。
公司简介: 山东纬横数据公司是一家以互联网搜索引擎技术为导向的大数据分析服务商,专一为用户创建数据资产,提供互联网数据监测和数据分析服务,并实现其价值。公司主要面向医院、医疗、食品、药品、在线旅游、健康等领域提供数据分析、数据挖掘、舆情监控等技术服务。
互联网时代信息无处不在,咱们平常所接触的大量信息例如微博、社交媒体网站的帖子、消费者点评、新闻、销售人员的拜访记录,这些都是常见的非结构化数据来源。非结构化数据分析可以揭示潜藏在文本当中的趋势和关联,为商业决策、研究行业趋势和热点内容分析提供有力支持。
纬横团队致力于打造最出色的中文语义分析技术,经过自主研发的中文分词、句法分析、搜素引擎和实体识别技术,结合海量行业语料的不断积累,为企业客户(营销、公关、客服、销售和产品部门)、研究机构和政府部门等提供数据监测和采集、分析和可视化以及专业服务,加强用户在大数据时代的竞争力。
后端工程师 招聘人数:2 薪资面议
岗位职责
1. 分布式网页抓取平台的研发、完善和运维,天天支持数千万级的网页采集、清洗和分析;
2. 产品后端 API 的开发,实现高性能、高可用及可扩展的后端代码;
3. 线上分布式环境的自动化运维、监控、性能调优。
职位要求
1. 扎实的算法与数据结构功底,对新的知识和技术有强烈热情;
2. 具备较强的分析和解决问题的能力;
3. 拥有良好的编程习惯;
4. 熟悉至少一门高级编程语言(例如 Python/C++/JAVA )并有实际开发的经验。
工做地点
烟台市高新区
原文发在https://www.kawabangga.com/posts/2277