0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

爬蟲工程師是干什么的 需要掌握哪些技能

工程師人生 ? 來源:工程師吳畏 ? 2019-04-18 15:42 ? 次閱讀

互聯(lián)網(wǎng)是由一個一個的超鏈接組成的,從一個網(wǎng)頁的鏈接可以跳到另一個網(wǎng)頁,在新的網(wǎng)頁里,又有很多鏈接。理論上講,從任何一個網(wǎng)頁開始,不斷點開鏈接、鏈接的網(wǎng)頁的鏈接,就可以走遍整個互聯(lián)網(wǎng)!這個過程是不是像蜘蛛沿著網(wǎng)一樣爬?這也是“爬蟲”名字的由來。

作為爬蟲工程師,就是要寫出一些能夠沿著網(wǎng)爬的”蜘蛛“程序,保存下來獲得的信息。一般來說,需要爬出來的信息都是結(jié)構(gòu)化的,如果不是結(jié)構(gòu)化的,那么也就沒什么意義了(但百分之八十的數(shù)據(jù)是非結(jié)構(gòu)化的)。爬蟲的規(guī)模可達可小,小到可以爬取豆瓣的top 250電影,定時爬取一個星期的天氣預報等。大到可以爬取整個互聯(lián)網(wǎng)的網(wǎng)頁(例如google)。下面這些,我認為都可以叫做爬蟲:

爬知乎的作者和回答

爬百度網(wǎng)盤的資源,存到數(shù)據(jù)庫中(當然,只是保存資源的鏈接和標題),然后制作一個網(wǎng)盤的搜索引

同上,種子網(wǎng)站的搜索引擎也是這樣的

到這里,我們知道爬蟲的任務是獲取數(shù)據(jù)?,F(xiàn)在比較流行大數(shù)據(jù),從互聯(lián)網(wǎng)方面講,數(shù)據(jù)可以分成兩種,一種是用戶產(chǎn)生的(UGC),第二種就是通過一些手段獲得的,通常就是爬蟲。爬蟲又不僅僅局限于從網(wǎng)頁中獲得數(shù)據(jù),也可以從app抓包等。簡而言之,就是聚合數(shù)據(jù)并讓他們結(jié)構(gòu)化。那么,哪些工作需要爬蟲呢?

一。爬蟲能做什么?

典型的數(shù)據(jù)聚合類的網(wǎng)站都需要爬蟲。比如Google搜索引擎。Google能在幾毫秒之內(nèi)提供給你包含某些關鍵字的頁面,肯定不是實時給你去找網(wǎng)頁的,而是提前抓好,保存在他們自己的數(shù)據(jù)庫里(那他們的數(shù)據(jù)庫得多大呀)。所以種子搜索引擎,網(wǎng)盤搜索引擎,Resillio key引擎等都是用爬蟲實現(xiàn)抓好數(shù)據(jù)放在數(shù)據(jù)庫里的。

另外有一些提供信息對比的網(wǎng)站,比如比價類的網(wǎng)站,就是通過爬蟲抓取不同購物網(wǎng)站商品的價格,然后將各個購物網(wǎng)站的價格展示在網(wǎng)站上。購物網(wǎng)站的價格時時都在變,但是比價網(wǎng)站抓到的數(shù)據(jù)不會刪除,所以可以提供價格走勢,這是購物網(wǎng)站不會提供的信息。

除此之外,做一些好玩的事情。比如我們想看大量的圖片,可以寫一個爬蟲批量下載下來,不必一個一個點擊保存,還要忍受網(wǎng)站的廣告了;比如我們想備份自己的資料,例如保存下來我們在豆瓣發(fā)布過的所有的廣播,可以使用爬蟲將自己發(fā)布的內(nèi)容全部抓下來,這樣即使一些網(wǎng)站沒有提供備份服務,我們也可以自己豐衣足食。

二。爬蟲工程師需要掌握哪些技能?

我見過這樣的說法:“爬蟲是低級、重復性很多的工作,沒有發(fā)展前途”。這是誤解。首先,對于程序員來說基本上不存在重復性的工作,任何重復勞動都可以通過程序自動解決。例如博主之前要抓十幾個相似度很高但是html結(jié)構(gòu)不太一樣的網(wǎng)站,我就寫了一個簡單的代碼生成器,從爬蟲代碼到單元測試代碼都可以自動生成,只要對應html結(jié)構(gòu)稍微修改一下就行了。所以我認為,重復性的勞動在編程方面來說基本上是不存在的,如果你認為自己做的工作是重復性的,說明你比較勤快,不愿意去偷懶。而我還認為,勤快的程序員不是好程序員。下面我根據(jù)自己這段時間的工作經(jīng)歷,講一講爬蟲需要哪些相關的技能。

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

