Python博文_爬蟲工程師是幹什麼的

程序員有時候很難和外行人講明白本身的工做是什麼,甚至有些時候,跟同行的人講清楚「你是幹什麼的」也很困難。好比我本身,就對Daivd在搞的語義網一頭霧水。因此我打算寫一篇博客,講一下「爬蟲工程師」的工做內容是什麼,須要掌握哪些技能,難點和好玩的地方等等,講到哪裏算哪裏吧。html

1、爬蟲工程師是幹嗎的?node

1.主要工做內容?android

互聯網是由一個一個的超連接組成的,從一個網頁的連接能夠跳到另外一個網頁,在新的網頁裏,又有不少連接。理論上講,從任何一個網頁開始,不斷點開連接、連接的網頁的連接,就能夠走遍整個互聯網!這個過程是否是像蜘蛛沿着網同樣爬?這也是「爬蟲」名字的由來。git

做爲爬蟲工程師,就是要寫出一些可以沿着網爬的」蜘蛛「程序,保存下來得到的信息。通常來講,須要爬出來的信息都是結構化的,若是不是結構化的,那麼也就沒什麼意義了(百分之八十的數據是非結構化的)。爬蟲的規模可達可小,小到能夠爬取豆瓣的top 250電影,定時爬取一個星期的天氣預報等。大到能夠爬取整個互聯網的網頁(例如google)。下面這些,我認爲均可以叫作爬蟲:程序員

  1. 爬知乎的做者和回答
  2. 爬百度網盤的資源,存到數據庫中(固然,只是保存資源的連接和標題),而後製做一個網盤的搜索引擎
  3. 同上,種子網站的搜索引擎也是這樣的

到這裏,咱們知道爬蟲的任務是獲取數據。如今比較流行大數據,從互聯網方面講,數據能夠分紅兩種,一種是用戶產生的(UGC),第二種就是經過一些手段得到的,一般就是爬蟲。爬蟲又不只僅侷限於從網頁中得到數據,也能夠從app抓包等。簡而言之,就是聚合數據並讓他們結構化。那麼,哪些工做須要爬蟲呢?github

2.爬蟲能作什麼?算法

典型的數據聚合類的網站都須要爬蟲。好比Google搜索引擎。Google能在幾毫秒以內提供給你包含某些關鍵字的頁面,確定不是實時給你去找網頁的,而是提早抓好,保存在他們本身的數據庫裏(那他們的數據庫得多大呀)。因此種子搜索引擎,網盤搜索引擎,Resillio key引擎等都是用爬蟲實現抓好數據放在數據庫裏的。mongodb

另外有一些提供信息對比的網站,好比比價類的網站,就是經過爬蟲抓取不一樣購物網站商品的價格,而後將各個購物網站的價格展現在網站上。購物網站的價格時時都在變,可是比價網站抓到的數據不會刪除,因此能夠提供價格走勢,這是購物網站不會提供的信息。chrome

除此以外,我的還能夠用爬蟲作一些好玩的事情。好比咱們想看大量的圖片,能夠寫一個爬蟲批量下載下來,沒必要一個一個點擊保存,還要忍受網站的廣告了;好比咱們想備份本身的資料,例如保存下來咱們在豆瓣發佈過的全部的廣播,可使用爬蟲將本身發佈的內容所有抓下來,這樣即便一些網站沒有提供備份服務,咱們也能夠本身豐衣足食。數據庫

2、爬蟲工程師須要掌握哪些技能?

我見過這樣的說法:「爬蟲是低級、重複性不少的工做,沒有發展前途」。這是誤解。首先,對於程序員來講基本上不存在重複性的工做,任何重複勞動均可以經過程序自動解決。例如博主以前要抓十幾個類似度很高可是html結構不太同樣的網站,我就寫了一個簡單的代碼生成器,從爬蟲代碼到單元測試代碼均可以自動生成,只要對應html結構稍微修改一下就好了。因此我認爲,重複性的勞動在編程方面來講基本上是不存在的,若是你認爲本身作的工做是重複性的,說明你比較勤快,不肯意去偷懶。而我還認爲,勤快的程序員不是好程序員。下面我根據本身這段時間的工做經歷,講一講爬蟲須要哪些相關的技能。

1.基本的編碼基礎(至少一門編程語言)

