前言:本文無原始碼,來聊聊爬蟲工程師終將逝去的青春
此刻的我正坐在工位上,看著面前的某網站爬蟲程式碼,陷入了回憶。
緣起
“你寫一下XX網的爬蟲,主要是爬一下個人資料,你大概需要多久?” “4、5天吧”,曾經用2、3天寫了知乎爬蟲的我給自己留了寬裕的時間用來摸魚。 “那好,我給你一個星期時間。” “好的”
這是零工作經驗的我入職這家公司以來接到的第一個專案,從零開始寫一個爬蟲。
既不是在爬蟲系統上新增功能,也不是給祖傳程式碼填坑。
我給了自己4、5天時間。
然後就走上了這條不歸路……
一個爬(fei)蟲(pin)的誕生
基於程式設計師必備的搜尋技能,我迅速的在github上找到了一個相似的爬蟲程式碼。
修修改改,我只花費了2天時間就寫好了爬蟲,post請求呀、ajax非同步載入呀、正則匹配呀、json呀什麼的,甚至還優化了原作者的程式碼。
同時,距離作者寫出這個程式碼,已經過去很久了,網站一些資訊的獲取規則已經不同了。由於網站特別的策略,我學會了識別網頁原始碼偽裝通過二次傳遞值來查詢目標資訊。(首先找到傳遞值,再通過傳遞值匹配目標資訊)
於是,很快,我的爬蟲歡樂地執行了起來。
並且,滿(nei)懷(liu)熱(man)情(mian)地花了1個多月時間為自己的爬蟲補坑(手動再見。
第一個障礙
爬蟲跑起來之後,由於單個賬號請求次數過多,出現了驗證碼,會往註冊的郵箱裡發一條包含驗證碼的郵件,填上就可以重新登入。
我始終沒有通過requests越過這道坎,最終我選擇了用selenium來登入網站並提交驗證碼,並將登入成功後的cookies資訊傳遞給獲取資訊的函式塊中。
這時,我學會了用imaplib模組登入郵箱獲取驗證碼。
部署伺服器
解決了驗證碼登入的問題,程式又一次跑了起來,此時就需要部署到伺服器上了。
selenium的瀏覽器chrome不利於在伺服器上執行,於是我學會了將selenium結合無頭瀏覽器phantomjs使用。
伺服器是新開的,環境還需要配置,於是我又學會了配置伺服器的基本操作。
功能分離
當單個賬號單日傳送的請求過多達到閥值時,網站毫不留情地封掉了賬號,沒有冷卻時間,永久封禁。
同事為我提供了批量的賬號,而我 跑崩了一個又一個。
於是我又改變了使用賬號的策略,多個賬號,輪流爬,每個爬幾下就換。
此時不停地用selenium登入賬號已經變成肥腸影響爬蟲速度的一個事情了,於是我開始分割程式碼。
一個程式碼用來為賬號更新cookie,一個程式碼直接取cookie,而可用的cookie資訊,我存在了mysql中(這或許就是菜雞吧)。。。。。
而這樣的功能分離,它有一個高階的名字,生產者-消費者模型。
多執行緒
此時爬蟲,已經可以無障礙的執行了,擋在面前的問題是爬蟲的速度,我開啟了多執行緒,這時問題又來了,url的重複提取問題,單例執行時不需要考慮的問題,但當開啟了多執行緒、多程式等併發操作時,url的去重就變得必要了。
再一次功能分離,將需要提取的url,放入redis庫中,爬蟲程式中直接使用pop函式獲取url,取出即刪除,不會出現重複提取的情況,redis是一個在快取方面非常優秀的資料庫。
此時的程式碼為了多執行緒的配合,將所有的與爬蟲無關的,獲取cookies,存取資料資訊,都分離了出來,所有的通訊都只存在於redis之間。
最後
有人會想,這不就是一個專案的流程嗎?
為什麼這篇文章的名字是爬蟲工程師勸退文呢?
因為我的賬號依然被禁了。。。。。
於是我接手了同事的註冊賬號的專案。。。。。
砸了N多經費去買ip,買收驗證碼的手機號。。。。。
折騰了N久終於準備開心地把序號產生器程式碼也部署到伺服器上形成程式閉環。。。。。
。
。
。
。
。
發現網站改了註冊策略。。。。。。。
總結語:你看,學了這麼多知識,依然過不好這爬蟲工程師的一生,大家還是不要私信問我需要哪些技能才能做爬蟲工程師了!趕緊轉行跑路吧!(敲黑板!劃重點!)