我是怎样从一名零0基础如何成为一名讲师的小白成为现在的爬虫工程师的

互联网是由一个一个的超链接组荿的从一个网页的链接可以跳到另一个网页,在新的网页里又有很多链接。理论上讲从任何一个网页开始,不断点开链接、链接的網页的链接就可以走遍整个互联网!这个过程是不是像蜘蛛沿着网一样爬?这也是“爬虫”名字的由来

作为爬虫工程师,就是要写出┅些能够沿着网爬的”蜘蛛“程序保存下来获得的信息。一般来说需要爬出来的信息都是结构化的,如果不是结构化的那么也就没什么意义了(但百分之八十的数据是非结构化的)。爬虫的规模可达可小小到可以爬取豆瓣的top 250电影,定时爬取一个星期的天气预报等夶到可以爬取整个互联网的网页(例如google)。下面这些我认为都可以叫做爬虫:

爬百度网盘的资源,存到数据库中(当然只是保存资源嘚链接和标题),然后制作一个网盘的搜索引擎

同上种子网站的搜索引擎也是这样的

到这里,我们知道爬虫的任务是获取数据现在比較流行大数据,从互联网方面讲数据可以分成两种,一种是用户产生的(UGC)第二种就是通过一些手段获得的,通常就是爬虫爬虫又鈈仅仅局限于从网页中获得数据,也可以从app抓包等简而言之,就是聚合数据并让他们结构化那么,哪些工作需要爬虫呢

典型的数据聚合类的网站都需要爬虫。比如Google搜索引擎Google能在几毫秒之内提供给你包含某些关键字的页面,肯定不是实时给你去找网页的而是提前抓恏,保存在他们自己的数据库里(那他们的数据库得多大呀)所以种子搜索引擎,网盘搜索引擎Resillio key引擎等都是用爬虫实现抓好数据放在數据库里的。

另外有一些提供信息对比的网站比如比价类的网站,就是通过爬虫抓取不同购物网站商品的价格然后将各个购物网站的價格展示在网站上。购物网站的价格时时都在变但是比价网站抓到的数据不会删除,所以可以提供价格走势这是购物网站不会提供的信息。

除此之外做一些好玩的事情。比如我们想看大量的图片可以写一个爬虫批量下载下来,不必一个一个点击保存还要忍受网站嘚广告了;比如我们想备份自己的资料,例如保存下来我们在豆瓣发布过的所有的广播可以使用爬虫将自己发布的内容全部抓下来,这樣即使一些网站没有提供备份服务我们也可以自己丰衣足食。

二爬虫工程师需要掌握哪些技能?

我见过这样的说法:“爬虫是低级、偅复性很多的工作没有发展前途”。这是误解首先,对于程序员来说基本上不存在重复性的工作任何重复劳动都可以通过程序自动解决。例如博主之前要抓十几个相似度很高但是html结构不太一样的网站我就写了一个简单的代码生成器,从爬虫代码到单元测试代码都可鉯自动生成只要对应html结构稍微修改一下就行了。所以我认为重复性的劳动在编程方面来说基本上是不存在的,如果你认为自己做的工莋是重复性的说明你比较勤快,不愿意去偷懒而我还认为,勤快的程序员不是好程序员下面我根据自己这段时间的工作经历,讲一講爬虫需要哪些相关的技能

1.基本的编码0基础如何成为一名讲师(至少一门编程语言)

这个对于任何编程工作来说都是必须的。0基础如何荿为一名讲师的数据结构你得会吧数据名字和值得对应(字典),对一些url进行处理(列表)等等事实上,掌握的越牢固越好爬虫并鈈是一个简单的工作,也并不比其他工作对编程语言的要求更高熟悉你用的编程语言,熟悉相关的框架和库永远是百益无害

我主要用Python,用Java写爬虫的也有理论上讲任何语言都可以写爬虫的,不过最好选择一门相关的库多开发迅速的语言。用C语言写肯定是自找苦吃了

當爬虫任务很大的时候,写一个程序跑下来是不合适的:

如果中间遇到错误停掉重头再来?这不科学

我怎么知道程序在哪里失败了任務和任务之间不应该相互影响

如果我有两台机器怎么分工?

所以我们需要一种任务队列它的作用是:讲计划抓取的网页都放到任务队列裏面去。然后worker从队列中拿出来一个一个执行如果一个失败,记录一下然后执行下一个。这样worker就可以一个接一个地执行下去。也增加叻扩展性几亿个任务放在队列里也没问题,有需要可以增加worker就像多一双亏筷子吃饭一样。

这个不用讲了数据保存肯定要会数据库的。不过有时候一些小数据也可以保存成json或者csv等我有时想抓一些图片就直接按照文件夹保存文件。

推荐使用NoSQL的数据库比如mongodb,因为爬虫抓箌的数据一般是都字段-值得对应有些字段有的网站有有的网站没有,mongo在这方面比较灵活况且爬虫爬到的数据关系非常非常弱,很少会鼡到表与表的关系

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然后用代码模拟出来这个请求,最后处理请求的结果保存下来

这个话题要说的有很哆,实际工作中运维和开发的时间差不多甚至更多一些维护已经在工作的爬虫是一个繁重的工作。随着工作时间增加一般我们都会学著让写出来的爬虫更好维护一些。比如爬虫的日志系统数据量的统计等。将爬虫工程师和运维分开也不太合理因为如果一个爬虫不工莋了,那原因可能是要抓的网页更新了结构也有可能出现在系统上,也有可能是当初开发爬虫的时候没发现反扒策略上线之后出问题叻,也可能是对方网站发现了你是爬虫把你封杀了所以一般来说开发爬虫要兼顾运维。

所以爬虫的运维我可以提供下面几个思路:

首先从数据增量监控。定向爬虫(指的是只针对一个网站的爬虫)比较容易一段时间之后对一些网站的数据增量会有一个大体的了解。经瑺看看这些数据的增加趋势是否是正常就可以了(Grafana)非定向爬虫的数据增量不是很稳定,一般看机器的网络状况网站的更新情况等(這方面我的经验不多)。

然后看爬虫执行的成功情况在上面提到了用任务队列控制爬虫工作,这样解耦可以带来很多好处其中一个就昰可以就是可以对一次爬虫执行进行日志。可以在每次爬虫任务执行的时候将执行的时间、状态、目标url、异常等放入一个日志系统(比洳kibana),然后通过一个可视化的手段可以清晰地看到爬虫的失败率

爬虫抛出的Exception。几乎所有的项目都会用到错误日志收集(Sentry)这里需要注意的一点是,忽略正常的异常(比如Connection错误锁冲突等),否则的话你会被这些错误淹没

这同样是很深的一个话题,就像攻击武器与防御武器一样双方总是在不断升级。常见的反爬措施(我遇到过的)有下面几种:

很好理解如果访问太频繁网站可能针对你的ip封锁一段时間,这和防DDoS的原理一样对于爬虫来说,碰到这样的限制一下任务的频率就可以了可以尽量让爬虫想人类一样访问网页(比如随机sleep一段時间,如果每隔3s访问一次网站很显然不是正常人的行为)

也比较常见。不过公开信息的网站一般不会有这个限制这样让用户也麻烦了。其实反爬措施都或多或少的影响真实用户反爬越严格,误杀用户的可能性也越高对爬虫来说,登录同样可以通过模拟登录的方式解決加个cookie就行了(话又说回来,网络的原理很重要)

一般浏览器访问网站会有header,比如Safari或者Chrome等等还有操作系统信息。如果使用程序访问並不会有这样的header破解也很简单,访问的时候加上header就行

有一些网站(尤其是单页面网站)的内容并不是通过服务器直接返回的,而是服務器只返回一个客户端JavaScript程序然后JavaScript获取内容。更高级的是JavaScript在本地计算一个token,然后拿这个token来进行AJAX获取内容而本地的JavaScript又是经过代码混淆和加密的,这样我们做爬虫的通过看源代码几乎不可能模拟出来这个请求(主要是token不可能破解)但是我们可以从另一个角度:headless的浏览器,吔就是我们直接运行这个客户端程序这可以100%地模拟真实用户!

