所以我們需要一種任務隊列,它的作用是:講計劃抓取的網頁都放到任務隊列里面去。然后worker從隊列中拿出來一個一個執行,如果一個失敗,記錄一下,然后執行下一個。這樣,worker就可以一個接一個地執行下去。也增加了擴展性,幾億個任務放在隊列里也沒問題,有需要可以增加worker,就像多一雙虧筷子吃飯一樣。常用的任務隊列有kafka,beanstalkd,celery等。3.數據庫這個不用講了,數據保存肯定要會數據庫的。不過有時候一些小數據也可以保存成json或者csv等。我有時想抓一些圖片就直接按照文件夾保存文件。推薦使用NoSQL的數據庫,比如mongodb,因為爬蟲抓到的數據一般是都字段-值得對應,有些字段有的網站有有的網站沒有,mongo在這方面比較靈活,況且爬蟲爬到的數據關系非常非常弱,很少會用到表與表的關系。4.HTTP知識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,然后用代碼模擬出來這個請求,最后處理請求的結果保存下來。5.運維這個話題要說的有很多,實際工作中運維和開發的時間差不多甚至更多一些。維護已經在工作的爬蟲是一個繁重的工作。隨著工作時間增加,一般我們都會學著讓寫出來的爬蟲更好維護一些。比如爬蟲的日志系統,數據量的統計等。將爬蟲工程師和運維分開也不太合理,因為如果一個爬蟲不工作了,那原因可能是要抓的網頁更新了結構,也有可能出現在系統上,也有可能是當初開發爬蟲的時候沒發現反扒策略,上線之后出問題了,也可能是對方網站發現了你是爬蟲把你封殺了,所以一般來說開發爬蟲要兼顧運維。所以爬蟲的運維我可以提供下面幾個思路:首先,從數據增量監控。定向爬蟲(指的是只針對一個網站的爬蟲)比較容易,一段時間之后對一些網站的數據增量會有一個大體的了解。經常看看這些數據的增加趨勢是否是正常就可以了(Grafana)。非定向爬蟲的數據增量不是很穩定,一般看機器的網絡狀況,網站的更新情況等(這方面我的經驗不多)。然后看爬蟲執行的成功情況。在上面提到了用任務隊列控制爬蟲工作,這樣解耦可以帶來很多好處,其中一個就是可以就是可以對一次爬蟲執行進行日志。可以在每次爬蟲任務執行的時候,將執行的時間、狀態、目標url、異常等放入一個日志系統(比如kibana),然后通過一個可視化的手段可以清晰地看到爬蟲的失敗率。爬蟲拋出的Exception。幾乎所有的項目都會用到錯誤日志收集(Sentry),這里需要注意的一點是,忽略正常的異常(比如Connection錯誤,鎖沖突等),否則的話你會被這些錯誤淹沒。三、爬蟲與反爬這同樣是很深的一個話題,就像攻擊武器與防御武器一樣,雙方總是在不斷升級。常見的反爬措施(我遇到過的)有下面幾種:1.訪問頻率很好理解,如果訪問太頻繁網站可能針對你的ip封鎖一段時間,這和防DDoS的原理一樣。對于爬蟲來說,碰到這樣的限制一下任務的頻率就可以了,可以盡量讓爬蟲想人類一樣訪問網頁(比如隨機sleep一段時間,如果每隔3s訪問一次網站很顯然不是正常人的行為)。2.登錄限制也比較常見。不過公開信息的網站一般不會有這個限制,這樣讓用戶也麻煩了。其實反爬措施都或多或少的影響真實用戶,反爬越嚴格,誤殺用戶的可能性也越高。對爬蟲來說,登錄同樣可以通過模擬登錄的方式解決,加個cookie就行了(話又說回來,網絡的原理很重要)。3.通過Header封殺一般瀏覽器訪問網站會有header,比如Safari或者Chrome等等,還有操作系統信息。如果使用程序訪問并不會有這樣的header。破解也很簡單,訪問的時候加上header就行。4.JavaScript腳本動態獲取網站數據有一些網站(尤其是單頁面網站)的內容并不是通過服務器直接返回的,而是服務器只返回一個客戶端JavaScript程序,然后JavaScript獲取內容。更高級的是,JavaScript在本地計算一個token,然后拿這個token來進行AJAX獲取內容。而本地的JavaScript又是經過代碼混淆和加密的,這樣我們做爬蟲的通過看源代碼幾乎不可能模擬出來這個請求(主要是token不可能破解),但是我們可以從另一個角度:headless的瀏覽器,也就是我們直接運行這個客戶端程序,這可以100%地模擬真實用戶!5.驗證碼這幾乎是終極武器了,驗證碼是專門用來區分人和計算機的手段。對于反爬方來說,這種方式對真實用戶和搜索引擎(其實可以通過記錄搜索引擎爬蟲的ip來區別對待,可以解決)的危害比較大,相信讀者都有輸入驗證碼的痛苦經歷。但這種方法也并不是無敵的!通過現在很火的機器學習可以輕松的識別大部分的驗證碼!Google的reCAPTCHA是一種非常高級的驗證碼,但是聽過通過模擬瀏覽器也是可以破解的。6.ip限制網站可能將識別的ip永久封殺,這種方式需要的人力比較大,而且誤傷用戶的代價也很高。但是破解辦法卻非常簡單。目前代理池幾乎是搞爬蟲的標配了,甚至還有很多高匿代理等好用的東西。所以這基本上只能殺殺小爬蟲。7.網站內容反爬有一些網站將網站內容用只有人類可以接收的形式來呈現(其實反爬就是區別對待人類和機器嘛)。比如將內容用圖片的形式顯示。但是近幾年來人類和機器的差別越來越小,圖片可以用OCR準確率非常高地去識別。反爬總結爬蟲和反爬是典型的攻防雙方的互相升級。但是我認為,這種升級不像軍事,軍事是無盡頭的,但是爬蟲和反爬是有盡頭的。爬蟲的盡頭就是瀏覽器,一旦使用瀏覽器,程序完全可以模擬真實用戶發出請求,缺點是就是消耗資源,因為需要新開一個進程,解析DOM,運行客戶端JavaScript代碼。(chrome的node api在github開源僅僅兩天,就拿到8k個star)反爬的盡頭就是像Google這種超級厲害的驗證碼,畢竟驗證碼的根本目的就是識別人類和機器的。我正好有一個反爬做的非常好的例子。Google Arts Project項目是一個匯聚世界名畫的藝術長廊,我比較喜歡里面的一些畫,所以想下載一些(當然這是不對的),然后發現這個網站反爬做的相當好(因為版權屬于收藏作品的博物館,所以Google Arts Project肯定不會提供下載),要下載幾乎是不可能的。我有點不服,開始用各種手段試圖下載原圖。嘗試了一番,發現這個網站block掉了鼠標右鍵功能、審查元素發現圖片并不是一個常規的圖片、追蹤網絡包發現原圖竟然不是一次網絡請求拿到的,而是分成了好幾次請求base64編碼的字符流每次請求圖片的一部分,然后在客戶端組裝起來圖片!當然在客戶端的代碼也是經過加密和混淆的!這完全可以作為反爬的教科書了,既沒有誤傷用戶,又讓爬蟲無法下手。圖片每次只請求部分四、職業道德成規模的爬蟲一般都會使用集群,一般的小網站服務器規模可能不如爬蟲集群的規模大。所以很多時候我們最好對要爬的網站限制一下頻率。否則這些爬蟲就相當于DoS攻擊集群了!一般的網站都會有robots.txt可以參考。好了,總結來說,寫爬蟲需要經驗積累,需要靈活的思路。比如說我之前就遇到過網站,需要驗證碼驗證拿到一個token,可是通過看網絡請求發現這個token長得很像一個時間戳,然后本地自己生成一個時間戳發現也是能用的!于是就這樣繞過了驗證碼。所以多多積累和嘗試,可以偷不少懶,嘿嘿。另外爬蟲也不是和我之前想的那樣是一個枯燥無味的工作,比如我就發現了不少很垃圾,很搞笑的網站,樂趣也蠻多的。學到的東西也不少。萬變不離其宗嘛。五、工作內容互聯網時代信息無處不在,我們日常所接觸的大量信息例如微博、社交媒體網站的帖子、消費者點評、新聞、銷售人員的拜訪記錄,這些都是常見的非結構化數據來源。非結構化數據分析能夠揭示潛藏在文本當中的趨勢和關聯,為商業決策、研究行業趨勢和熱點內容分析提供有力支持。緯橫團隊致力于打造最出色的中文語義分析技術,通過自主研發的中文分詞、句法分析、搜素引擎和實體識別技術,結合海量行業語料的不斷積累,為企業客戶(營銷、公關、客服、銷售和產品部門)、研究機構和政府部門等提供數據監測和采集、分析和可視化以及專業服務,增強用戶在大數據時代的競爭力。崗位職責1. 分布式網頁抓取平臺的研發、完善和運維,每天支持數千萬級的網頁采集、清洗和分析;2. 產品后端 API 的開發,實現高性能、高可用及可擴展的后端代碼;3. 線上分布式環境的自動化運維、監控、性能調優。職位要求1. 扎實的算法與數據結構功底,對新的知識和技術有強烈熱情;2. 具有較強的分析和解決問題的能力;3. 擁有良好的編程習慣;4. 熟悉至少一門高級編程語言(例如 Python/C++/JAVA )并有實際開發的經驗。本文轉自https://www.kawabangga.com/posts/2277?from=%E6%96%87%E7%AB%A0%E9%A1%B5%E5%86%85%E9%93%BE%E6%8E%A5