此篇小结:

  • 爬虫工程师一般需要达到的要求(初中高级)

  • 爬虫工程师必备技能点拆解

  • 面经分享

这是从某一招聘网站上截图的招聘信息:

基本上离不开编程基础、数据库、算法、数据分析这些,下面从收集的几则招聘信息中整理了一下爬虫工程师一般需要达到的要求:

1)【初级爬虫工程师】

① web 前端的知识:HTML、CSS、JavaSc1ipt、 DOM、 DHTML 、Ajax、jQuery、json 等;
②正则表达式:能提取正常一般网页中想要的信息,比如某些特殊的文字, 链接信息, 知道什么是懒惰, 什么是贪婪型的正则;
③ 会使用 XPath 等获取一些DOM 结构中的节点信息;
④ 知道什么是深度优先, 广度优先的抓取算法, 及实践中的使用规则;
⑤ 能分析简单网站的结构,会使用urllib或requests 库进行简单的数据抓取。

2)【中级爬虫工程师】

① 了解什么是HASH,会简单地使用MD5,SHA1等算法对数据进行HASH一遍存储
②熟悉HTTP,HTTPS协议的基础知识,了解GET,POST方法,了解HTTP头中的信息,包括返回状态码,编码,user-agent,cookie,session等
③ 能设置user-agent进行数据爬取,设置代理等
④知道什么是Request,什么是response,会使用Fiddler等工具抓取及分析简单地网络数据包;
⑤对于动态爬虫,要学会分析ajax请求,模拟制造post数据包请求,抓取客户端session等信息,对于一些简单的网站,能够通过模拟数据包进行自动登录。
⑥ 对于一些难搞定的网站学会使用phantomjs+selenium抓取一些动态网页信息
⑦并发下载,通过并行下载加速数据爬取;多线程的使用。

3)【高级爬虫工程师】

① 能够使用Tesseract,百度AI,HOG+SVM,CNN等库进行验证码识别。
② 能使用数据挖掘技术,分类算法等避免死链。
③会使用常用的数据库进行数据存储,查询。比如mongoDB,redis;学习如何通过缓存避免重复下载的问题。
④能够使用机器学习的技术动态调整爬虫的爬取策略,从而避免被禁IP封禁等。
⑤能使用一些开源框架scrapy,scrapy-redis等分布式爬虫,能部署掌控分布式爬虫进行大规模数据爬取。

爬虫技能掌握对照

【初级】

1)Python语言基础

2)相关的请求库 urllib、requests、selenium(动态网页用得上)

3)相关的解析库 BeautifulSoup、XPath、PyQuery、Re正则表达式

4)相关的数据库 MySQL、MongoDB

【中级】

1)Ajax(能通过Ajax接口获取数据)

2)了解基本的 Javascript

3)Puppeteer(基于JS的爬虫框架,可直接执行JS)

4)Pyppeteer(需要python异步知识)

5)多任务基础 & 爬虫提速 多进程、多线程、协程

6)抓取工具 fiddler、Charles、chrome、firefox

7)自动化爬取(爬App) adb工具、Appium

8)Splash(动态渲染页面的抓取)

9)mitmproxy(中间人代理工具)

【高级】

1)爬虫框架 Scrapy、Pyspider

2)消息队列相关 RabbitMQ、Celery、Kafka

3)Redis 数据库

4)Scrapy
Redis(scrapy的redis组件)、Redis-BloomFilter(scrapy的布隆过滤器)、Cluster(分布式爬虫框架)

5)应对反爬的技术 验证码破解、IP代理池、用户行为管理 分流技术:cookies池、token池、sign池

【更高一级】 JS逆向、App逆向、运维、智能化爬虫

爬虫工程师的面试一般会涉及到以下几个部分:

1、基本的编码基础

(至少一门编程语言), 基础的数据结构你得会吧,数据名字和值得对应(字典),对一些url进行处理(列表)等等。

爬虫给人的感觉好像对Python编程的掌握要求不高,搞懂基本数据结构、语句,会写写函数好像就OK了,自己业余玩玩还行,实际还差着远呢!

任务队列

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

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

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

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

所以我们任务队列的作用就出来了:

将计划抓取的网页都放到任务队列里面去,然后worker从队列中拿出来一个一个执行,如果一个失败,记录一下,然后执行下一个。

这样,worker就可以一个接一个地执行下去,也增加了扩展性,几亿个任务放在队列里也没问题,有需要可以增加worker,就像多一双筷子吃饭一样。

常用的任务队列有kafka,beanstalkd,celery等;

如果要面试爬虫工程师,这远远不够!

不要小瞧了爬虫工程师对编程基本功的要求,编程基本功要扎实。

除了基本的函数,Python的高级特性、面向对象编程、多线程、装饰器都要熟悉。