這個對于任何編程工作來說都是必須的?;A的數(shù)據(jù)結(jié)構(gòu)你得會吧。數(shù)據(jù)名字和值得對應(字典),對一些url進行處理(列表)等等。事實上,掌握的越牢固越好,爬蟲并不是一個簡單的工作,也并不比其他工作對編程語言的要求更高。熟悉你用的編程語言,熟悉相關的框架和庫永遠是百益無害。

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

2.任務隊列

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

如果中間遇到錯誤停掉,重頭再來?這不科學

我怎么知道程序在哪里失敗了?任務和任務之間不應該相互影響

如果我有兩臺機器怎么分工?

所以我們需要一種任務隊列,它的作用是:講計劃抓取的網(wǎng)頁都放到任務隊列里面去。然后worker從隊列中拿出來一個一個執(zhí)行,如果一個失敗,記錄一下,然后執(zhí)行下一個。這樣,worker就可以一個接一個地執(zhí)行下去。也增加了擴展性,幾億個任務放在隊列里也沒問題,有需要可以增加worker,就像多一雙虧筷子吃飯一樣。

常用的任務隊列有kafka,beanstalkd,celery等。

3.數(shù)據(jù)庫

這個不用講了,數(shù)據(jù)保存肯定要會數(shù)據(jù)庫的。不過有時候一些小數(shù)據(jù)也可以保存成json或者csv等。我有時想抓一些圖片就直接按照文件夾保存文件。

推薦使用NoSQL的數(shù)據(jù)庫,比如mongodb,因為爬蟲抓到的數(shù)據(jù)一般是都字段-值得對應,有些字段有的網(wǎng)站有有的網(wǎng)站沒有,mongo在這方面比較靈活,況且爬蟲爬到的數(shù)據(jù)關系非常非常弱,很少會用到表與表的關系。

4.HTTP知識

HTTP知識是必備技能。因為要爬的是網(wǎng)頁,所以必須要了解網(wǎng)頁啊。

首先html文檔的解析方法要懂,比如子節(jié)點父節(jié)點,屬性這些。我們看到的網(wǎng)頁是五彩斑斕的,只不過是被瀏覽器處理了而已,原始的網(wǎng)頁是由很多標簽組成的。處理最好使用html的解析器,如果自己用正則匹配的話坑會很多。我個人非常喜歡xpath,跨語言,表達比價好,但是也有缺點,正則、邏輯判斷有點別扭。

HTTP協(xié)議要理解。HTTP協(xié)議本身是無狀態(tài)的,那么“登錄”是怎么實現(xiàn)的?這就要求去了解一下session和cookies了。GET方法和POST方法的區(qū)別(事實上除了字面意思不一樣沒有任何區(qū)別)。

瀏覽器要熟練。爬蟲的過程其實是模擬人類去瀏覽器數(shù)據(jù)的過程。所以瀏覽器是怎么訪問一個網(wǎng)站的,你要學會去觀察,怎么觀察呢?Developer Tools!Chrome的Developer Tools提供了訪問網(wǎng)站的一切信息。從traffic可以看到所有發(fā)出去的請求。copy as curl功能可以給你生成和瀏覽器請求完全一致的curl請求!我寫一個爬蟲的一般流程是這樣的,先用瀏覽器訪問,然后copy as curl看看有哪些header,cookies,然后用代碼模擬出來這個請求,最后處理請求的結(jié)果保存下來。

5.運維

這個話題要說的有很多,實際工作中運維和開發(fā)的時間差不多甚至更多一些。維護已經(jīng)在工作的爬蟲是一個繁重的工作。隨著工作時間增加,一般我們都會學著讓寫出來的爬蟲更好維護一些。比如爬蟲的日志系統(tǒng),數(shù)據(jù)量的統(tǒng)計等。將爬蟲工程師和運維分開也不太合理,因為如果一個爬蟲不工作了,那原因可能是要抓的網(wǎng)頁更新了結(jié)構(gòu),也有可能出現(xiàn)在系統(tǒng)上,也有可能是當初開發(fā)爬蟲的時候沒發(fā)現(xiàn)反扒策略,上線之后出問題了,也可能是對方網(wǎng)站發(fā)現(xiàn)了你是爬蟲把你封殺了,所以一般來說開發(fā)爬蟲要兼顧運維。

