最近忙于準備婚禮,博客沒能穩(wěn)定更新。之前為了找工作,寫了很多爬蟲實戰(zhàn)的文章?,F(xiàn)在工作找到了,我想對這段時間的經(jīng)歷做一個總結(jié),打算用三篇文章完成這個事情:
本文。交代一下我的背景、自學了點什么(看了什么書、哪些博客、做了什么)、找工作用了什么招聘平臺,面試的過程是什么樣的;
我所理解的爬蟲和反爬蟲;
應(yīng)該如何構(gòu)建一個穩(wěn)定的爬蟲系統(tǒng)。
另外,我準備把我之前關(guān)于爬蟲實踐的文章逐步轉(zhuǎn)移到簡書,之后爭取兩邊同步更新。
正文
網(wǎng)絡(luò)爬蟲(英語:web crawler),也叫網(wǎng)絡(luò)蜘蛛(spider),是一種用來自動瀏覽萬維網(wǎng)的網(wǎng)絡(luò)機器人。
這個定義其實并沒有特別指出爬蟲和Python的關(guān)系。事實上,只要能實現(xiàn)HTTP或HTTPS協(xié)議的語言就能寫爬蟲程序。當然如果這門語言同時又有封裝好的便于對網(wǎng)頁內(nèi)容進行處理的包,那就更好了。目前我見過用C++、Java和Python寫的爬蟲,Python的占多數(shù),其他語言我不太清楚。
另一個有趣的事實是:爬蟲和Python的交集也很有限。如果用Python寫爬蟲,你只要掌握一些常用的Python語句格式和一些和爬蟲相關(guān)的庫即可,寫起來不難,難在分析和破解網(wǎng)站的反爬蟲機制,這個我在另篇文章里會仔細講。所以說爬蟲高手并不等于Python高手。最近我正在看兩本書《流暢的Python》和《Python Cookbook》,不得不說,收益良多,感覺之前自學的都是假Python,之后我會整理一下和大家分享。
這里我主要還是講一下找工作相關(guān)的事情。
首先我是很不贊同諸如《X小時Python入門》、《學爬蟲掌握這X個庫就好了!》、《5分鐘,6行代碼教你寫爬蟲!》之類的文章的。私以為此類文章標題投機取巧、對知識點的講解淺嘗輒止,很容易給新人造成一種“原來這么簡單”的錯覺,等到日后幡然醒悟,重新學習不談,時間已經(jīng)浪費掉了。雖然我從開始學習Python和爬蟲到最后找到工作實際用了不到六個月的時間,但是這是有原因和運氣成分的,我不想給人造成一種我很厲害的假象,同樣我也不想給人造成這個過程很簡單的假象。
入門Python
其實在自學Python和爬蟲之前,我寫過很長一段時間的C,讀碩期間也寫過Java、php、js等等,甚至Ruby。因此上手一門新語言對我來說并非什么難事。更何況其實Python還是繼承了很多C的思想的,有共通之處。
除了各種各樣從網(wǎng)絡(luò)上搜索出來的文章,學習Python我主要看了如下幾個內(nèi)容:
《Getting up to speed with Python》,這本書對有編程語言基礎(chǔ),對想入門Python的人很友好,由七章組成,分別對應(yīng)Python的幾個特性,并且有配套的練習。練習很簡單,用來入門很好。
Python3 菜鳥教程,涉及的特性比《Getting up to speed with Python》多一些,配套一些例子。
看完這兩部分之后,就可以算入門了。此時你應(yīng)該已經(jīng)可以用Python編寫一些簡單的命令行程序,沒問題,目標達成。
- Python的官方文檔,現(xiàn)在最新的版本是3.7.0。和其他任何語言或框架的官方文檔一樣,Python的文檔是很詳細的,甚至會用大篇幅介紹一個基本用不到的東西。但是相信我,看閱讀官方文檔比看網(wǎng)上一些教程要有用的多。而且我推薦閱讀英文版的。
實不相瞞,到了這一步就已經(jīng)滿足編寫Python爬蟲的要求了,之后遇到什么不會寫或者不知道怎么寫的代碼,在用搜索引擎之前先查閱一下官方文檔,查漏補缺,進步會很快。
如果是沒有編程基礎(chǔ)的人想要學Python呢?說實話,我不確定怎么做是最有效率的。如果你有充足的時間,我仍然建議你通讀一遍Python文檔,有可能的話把涉及到代碼都自己打一下。如果時間不足想要速成,網(wǎng)上的教程了解一下吧。不過我有一句話,如果想在Python上有所建樹,文檔是早晚要讀的。
爬蟲相關(guān)的庫和框架
編寫爬蟲其實用不到太多Python的特性和技巧。更多的是對Python幾個庫和對現(xiàn)成爬蟲框架的使用,這些庫包括:urlib、requests、re、bs4、json等等,常用的框架有:scrapy、pyspider、scrapy_redis、celery等等。我個人用的最多是一個我自己封裝過的requests庫、bs4和re。小的爬蟲我一般不用框架,都是自己寫,但如果寫大型爬蟲項目,框架還是有優(yōu)勢的。
如何熟悉這些庫和框架呢?我的建議是以戰(zhàn)養(yǎng)戰(zhàn),不斷地寫項目,不斷地寫總結(jié)。(是不是帶了點敏捷開發(fā)的思想?)
項目從哪里找呢?這個很容易,搜索“Python實戰(zhàn)”會出來一大堆,也可以去Github搜“Crawler”之類的關(guān)鍵詞。當然我的博客上也有很多,是我學習的時候自己寫的,原理、過程、代碼全部都有。
一個很重要的點
這里有個很重要的點,也是我反復在說的一個點,就是爬蟲的關(guān)鍵其實不在于代碼編寫,而是對網(wǎng)站反爬蟲機制的逆向。這個過程又涉及到計算機網(wǎng)絡(luò)、網(wǎng)絡(luò)安全、前端知識等。其實還是挺復雜的,我只是恰好對這些領(lǐng)域都有所涉獵。因此上手寫爬蟲的時間很短。
舉個簡單的例子,如果要分析瀏覽器和服務(wù)器是怎么交互的,你首先要會抓包分析,交互用的是什么協(xié)議(http還是https),用的什么方法(GET還是POST),報文頭帶了那些參數(shù)?(TOKEN?uid?),只有弄清了這些,才能最大程度的用程序模擬人的訪問行為,避免被網(wǎng)站封殺。
通常來說,報文中帶的參數(shù)都是加密過的,加密的方式千變?nèi)f化不計其數(shù),這是反爬蟲的核心。那么熟悉常見的加密算法顯然是必須的。其次,這些加密一般是在js文件里完成的,如何從眾多js文件中定位出相關(guān)的加密代碼?至少你需要看得懂js吧。
實際情況會復雜一點,但是這幾個方面的知識是必須的。如果不會的話,雖然不難,但是總要花時間學的。
然后我就這么不斷地寫,遇到了各種各樣的問題這里就不寫了??傊肽旰蟾杏X有很大的提升,我就開始找工作了。
關(guān)于招聘網(wǎng)站
簡歷的話,內(nèi)容自然是斟酌過的,格式我沒有專門去弄,只是用markdown寫了一份。(感覺程序員的話,也不在意格式的問題,何況markdown本來看起來就很簡潔,還是挺不錯的。)
在我上一次換工作時,我用的是智聯(lián)、58和趕集。這回回來一看,又出現(xiàn)了拉鉤、獵聘、51job、100offer和boss直聘。先說結(jié)論,技術(shù)向找工作用拉鉤和boss直聘。某段時間我投了很多,其中拉鉤和boss直聘給我的反饋最好。最后,我的工作是自己投簡歷給HR找到的。
拉鉤是我用下來體驗最好的,而且我很多面試也來源于這個平臺。而且拉鉤app上的交流也很友好,問候語可以自己定義。這是我的首推。
比拉鉤略次一點的是boss直聘。這個平臺想做的概念就是讓面試者直接和企業(yè)高管對話,然而私以為這并不合理,高管有高管自己的事,公司招人的事本來就應(yīng)該是HR的責任,這樣做豈不是本末倒置?除了這一點,boss直聘app的問候語功能也是我要吐槽的,不支持自定義;然后自帶的幾個問候模板用起來有很尷尬。而且如果雙方不各自至少說一句話的話,是不能發(fā)送簡歷的。這就會導致一個場景:boss給我發(fā)了一句話:“小伙子對你很感興趣,能不能聊聊?”,然后我說:“好的?!?,注意此時才算我和boss建立的聯(lián)系,我才能給boss發(fā)送我的建立,之后boss一看簡歷并不合適,就不了了之了。如果我對某個崗位感興趣,為什么我不能直接投簡歷呢?而且有時候我明明不符合這個崗位,仍然有boss聯(lián)系我,是不是系統(tǒng)自己推薦的?
剩下的幾個網(wǎng)站我想吐槽的點就有點多了。首先這幾個網(wǎng)站都有個共同的毛病,不能上傳簡歷。因此我需要將我簡歷里的內(nèi)容復制黏貼到網(wǎng)站提供的表單里面。這個過程是很耗時的,更糟的是,網(wǎng)站的表單并不是轉(zhuǎn)為技術(shù)人員設(shè)計的,很多想填的東西找不到地方填;最糟糕的地方是,網(wǎng)站還會要求你填一些你不想,其實也可以不填的內(nèi)容,比如說當前的薪水。
這幾個網(wǎng)站里面又以獵聘最差,我記得獵聘的表單里要填戶口、當前工作城市(默認我有工作?)、年薪等。它的工作年限是根據(jù)你填的項目經(jīng)歷計算出來的,而我第一份工作是2012年,中間讀了兩年碩士,但是自動生成的簡歷上,我的工作年限是五年以上。這導致我的備注里面直接寫了“實際工作經(jīng)驗為3年,因網(wǎng)站問題無法正確填寫。“。除了這些,獵聘顧名思義,上面基本都是獵頭;獵頭其實沒問題,問題是也沒給我推到什么合適的職位。其他幾個網(wǎng)站或多或少也有類似的問題,總之就是不順暢。
前程無憂和智聯(lián)差不多,但是體驗也不好,感覺很低端,在投了一份簡歷后,會彈出3-5個相關(guān)的崗位,你可以選擇一鍵投遞。這點我就很不理解,你這是廣撒網(wǎng)的策略嗎?智聯(lián)招聘還有個對應(yīng)的app叫智聯(lián)卓聘,也全是獵頭,而且發(fā)郵件發(fā)的很多,然而并沒啥用。
綜上所述,我覺得比較合理的幾個找工作的途徑應(yīng)該是:找人內(nèi)推、去公司官網(wǎng)自己投、拉鉤或者boss直聘。
關(guān)于面試
因為我面試的時候人還是國外,時差導致我一天只能面一家公司。我大概投了2-3個禮拜的簡歷,差不多每天都會有一個面試。這些面試一面基本都過了,后來有一個公司進度比較快,連著3輪面試,然后給的待遇也不錯,我就簽了。這樣后面幾個沒完成的招聘就沒有繼續(xù)下去,其實個人覺得拿到offer應(yīng)該都沒什么問題。
這里面還不包括一些不愿意視頻面試的公司,要我回國后去上海當面面試。這點其實我也不太能理解,反正最后也都不了了之了。
關(guān)于爬蟲的話,面試的問題其實都差不多。我羅列一下:
自我介紹。我發(fā)現(xiàn)厲害的面試官一般都不會要你做自我介紹,而要你自我介紹的其實只是需要幾分鐘看看你的簡歷。至于面試官厲不厲害,其實看他問問題的角度就能看出來了。
項目中遇到最難的地方?是怎么解決的?
詳細問你某個項目的過程。因此你需要很了解你自己做的項目。我被問到最多的是關(guān)于淘寶UA值的計算過程,似乎大家都對淘寶很感興趣。
HTTP的三次握手和四次揮手。這個是個高頻,我被問了好幾次。
進程、線程和協(xié)程。
如何設(shè)計一個爬蟲。
常見的反爬機制有哪些,每種機制的應(yīng)對方案。這個也是個高頻。
如何提高小組的代碼質(zhì)量?我答的是peer review。
常見的去重策略和存儲方案。
用過哪些爬蟲框架。
基本就這些,可以看到,我很少會被問到只和Python相關(guān)的問題(只有一次,問了list和tuple的區(qū)別)。但是去研究下Python,總沒什么壞處。另外一些可能的加分項:
技術(shù)博客,github
英語
祝大家好運。