这几乎是终极武器了,验证码是专门用来区分人和计算机的手段对于反爬方来说,这种方式对真实用户和搜索引擎(其实可以通过记录搜索引擎爬虫的ip来区别对待可以解决)的危害比较大,相信读者都有输叺验证码的痛苦经历但这种方法也并不是无敌的!通过现在很火的机器学习可以轻松的识别大部分的验证码!Google的reCAPTCHA是一种非常高级的验证碼,但是听说通过模拟浏览器也是可以破解的

网站可能将识别的ip永久封杀,这种方式需要的人力比较大而且误伤用户的代价也很高。泹是破解办法却非常简单目前代理池几乎是搞爬虫的标配了,甚至还有很多高匿代理等好用的东西所以这基本上只能杀杀小爬虫。

有┅些网站将网站内容用只有人类可以接收的形式来呈现(其实反爬就是区别对待人类和机器嘛)比如将内容用图片的形式显示。但是近幾年来人类和机器的差别越来越小图片可以用OCR准确率非常高地去识别。

爬虫和反爬是典型的攻防双方的互相升级但是我认为,这种升級不像军事军事是无尽头的,但是爬虫和反爬是有尽头的

爬虫的尽头就是浏览器,一旦使用浏览器程序完全可以模拟真实用户发出請求,缺点是就是消耗资源因为需要新开一个进程,解析DOM运行客户端JavaScript代码。(chrome的node api在github开源仅仅两天就拿到8k个star)

反爬的尽头就是像Google这种超级厉害的验证码,毕竟验证码的根本目的就是识别人类和机器的

我正好有一个反爬做的非常好的例子。Google Arts Project项目是一个汇聚世界名画的艺術长廊我比较喜欢里面的一些画,所以想下载一些(当然这是不对的)然后发现这个网站反爬做的相当好(因为版权属于收藏作品的博物馆,所以Google Arts Project肯定不会提供下载)要下载几乎是不可能的。我有点不服开始用各种手段试图下载原图。尝试了一番发现这个网站block掉叻鼠标右键功能、审查元素发现图片并不是一个常规的图片、追踪网络包发现原图竟然不是一次网络请求拿到的,而是分成了好几次请求base64編码的字符流每次请求图片的一部分然后在客户端组装起来图片!当然在客户端的代码也是经过加密和混淆的!这完全可以作为反爬的敎科书了,既没有误伤用户又让爬虫无法下手。

成规模的爬虫一般都会使用集群一般的小网站服务器规模可能不如爬虫集群的规模大。所以很多时候我们最好对要爬的网站限制一下频率否则这些爬虫就相当于DoS攻击集群了!一般的网站都会有robots.txt可以参考。

好了总结来说,写爬虫需要经验积累需要灵活的思路。比如说我之前就遇到过网站需要验证码验证拿到一个token,可是通过看网络请求发现这个token长得很潒一个时间戳然后本地自己生成一个时间戳发现也是能用的!于是就这样绕过了验证码。所以多多积累和尝试可以偷不少懒,嘿嘿

叧外爬虫也不是和我之前想的那样是一个枯燥无味的工作,比如我就发现了不少很垃圾很搞笑的网站,乐趣也蛮多的学到的东西也不尐。万变不离其宗嘛

互联网时代信息无处不在,我们日常所接触的大量信息例如微博、社交媒体网站的帖子、消费者点评、新闻、销售囚员的拜访记录这些都是常见的非结构化数据来源。非结构化数据分析能够揭示潜藏在文本当中的趋势和关联为商业决策、研究行业趨势和热点内容分析提供有力支持。

1、前段时间快要毕业而我又不想找自己的老本行Java开发了,所以面了很多Python爬虫岗位

因为我在南京上学,所以我一开始只是在南京投了简历我一共面试了十几家企业,其中只有一家没有给我发offer其他企业都愿意给到10K的薪资,不要拿南京的薪资水平和北上深的薪资水平比较结合面试常问的问题类型说一說我的心得体会。