所以爬蟲的運維我可以提供下面幾個思路:

首先,從數(shù)據(jù)增量監(jiān)控。定向爬蟲(指的是只針對一個網(wǎng)站的爬蟲)比較容易,一段時間之后對一些網(wǎng)站的數(shù)據(jù)增量會有一個大體的了解。經(jīng)??纯催@些數(shù)據(jù)的增加趨勢是否是正常就可以了(Grafana)。非定向爬蟲的數(shù)據(jù)增量不是很穩(wěn)定,一般看機器的網(wǎng)絡狀況,網(wǎng)站的更新情況等(這方面我的經(jīng)驗不多)。

然后看爬蟲執(zhí)行的成功情況。在上面提到了用任務隊列控制爬蟲工作,這樣解耦可以帶來很多好處,其中一個就是可以就是可以對一次爬蟲執(zhí)行進行日志??梢栽诿看闻老x任務執(zhí)行的時候,將執(zhí)行的時間、狀態(tài)、目標url、異常等放入一個日志系統(tǒng)(比如kibana),然后通過一個可視化的手段可以清晰地看到爬蟲的失敗率。

爬蟲拋出的Exception。幾乎所有的項目都會用到錯誤日志收集(Sentry),這里需要注意的一點是,忽略正常的異常(比如Connection錯誤,鎖沖突等),否則的話你會被這些錯誤淹沒。

三、爬蟲與反爬

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

1.訪問頻率

很好理解,如果訪問太頻繁網(wǎng)站可能針對你的ip封鎖一段時間,這和防DDoS的原理一樣。對于爬蟲來說,碰到這樣的限制一下任務的頻率就可以了,可以盡量讓爬蟲想人類一樣訪問網(wǎng)頁(比如隨機sleep一段時間,如果每隔3s訪問一次網(wǎng)站很顯然不是正常人的行為)。

2.登錄限制

也比較常見。不過公開信息的網(wǎng)站一般不會有這個限制,這樣讓用戶也麻煩了。其實反爬措施都或多或少的影響真實用戶,反爬越嚴格,誤殺用戶的可能性也越高。對爬蟲來說,登錄同樣可以通過模擬登錄的方式解決,加個cookie就行了(話又說回來,網(wǎng)絡的原理很重要)。

3.通過Header封殺

一般瀏覽器訪問網(wǎng)站會有header,比如Safari或者Chrome等等,還有操作系統(tǒng)信息。如果使用程序訪問并不會有這樣的header。破解也很簡單,訪問的時候加上header就行。

4.JavaScript腳本動態(tài)獲取網(wǎng)站數(shù)據(jù)

有一些網(wǎng)站(尤其是單頁面網(wǎng)站)的內(nèi)容并不是通過服務器直接返回的,而是服務器只返回一個客戶端JavaScript程序,然后JavaScript獲取內(nèi)容。更高級的是,JavaScript在本地計算一個token,然后拿這個token來進行AJAX獲取內(nèi)容。而本地的JavaScript又是經(jīng)過代碼混淆和加密的,這樣我們做爬蟲的通過看源代碼幾乎不可能模擬出來這個請求(主要是token不可能破解),但是我們可以從另一個角度:headless的瀏覽器,也就是我們直接運行這個客戶端程序,這可以100%地模擬真實用戶!

5.驗證碼

這幾乎是終極武器了,驗證碼是專門用來區(qū)分人和計算機的手段。對于反爬方來說,這種方式對真實用戶和搜索引擎(其實可以通過記錄搜索引擎爬蟲的ip來區(qū)別對待,可以解決)的危害比較大,相信讀者都有輸入驗證碼的痛苦經(jīng)歷。但這種方法也并不是無敵的!通過現(xiàn)在很火的機器學習可以輕松的識別大部分的驗證碼!Google的reCAPTCHA是一種非常高級的驗證碼,但是聽說通過模擬瀏覽器也是可以破解的。

6.ip限制

網(wǎng)站可能將識別的ip永久封殺,這種方式需要的人力比較大,而且誤傷用戶的代價也很高。但是破解辦法卻非常簡單。目前代理池幾乎是搞爬蟲的標配了,甚至還有很多高匿代理等好用的東西。所以這基本上只能殺殺小爬蟲。

7.網(wǎng)站內(nèi)容反爬

