最近忙于准备婚礼,博客没能稳定更新。之前为了找工作,写了很多爬虫实战的文章。现在工作找到了,我想对这段时间的经历做一个总结,打算用三篇文章完成这个事情:
本文。交代一下我的背景、自学了点什么(看了什么书、哪些博客、做了什么)、找工作用了什么招聘平台,面试的过程是什么样的;
我所理解的爬虫和反爬虫;
应该如何构建一个稳定的爬虫系统。
另外,我准备把我之前关于爬虫实践的文章逐步转移到简书,之后争取两边同步更新。
正文
这个定义其实并没有特别指出爬虫和Python的关系。事实上,只要能实现HTTP或HTTPS协议的语言就能写爬虫程序。当然如果这门语言同时又有封装好的便于对网页内容进行处理的包,那就更好了。目前我见过用C++、Java和Python写的爬虫,Python的占多数,其他语言我不太清楚。
另一个有趣的事实是:爬虫和Python的交集也很有限。如果用Python写爬虫,你只要掌握一些常用的Python语句格式和一些和爬虫相关的库即可,写起来不难,难在分析和破解网站的反爬虫机制,这个我在另篇文章里会仔细讲。所以说爬虫高手并不等于Python高手。最近我正在看两本书《流畅的Python》和《Python Cookbook》,不得不说,收益良多,感觉之前自学的都是假Python,之后我会整理一下和大家分享。
这里我主要还是讲一下找工作相关的事情。
首先我是很不赞同诸如《X小时Python入门》、《学爬虫掌握这X个库就好了!》、《5分钟,6行代码教你写爬虫!》之类的文章的。私以为此类文章标题投机取巧、对知识点的讲解浅尝辄止,很容易给新人造成一种“原来这么简单”的错觉,等到日后幡然醒悟,重新学习不谈,时间已经浪费掉了。虽然我从开始学习Python和爬虫到最后找到工作实际用了不到六个月的时间,但是这是有原因和运气成分的,我不想给人造成一种我很厉害的假象,同样我也不想给人造成这个过程很简单的假象。
入门Python
其实在自学Python和爬虫之前,我写过很长一段时间的C,读硕期间也写过Java、php、js等等,甚至Ruby。因此上手一门新语言对我来说并非什么难事。更何况其实Python还是继承了很多C的思想的,有共通之处。
除了各种各样从网络上搜索出来的文章,学习Python我主要看了如下几个内容:
《Getting up to speed with Python》,这本书对有编程语言基础,对想入门Python的人很友好,由七章组成,分别对应Python的几个特性,并且有配套的练习。练习很简单,用来入门很好。
Python3 菜鸟教程,涉及的特性比《Getting up to speed with Python》多一些,配套一些例子。
看完这两部分之后,就可以算入门了。此时你应该已经可以用Python编写一些简单的命令行程序,没问题,目标达成。
- Python的官方文档,现在最新的版本是3.7.0。和其他任何语言或框架的官方文档一样,Python的文档是很详细的,甚至会用大篇幅介绍一个基本用不到的东西。但是相信我,看阅读官方文档比看网上一些教程要有用的多。而且我推荐阅读英文版的。
实不相瞒,到了这一步就已经满足编写Python爬虫的要求了,之后遇到什么不会写或者不知道怎么写的代码,在用搜索引擎之前先查阅一下官方文档,查漏补缺,进步会很快。
如果是没有编程基础的人想要学Python呢?说实话,我不确定怎么做是最有效率的。如果你有充足的时间,我仍然建议你通读一遍Python文档,有可能的话把涉及到代码都自己打一下。如果时间不足想要速成,网上的教程了解一下吧。不过我有一句话,如果想在Python上有所建树,文档是早晚要读的。
爬虫相关的库和框架
编写爬虫其实用不到太多Python的特性和技巧。更多的是对Python几个库和对现成爬虫框架的使用,这些库包括:urlib、requests、re、bs4、json等等,常用的框架有:scrapy、pyspider、scrapy_redis、celery等等。我个人用的最多是一个我自己封装过的requests库、bs4和re。小的爬虫我一般不用框架,都是自己写,但如果写大型爬虫项目,框架还是有优势的。
如何熟悉这些库和框架呢?我的建议是以战养战,不断地写项目,不断地写总结。(是不是带了点敏捷开发的思想?)
项目从哪里找呢?这个很容易,搜索“Python实战”会出来一大堆,也可以去Github搜“Crawler”之类的关键词。当然我的博客上也有很多,是我学习的时候自己写的,原理、过程、代码全部都有。
一个很重要的点
这里有个很重要的点,也是我反复在说的一个点,就是爬虫的关键其实不在于代码编写,而是对网站反爬虫机制的逆向。这个过程又涉及到计算机网络、网络安全、前端知识等。其实还是挺复杂的,我只是恰好对这些领域都有所涉猎。因此上手写爬虫的时间很短。
举个简单的例子,如果要分析浏览器和服务器是怎么交互的,你首先要会抓包分析,交互用的是什么协议(http还是https),用的什么方法(GET还是POST),报文头带了那些参数?(TOKEN?uid?),只有弄清了这些,才能最大程度的用程序模拟人的访问行为,避免被网站封杀。
通常来说,报文中带的参数都是加密过的,加密的方式千变万化不计其数,这是反爬虫的核心。那么熟悉常见的加密算法显然是必须的。其次,这些加密一般是在js文件里完成的,如何从众多js文件中定位出相关的加密代码?至少你需要看得懂js吧。
实际情况会复杂一点,但是这几个方面的知识是必须的。如果不会的话,虽然不难,但是总要花时间学的。
然后我就这么不断地写,遇到了各种各样的问题这里就不写了。总之,半年后感觉有很大的提升,我就开始找工作了。
关于招聘网站
简历的话,内容自然是斟酌过的,格式我没有专门去弄,只是用markdown写了一份。(感觉程序员的话,也不在意格式的问题,何况markdown本来看起来就很简洁,还是挺不错的。)
在我上一次换工作时,我用的是智联、58和赶集。这回回来一看,又出现了拉钩、猎聘、51job、100offer和boss直聘。先说结论,技术向找工作用拉钩和boss直聘。某段时间我投了很多,其中拉钩和boss直聘给我的反馈最好。最后,我的工作是自己投简历给HR找到的。
拉钩是我用下来体验最好的,而且我很多面试也来源于这个平台。而且拉钩app上的交流也很友好,问候语可以自己定义。这是我的首推。
比拉钩略次一点的是boss直聘。这个平台想做的概念就是让面试者直接和企业高管对话,然而私以为这并不合理,高管有高管自己的事,公司招人的事本来就应该是HR的责任,这样做岂不是本末倒置?除了这一点,boss直聘app的问候语功能也是我要吐槽的,不支持自定义;然后自带的几个问候模板用起来有很尴尬。而且如果双方不各自至少说一句话的话,是不能发送简历的。这就会导致一个场景:boss给我发了一句话:“小伙子对你很感兴趣,能不能聊聊?”,然后我说:“好的。“,注意此时才算我和boss建立的联系,我才能给boss发送我的建立,之后boss一看简历并不合适,就不了了之了。如果我对某个岗位感兴趣,为什么我不能直接投简历呢?而且有时候我明明不符合这个岗位,仍然有boss联系我,是不是系统自己推荐的?
剩下的几个网站我想吐槽的点就有点多了。首先这几个网站都有个共同的毛病,不能上传简历。因此我需要将我简历里的内容复制黏贴到网站提供的表单里面。这个过程是很耗时的,更糟的是,网站的表单并不是转为技术人员设计的,很多想填的东西找不到地方填;最糟糕的地方是,网站还会要求你填一些你不想,其实也可以不填的内容,比如说当前的薪水。
这几个网站里面又以猎聘最差,我记得猎聘的表单里要填户口、当前工作城市(默认我有工作?)、年薪等。它的工作年限是根据你填的项目经历计算出来的,而我第一份工作是2012年,中间读了两年硕士,但是自动生成的简历上,我的工作年限是五年以上。这导致我的备注里面直接写了“实际工作经验为3年,因网站问题无法正确填写。“。除了这些,猎聘顾名思义,上面基本都是猎头;猎头其实没问题,问题是也没给我推到什么合适的职位。其他几个网站或多或少也有类似的问题,总之就是不顺畅。
前程无忧和智联差不多,但是体验也不好,感觉很低端,在投了一份简历后,会弹出3-5个相关的岗位,你可以选择一键投递。这点我就很不理解,你这是广撒网的策略吗?智联招聘还有个对应的app叫智联卓聘,也全是猎头,而且发邮件发的很多,然而并没啥用。
综上所述,我觉得比较合理的几个找工作的途径应该是:找人内推、去公司官网自己投、拉钩或者boss直聘。
关于面试
因为我面试的时候人还是国外,时差导致我一天只能面一家公司。我大概投了2-3个礼拜的简历,差不多每天都会有一个面试。这些面试一面基本都过了,后来有一个公司进度比较快,连着3轮面试,然后给的待遇也不错,我就签了。这样后面几个没完成的招聘就没有继续下去,其实个人觉得拿到offer应该都没什么问题。
这里面还不包括一些不愿意视频面试的公司,要我回国后去上海当面面试。这点其实我也不太能理解,反正最后也都不了了之了。
关于爬虫的话,面试的问题其实都差不多。我罗列一下:
自我介绍。我发现厉害的面试官一般都不会要你做自我介绍,而要你自我介绍的其实只是需要几分钟看看你的简历。至于面试官厉不厉害,其实看他问问题的角度就能看出来了。
项目中遇到最难的地方?是怎么解决的?
详细问你某个项目的过程。因此你需要很了解你自己做的项目。我被问到最多的是关于淘宝UA值的计算过程,似乎大家都对淘宝很感兴趣。
HTTP的三次握手和四次挥手。这个是个高频,我被问了好几次。
进程、线程和协程。
如何设计一个爬虫。
常见的反爬机制有哪些,每种机制的应对方案。这个也是个高频。
如何提高小组的代码质量?我答的是peer review。
常见的去重策略和存储方案。
用过哪些爬虫框架。
基本就这些,可以看到,我很少会被问到只和Python相关的问题(只有一次,问了list和tuple的区别)。但是去研究下Python,总没什么坏处。另外一些可能的加分项:
技术博客,github
英语
祝大家好运。