因为面试的是Python爬虫岗位面试官大多数会考察面试者的0基础如何成为一名讲师的Python知识,包括但不限于:

Python的一些常用内置庫比如多线程之类的

第二点:数据结构与算法

数据结构与算法是对面试者尤其是校招生面试的一个很重要的点,当然小公司不会太在意這些从目前的招聘情况来看对面试者的数据结构与算法的重视程度与企业的好坏成正比,那些从不问你数据结构的你就要当心他们是否紦你当码农用的当然以上情况不绝对,最终解释权归面试官所有

最重要也是最关键的一点当然是你的Python爬虫相关的知识与经验储备,这通常也是面试官考察的重点包括但不限于:

你遇到过的反爬虫的策略有哪些?

你常用的反反爬虫的方案有哪些

你用过多线程和异步吗?除此之外你还用过什么方法来提高爬虫效率

有没有做过增量式抓取?

对Python爬虫框架是否有了解

第四点:爬虫相关的项目经验

爬虫重在實践,除了理论知识之外面试官也会十分注重爬虫相关的项目:

你做过哪些爬虫项目?如果有Github最好

你认为你做的最好的爬虫项目是哪个其中解决了什么难题?有什么特别之处

以上是我在面试过程中,会碰到的一些技术相关的问题的总结当然面试中不光是技术这一点,但是对于做技术的过了技术面基本上就是薪资问题了。

也许有人问我现在在哪家公司做爬虫开发很抱歉,最终我放弃了南京的所有機会到了上海做我更喜欢的岗位:数据工程师

2、给你一点我的面经吧。

python0基础如何成为一名讲师:这个网上搜到的面经都得会加上异步,多进程多线程等等

爬虫:xpath,requests如何处理https常见的反爬措施,举例说一个最难的爬虫过程scrapy使用中的细节,例如代理cookie,传参等等

数据庫:数据库操作,并表之类的

python:多重继承,多态单例用装饰器的实现,数组/生成器/列表解析效率等等稍深入的细节

爬虫:分布式爬虫嘚实现给你一个任务你马上给出一个合理的架构,验证码的处理增量数据爬取,写爬虫时有没写些辅助工具

数据库:sql nosql的细节,性能仩的

加分项:数据挖掘,机器学习自然语言处理,能写网站熟练操作linux,github小星星

在学习python中有任何困难不懂的可以加入我的python交流学习qun :227-435-450多多交流问题,互帮互助群里有不错的学习教程和开发工具。学习python有任何问题(学习方法学习效率,如何就业)

爬虫给人的感觉僦是对于Python编程的知识要求并不高,确实搞懂基本数据结构、语句,会写写函数好像就OK了

自己业余玩玩爬点数据还OK,但是你是要找工作荿功爬虫工程师的扎实的编程0基础如何成为一名讲师可不是会写函数就够了的。Python的高级特性、面向对象编程、多线程、装饰器等等你至尐需要了解一下吧

现在很多爬虫工程师的面试,编程的基本功要求还是很高的编程的功底,以及对语言的理解从某种程度上可以看絀你的学习能力、发展潜力。

HTTP必须要有很深刻的理解这是你纵横网络的立身之本;

BeautifulSoup、xpath这些都是0基础如何成为一名讲师操作了,一定要做箌非常熟练;

Scrapy框架要会用要能信手捏来写个分布式爬虫;

反爬虫的技巧,重中之重能不能搞回来数据,能高多少数据回来很大程度依赖于此。抓包、cookie分析、代理池搭建、字体加密、验证码处理等等也都是常规操作了;

当然数据库也少不了啊。一般企业要求至少会一種SQL和一种noSQL

了解布隆过滤器,会增量爬取

掌握Python web相关的一些东西,能够进行后端开发;

掌握数据分析或者数据挖掘的技能能够搞个算法模型,做个分析和预测

我要回帖

更多关于 0基础如何成为一名讲师 的文章

 

随机推荐