有一些網(wǎng)站將網(wǎng)站內(nèi)容用只有人類可以接收的形式來呈現(xiàn)(其實反爬就是區(qū)別對待人類和機器嘛)。比如將內(nèi)容用圖片的形式顯示。但是近幾年來人類和機器的差別越來越小,圖片可以用OCR準確率非常高地去識別。

反爬總結(jié)

爬蟲和反爬是典型的攻防雙方的互相升級。但是我認為,這種升級不像軍事,軍事是無盡頭的,但是爬蟲和反爬是有盡頭的。

爬蟲的盡頭就是瀏覽器,一旦使用瀏覽器,程序完全可以模擬真實用戶發(fā)出請求,缺點是就是消耗資源,因為需要新開一個進程,解析DOM,運行客戶端JavaScript代碼。(chrome的node api在github開源僅僅兩天,就拿到8k個star)

反爬的盡頭就是像Google這種超級厲害的驗證碼,畢竟驗證碼的根本目的就是識別人類和機器的。

我正好有一個反爬做的非常好的例子。Google Arts Project項目是一個匯聚世界名畫的藝術長廊,我比較喜歡里面的一些畫,所以想下載一些(當然這是不對的),然后發(fā)現(xiàn)這個網(wǎng)站反爬做的相當好(因為版權(quán)屬于收藏作品的博物館,所以Google Arts Project肯定不會提供下載),要下載幾乎是不可能的。我有點不服,開始用各種手段試圖下載原圖。嘗試了一番,發(fā)現(xiàn)這個網(wǎng)站block掉了鼠標右鍵功能、審查元素發(fā)現(xiàn)圖片并不是一個常規(guī)的圖片、追蹤網(wǎng)絡包發(fā)現(xiàn)原圖竟然不是一次網(wǎng)絡請求拿到的,而是分成了好幾次請求base64編碼的字符流每次請求圖片的一部分,然后在客戶端組裝起來圖片!當然在客戶端的代碼也是經(jīng)過加密和混淆的!這完全可以作為反爬的教科書了,既沒有誤傷用戶,又讓爬蟲無法下手。

圖片每次只請求部分

四、職業(yè)道德

成規(guī)模的爬蟲一般都會使用集群,一般的小網(wǎng)站服務器規(guī)模可能不如爬蟲集群的規(guī)模大。所以很多時候我們最好對要爬的網(wǎng)站限制一下頻率。否則這些爬蟲就相當于DoS攻擊集群了!一般的網(wǎng)站都會有robots.txt可以參考。

好了,總結(jié)來說,寫爬蟲需要經(jīng)驗積累,需要靈活的思路。比如說我之前就遇到過網(wǎng)站,需要驗證碼驗證拿到一個token,可是通過看網(wǎng)絡請求發(fā)現(xiàn)這個token長得很像一個時間戳,然后本地自己生成一個時間戳發(fā)現(xiàn)也是能用的!于是就這樣繞過了驗證碼。所以多多積累和嘗試,可以偷不少懶,嘿嘿。

另外爬蟲也不是和我之前想的那樣是一個枯燥無味的工作,比如我就發(fā)現(xiàn)了不少很垃圾,很搞笑的網(wǎng)站,樂趣也蠻多的。學到的東西也不少。萬變不離其宗嘛。

互聯(lián)網(wǎng)時代信息無處不在,我們?nèi)粘K佑|的大量信息例如微博、社交媒體網(wǎng)站的帖子、消費者點評、新聞、銷售人員的拜訪記錄,這些都是常見的非結(jié)構(gòu)化數(shù)據(jù)來源。非結(jié)構(gòu)化數(shù)據(jù)分析能夠揭示潛藏在文本當中的趨勢和關聯(lián),為商業(yè)決策、研究行業(yè)趨勢和熱點內(nèi)容分析提供有力支持。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 工程師
    +關注

    關注

    59

    文章

    1571

    瀏覽量

    68574
  • 網(wǎng)絡爬蟲

    關注

    1

    文章

    52

    瀏覽量

    8705