這個對於任何編程工做來講都是必須的。基礎的數據結構你得會吧。數據名字和值得對應(字典),對一些url進行處理(列表)等等。事實上,掌握的越牢固越好,爬蟲並非一個簡單的工做,也並不比其餘工做對編程語言的要求更高。熟悉你用的編程語言,熟悉相關的框架和庫永遠是百益無害。

我主要用Python,用Java寫爬蟲的也有,理論上講任何語言均可以寫爬蟲的,不過最好選擇一門相關的庫多,開發迅速的語言。用C語言寫確定是自找苦吃了。

2.任務隊列

當爬蟲任務很大的時候,寫一個程序跑下來是不合適的:

  1. 若是中間遇到錯誤停掉,重頭再來?這不科學
  2. 我怎麼知道程序在哪裏失敗了?任務和任務之間不該該相互影響
  3. 若是我有兩臺機器怎麼分工?

因此咱們須要一種任務隊列,它的做用是:講計劃抓取的網頁都放到任務隊列裏面去。而後worker從隊列中拿出來一個一個執行,若是一個失敗,記錄一下,而後執行下一個。這樣,worker就能夠一個接一個地執行下去。也增長了擴展性,幾億個任務放在隊列裏也沒問題,有須要能夠增長worker,就像多一雙虧筷子吃飯同樣。

經常使用的任務隊列有kafkabeanstalkdcelery等。

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錯誤,鎖衝突等),不然的話你會被這些錯誤淹沒。

3、爬蟲與反爬

這一樣是很深的一個話題,就像攻擊武器與防護武器同樣,雙方老是在不斷升級。常見的反爬措施(我遇到過的)有下面幾種:

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編碼的字符流每次請求圖片的一部分,而後在客戶端組裝起來圖片!固然在客戶端的代碼也是通過加密和混淆的!這徹底能夠做爲反爬的教科書了,既沒有誤傷用戶,又讓爬蟲沒法下手。

圖片每次只請求部分

4、職業道德

成規模的爬蟲通常都會使用集羣,通常的小網站服務器規模可能不如爬蟲集羣的規模大。因此不少時候咱們最好對要爬的網站限制一下頻率。不然這些爬蟲就至關於DoS攻擊集羣了!通常的網站都會有robots.txt能夠參考。


好了,總結來講,寫爬蟲須要經驗積累,須要靈活的思路。好比說我以前就遇到過網站,須要驗證碼驗證拿到一個token,但是經過看網絡請求發現這個token長得很像一個時間戳,而後本地本身生成一個時間戳發現也是能用的!因而就這樣繞過了驗證碼。因此多多積累和嘗試,能夠偷很多懶,嘿嘿。

另外爬蟲也不是和我以前想的那樣是一個枯燥無味的工做,好比我就發現了很多很垃圾很搞笑的網站,樂趣也蠻多的。學到的東西也很多。萬變不離其宗嘛。


5、工做內容

互聯網時代信息無處不在,咱們平常所接觸的大量信息例如微博、社交媒體網站的帖子、消費者點評、新聞、銷售人員的拜訪記錄,這些都是常見的非結構化數據來源。非結構化數據分析可以揭示潛藏在文本當中的趨勢和關聯,爲商業決策、研究行業趨勢和熱點內容分析提供有力支持。

緯橫團隊致力於打造最出色的中文語義分析技術,經過自主研發的中文分詞、句法分析、搜素引擎和實體識別技術,結合海量行業語料的不斷積累,爲企業客戶(營銷、公關、客服、銷售和產品部門)、研究機構和政府部門等提供數據監測和採集、分析和可視化以及專業服務,加強用戶在大數據時代的競爭力。

後端工程師 招聘人數:2 薪資面議

崗位職責

1. 分佈式網頁抓取平臺的研發、完善和運維,天天支持數千萬級的網頁採集、清洗和分析;

2. 產品後端 API 的開發,實現高性能、高可用及可擴展的後端代碼;

3. 線上分佈式環境的自動化運維、監控、性能調優。

職位要求

1. 紮實的算法與數據結構功底,對新的知識和技術有強烈熱情;

2. 具備較強的分析和解決問題的能力;

3. 擁有良好的編程習慣;

4. 熟悉至少一門高級編程語言(例如 Python/C++/JAVA )並有實際開發的經驗。

相關文章
相關標籤/搜索