编程的功底以及对语言的理解,从某种程度上可以看出学习能力和发展潜力。

HTTP知识

必备技能,要爬的是网页,所以必须要了解网页。

(1)首先html文档的解析方法要懂

比如子节点父节点,属性这些。我们最终看到的网页是被浏览器处理了的,原始的网页是由很多标签组成的。

(2)处理最好使用html的解析器

如果自己用正则匹配的话坑会很多,我个人xpath用得多,跨语言,表达比较好,但是呢也有缺点,正则、逻辑判断有点别扭。

(3)HTTP协议要理解

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准确率非常高地去识别。

07 JavaScript脚本动态

JavaScript脚本动态获取网站数据;

有一些网站(尤其是单页面网站)的内容并不是通过服务器直接返回的,而是服务器只返回一个客户端JavaScript程序,然后JavaScript获取内容。

更高级的是,JavaScript在本地计算一个token,然后拿这个token来进行AJAX获取内容,而本地的JavaScript又是经过代码混淆和加密的。

这样我们做爬虫的通过看源代码几乎不可能模拟出来这个请求(主要是token不可能破解)。

但是我们可以从另一个角度:headless的浏览器,也就是我们直接运行这个客户端程序,这可以100%地模拟真实用户。

上面说的是几种比较主流的反爬,当然还有非常多奇葩的反爬。

比如返回假数据、返回图片化数据、返回乱序数据、返回骂人的数据、返回求饶的数据,就具体情况看着办吧。

这些反爬也得小心点,之前见过一个反爬直接返回 rm -rf / 的也不是没有,你要是正好有个脚本模拟执行返回结果,后果自己想象哈。

面经分享

01 基础知识面储备

Python爬虫相关的知识面储备通常也是面试考察的重点,比如:

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

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

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

  • 有没有做过增量式抓取?

  • 对Python爬虫框架是否有了解?

【初级】:

(1)网络基础:cookie、session、https、headers常用的字段,代理使用等等。

(2)python基础:这个网上搜到的面经都得会,加上异步,多进程,多线程等等。

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

(4)数据库:数据库操作,并表之类的。

碰到过一个:使用多线程生产者消费者模式完成网站爬虫,自己针对简单的网站写一个Demo,这个题目不光考察面试者的编码能力还有就是设计能力,大家可以去了解一下。

【中级】:

  • 网络编程的问题基本在面试中必出现,比如高频发问:

  • 向浏览器发送一个请求到返回中间经历了什么?

  • 说说三次握手和四次挥手

  • HTTPS 是如何实现安全数据传输的?

(1)网络:几层网络层的细节

比如说说udp/tcp/smtp区别,说说10.x.x.x/127.x.x.x/192.x.x.x的区别,说说 DNS,谈谈路由交换机的区别。

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

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

(3)数据库:sql nosql的细节,性能上的。

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

02 相关的项目经验

具体来说就是你做过的项目,这块是面试准备时的重中之重。

  • 你做过哪些爬虫项目?能不能详细说一下

  • 你爬过某某站和某某站,期间有没有遇到什么困难,你是如何完成的?(一般出现在简历项目内)

  • 爬虫中遇到过最棘手的反爬机制是什么?最后如何解决的?

  • 你在这个项目中学到了什么?

项目经验这里根据自身的实际情况答就行,可别自己写的简历答起来却磕磕绊绊的,那也挺尴尬的。

03 数据结构与算法

尤其很重要的一个点,有些小公司可能不会太在意这些。

从招聘情况来看,对面试者的数据结构与算法的重视程度与企业的好坏成正比,当然这也不是绝对的,可以多留意一下。

记得有事没事都可以多刷刷LeetCode上面的题或者看看剑指Offer!

我身边的大佬跟我自己所遇到过的面试题基本上大多数公司的算法题都在这两大神器上出现过,看了是真香啊!

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

04 几点小tips

① 尽量拓展自己爬虫技术的深度和广度

  • 深度就是类似反反爬、加密破解、验证登录等技术

  • 广度就是分布式、云计算等等,这都是加分项

② 前端部分的掌握,尤其是最常用的 js、ajax、html/xhtml、css 等相关技术,懂前端技术的爬虫工程师会有一定的优势。

③ 爬虫不是抓取到数据就完事了,还需要数据抽取、清洗、消重等方面的经验。

④ 一般公司都会有自己的爬虫系统,维护爬虫系统也是日常工作之一。

⑤ 随着手持设备的市场占比越来越高,app 的数据采集、抓包工具的熟练使用会越来越重要。

最后要明确一点,python只不过是一个工具,学会了使用工具不代表你就能找到工作,要有用工具处理问题的能力才符合工作需求。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容包括:

起薪2万的爬虫工程师,需要具备哪些技能?相关推荐

  1. 起薪2万的爬虫工程师, Python需要学到什么程度才可以就业?

    做爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬.那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答. 1.前段时间快要毕业,而我又不想找自己的老本行Java开发了, ...

  2. 起薪2万的爬虫工程师,Python需要学到什么程度才能就业?

    爬虫工程师的的薪资为20K起,当然,因为大数据,薪资也将一路上扬.那么,Python需要学到什么程度呢?今天我们来看看3位前辈的回答. 1.前段时间快要毕业,而我又不想找自己的老本行Java开发了,所 ...

  3. 爬虫工程师是干嘛的?Python爬虫工程师需要掌握哪些技能?

    一.爬虫工程师是干嘛的? 1.主要工作内容 互联网是由一个一个的超链接组成的,从一个网页的链接可以跳到另一个网页,在新的网页里,又有很多链接.理论上讲,从任何一个网页开始,不断点开链接.链接的网页的链 ...

  4. 初级爬虫工程师需要具备哪些知识

    爬虫工程师需要具备哪些知识 一.必备部分(初级) 1.熟悉多线程编程.网络编程.HTTP协议相关 2.开发过完整爬虫项目(最好有全站爬虫经验,这个下面会说到) 3.反爬相关,cookie.ip池.验证 ...

  5. 人工智能工程师需具备的技能_2020年软件测试工程师需要具备的技能--需要学什么--面试题有哪些(灵魂拷问)...

    一.2020年软件测试行业的现状 2020年开年,一不小心,[新冠]黑天鹅从头上飘过,持续影响全国乃至全球的经济,软件行业公司也迎来了不少的冲击,那么一直打算入行软件测试行业,或者已经在软件测试行业耕 ...

  6. 2020年软件测试工程师需要具备什么技能--需要学哪些

    目录:导读 一.2020年软件测试行业的现状 二.2020年软件测试行业的趋势 三.只会功能测试的测试工程师已经是新时代的测试文盲 四. 测试行业的薪资在提高 五.那么2020年作为一名初级软件测试工 ...

  7. Java工程师应具备哪些技能?

    Java工程师应具备哪些技能? 作者:ByArnold Galovics 链接:https://arnoldgalovics.com/java-software-engineer-skills/ 编译 ...

  8. JAVA软件工程师应该具备的技能有哪些?

    前言:有朋友问我:学历和能力哪个重要?我个人觉得能力大于学历,没有能力哪来的学历,学历只是证明能力的一方面.为此在能力方面畅谈java软件工程师必备的能力.作为一名合格的java工程师,不仅需要学历, ...

  9. 一个优秀的前端工程师应具备哪些技能?

    作为一名前端工程师,产品的内外兼优才能体现它的完美,前端工程师需要学习的技能远远超过设计师. 那么一名优秀的WEB前端工程师应具备哪些技能呢,我在这里分享一下,供大家参考: 第一:HTML超文本标记语 ...

最新文章

  1. 【C/S语言】.net平台
  2. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、样本量的情况下计算假设检验的效用值
  3. OpenERP Web开发
  4. 编程之美3.1 字符串移位包含问题
  5. NSString/NSMutable字符串——韩俊强…
  6. 网页转图片 java_java-网页转图片
  7. openssl版本信息和支持的命令
  8. JS任务队列--笔记
  9. 19岁P8入驻阿里?从阿里的人才成长体系学习
  10. php图片提交,php+js实现图片的上传、裁剪、预览、提交示例
  11. Registry学习资料
  12. 雷霆战机单机老版本_雷霆战机单机版
  13. 使用PDFObject添加将本地磁盘pdf文件在前端页面展示
  14. png格式图像转成jpg图像时出现异常颜色值
  15. 小红书种草营销的本质是什么?如何投入更有效?
  16. 2018谷歌大会android,谷歌召开2018中国开发者大会,带来了Android 9多项更新
  17. jquery仿百度AI官网banner图片代码
  18. 制作PE系统--20220202
  19. python模块cpca修改源码支持国外地址解析
  20. 计算机网络最高几级,公主连结rank最高可以到几级?rank等级上限一览

热门文章

  1. Python的WNTR库---基于供水网络
  2. Cesium基础知识-创建模型,动画
  3. HTML简单的登录+背景页面
  4. 【Unity-UGUI控件全面解析】| Text文本组件详解
  5. Java 无符号数据类型处理
  6. iPhone机型判断大全 (2020年10月更新:iPhone 12、iPhone 12 Pro、iPhone 12 Pro Max)
  7. 如何在不清空原有配置的情况下恢复路由器密码?巨强!
  8. 高帧率手机 Flutter 列表慢慢拖动的时候会有明显的抖动
  9. 关灯游戏c语言,关灯游戏 Lights out (一)(极速求解)
  10. Excel条件格式,利用公式验证数据,对比数据差异