收藏 人收藏

    評論

    相關推薦

    年薪30萬的嵌入式工程師,究竟需要掌握哪些技能?

    隨著智能硬件、物聯(lián)網(wǎng)、智能汽車、自動化控制等領域的迅速發(fā)展,嵌入式工程師的需求也水漲船高。尤其是在全球化和技術加速的時代,嵌入式開發(fā)不僅是一個熱門行業(yè),還是跨學科技術與創(chuàng)新的交匯點。對于那些具備扎實
    的頭像 發(fā)表于 01-16 10:59 ?78次閱讀
    年薪30萬的嵌入式<b class='flag-5'>工程師</b>,究竟<b class='flag-5'>需要</b><b class='flag-5'>掌握</b>哪些<b class='flag-5'>技能</b>?

    笑死,掌握一眼識別資深硬件工程師的訣竅了!# #電路知識 #電工 #硬核拆解

    硬件工程師
    MDD辰達半導體
    發(fā)布于 :2024年12月20日 17:48:17

    硬件工程師需要掌握的硬件基礎知識

    作為一個資深硬件工程師,我們需要掌握一些硬件基礎知識,今天總結(jié)一下哪些算是基礎知識。給學電子方面想從事硬件工作的同學們一點提示。給未走出大學校園的電子方面的學生一些幫助。 ? 工具/原料 萬用表
    的頭像 發(fā)表于 12-02 09:22 ?435次閱讀
    硬件<b class='flag-5'>工程師</b><b class='flag-5'>需要</b><b class='flag-5'>掌握</b>的硬件基礎知識

    電力電子工程師拿到50W以上的年薪需要具備哪些技能

    高薪電力電子工程師需要具備的技能
    的頭像 發(fā)表于 11-05 09:44 ?351次閱讀
    電力電子<b class='flag-5'>工程師</b>拿到50W以上的年薪<b class='flag-5'>需要</b>具備哪些<b class='flag-5'>技能</b>

    LM318 COMP管腳是什么引腳,干什么用的?

    LM318 COMP 管腳是什么引腳,干什么用的,PSPICEFORTI 里面沒有318的COMP管腳在怎么應用
    發(fā)表于 07-31 07:45

    嵌入式軟件工程師如何提升自己?

    的發(fā)展打下堅實的基礎。 2.掌握專業(yè)技能 除了基礎知識外,嵌入式軟件工程師需要掌握專業(yè)的技能。
    發(fā)表于 06-12 11:20

    嵌入式軟件工程師和硬件工程師的區(qū)別?

    。他們之間的緊密合作對于成功開發(fā)出高效的嵌入式系統(tǒng)至關重要。 嵌入式軟件工程師和嵌入式硬件工程師在工作中有著不同的技能要求和專業(yè)知識。嵌入式軟件工程師
    發(fā)表于 05-16 11:00

    美國云服務器是干什么的

    美國云服務器主要用于提供計算資源、托管網(wǎng)站、應用程序以及存儲數(shù)據(jù)等。很多用戶想要了解美國云服務器具體是干什么的,rak部落小編為您整理發(fā)布美國云服務器是干什么的。 美國云服務器是一種**基于云
    的頭像 發(fā)表于 04-10 10:16 ?453次閱讀

    嵌入式工程師需要掌握哪些技術?

    嵌入式工程師需要掌握哪些技術? 嵌入式系統(tǒng)是當今科技領域中的重要組成部分,它們存在于我們生活的方方面面,從智能手機到汽車控制系統(tǒng),從家電到醫(yī)療設備。因此,對于那些想要進入嵌入式行業(yè)的人來說,
    發(fā)表于 03-04 16:38

    美國云服務器是干什么的

    對于美國服務器是干什么的,相信很多小白用戶不是非常了解,接下來小編就為您整理發(fā)布美國云服務器是干什么的相關資訊,希望對您有幫助。
    的頭像 發(fā)表于 02-19 09:53 ?464次閱讀

    云服務器是干什么的

     云服務器是干什么的?很多小白用戶會有疑惑,今天小編為您整理云服務器是干什么的相關資料,希望對您了解云服務器是干什么的有幫助。
    的頭像 發(fā)表于 02-18 09:58 ?1520次閱讀

    優(yōu)秀電源工程師需要哪些必備技能

    就帶大家細數(shù)一下優(yōu)秀電源工程師具備的那些技能。一、新手必備課程成為一名電源高手需要扎實的理論基礎,涉及電路原理、語言編程和控制理論等多個學科領域。為了幫助大家更好地掌握電源開發(fā)相關的關
    發(fā)表于 01-29 11:29

    什么是溫補晶振?溫補晶振是干什么的?

    什么是溫補晶振?溫補晶振是干什么的?? 溫補晶振是指對晶體振蕩器進行溫度補償?shù)囊环N技術。晶體振蕩器是一種電子設備,通過驅(qū)動晶體諧振頻率上的機械振動來產(chǎn)生穩(wěn)定的電信號。它在現(xiàn)代電子設備中廣泛應用,如
    的頭像 發(fā)表于 01-23 16:42 ?1188次閱讀