[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

Starrier發表於2018-07-03

起因

一個週五的午夜,我的朋友們在外面玩得很開心,而我仍在電腦前工作。

奇怪的是,我並沒有感覺被忽視了。

我在做一些我認為真正有趣而且非常優秀的事情。

我剛從大學畢業,所以迫切地需要得到一份工作。當我離開西雅圖的時候,我的揹包裡裝滿了大學課本和衣服。我可以在我的 2002 Honda Civic 後備箱中裝上我的所有東西。

當時我不太喜歡社交,因此我決定用所知道的最好的方式來解決工作的問題。我試圖建立一個應用程式來幫助我,這篇文章就是關於我是如何實現這一目標的。?

開始使用 Craigslist

我在房間裡,瘋狂地開發軟體,來幫我收集和迴應那些在 Craigslist 上尋找軟體工程師的人。Craigslist 本質上是網際網路市場,在這裡你可以找到出售的物品、服務、社群部落格等。

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

Craigslist

當時,我從未構建過一個完全成熟的應用程式。我在大學裡做的大部分事情都是一些學術專案,包括建立和解析二叉樹、計算機圖形學和語言處理模型。

我是個“小白”。

儘管如此,我還是瞭解到一個叫做 Python 的熱門程式語言。我對 Python 知之甚少,但我還是不知疲倦地去學習關於它的知識。

因此我決定兩兩組合,用這種新的程式語言構建一個小的應用程式。

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

構建(工作)原型之旅

我有一臺用過的 BenQ 筆記本,是我上大學時哥哥送給我的,我現在用它來進行開發。

從任何角度來說,這都不是最好的開發環境。我正在使用 Python 2.4 和 Sublime text 的一箇舊版本,不過從頭開始編寫應用程式的過程確實是一種令人興奮的體驗。

我仍然不知道應該要做什麼。我嘗試了各式各樣的事情來看看自己到底需要什麼。我的第一個方法是找出我如何才能輕而易舉地訪問 Craigslist 資料。

我查詢了 Craigslist 是否存在公開可用的 REST API。令我難過的是,並沒有這些介面。

然而,我發現了另一個好東西

Craigslist 有一個 RSS 提要,僅供個人使用。RSS 提要本質上是一個可讀的計算機摘要網站傳送的更新。在這種情況下,RSS 提要允許我在釋出新的任務列表時獲取它們。這對於我的需要來說,實在是太完美了

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

RSS 提要的示例

接下來,我需要一種可以讀取 RSS 提要的方法。我不想親自手動瀏覽 RSS 概要,因為那將是一個時間接收器,這與瀏覽 Craigslist 沒有任何區別。

這個時候,我開始意識到 Google 的力量。有一個笑話說軟體工程師大部分時間在 Google 上找答案。我覺得這是有一定道理的。

我用 Google 搜素了一下,我在 StackOverflow 上找到了一篇有用的文章,其中描述瞭如何通過 Craiglist RSS 提要進行搜尋。這是 Craigslist 免費提供的過濾功能。我所要做的就是傳遞一個我所感興趣的具有特定關鍵字的查詢引數。

我專注於在西雅圖尋找與軟體相關的工作。在這個前提下,我在西雅圖輸了一個特定的 URL,來查詢包含關鍵字 “software” 的資訊。

seattle.craigslist.org/search/sss?…

很好,起作用了。非常漂亮

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

例如,標題為 “software” 的西雅圖 RSS 提要。

Beautiful soup 是我所使用的工具中,最好用的一個

令我不敢相信的是,我的方法起作用了。

首先,限制列舉數量。我的資料沒有包含西雅圖所有可用職位的公告。返回的結果只是整個結果的一個子集。我希望儘可能地把範圍擴大,所以我需要知道所有可用的職位清單。

其次,我意識到 RSS 提要 不包含任何聯絡資訊。這確實有點讓人失望。我可以找到這些清單,但是我無法聯絡這些釋出者,除非我手動過濾這些清單。

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

Craigslist 回覆連結的截圖

我是一個有很多技能而且有很多興趣的人,但是重複手動工作並不是其中之一。我本可以僱用別人幫我做這件事,但是我僅能用一美元的拉麵勉強維持生活,所有這就意味著我不能在這個附帶的專案上任意揮霍。

這是死衚衕,但並不意味著結束

持續迭代

從第一次失敗的嘗試中,我瞭解到 Craigslist 有 RSS 提要,並且每個部落格都有轉到真實部落格本身的連結。

很好,如果我可以訪問真實的部落格,那麼也許我可以爬取它的電子郵箱地址?? 這意味著我需要找到一種方法從原始部落格中獲取電子郵件地址。

這一次,我依舊找到了我所信任的 Google,搜尋 “ways to parse a website。”

在 Google 上,我發現了一個很酷的 Python 小功能,叫做 Beautiful Soup。本質上,它是一個很好工具,允許你解析整個 DOM 樹,並幫助你理解網頁的結構。

我的需求很簡單:我需要一個易於使用的工具,可以讓我從網頁上收集資料。BeautifulSoup 檢查了這兩個盒子而不是花更多的時間挑選最好的工具,我選擇了一個有用的工具,然後繼續下去。這裡是具有相似操作的可選列表

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

BeautifulSoup 的主頁

小貼士:我發現一個很優秀的指南,它描述瞭如何使用 Python 和 BeautifulSoup 進行網頁抓取。如果你有興趣學習如何爬蟲,那麼我建議你閱讀它。

有了這個新工具,我的工作流也就設定好了。

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

我的工作流

我現在已經準備好進行下一個任務了:從實際的部落格中抓取電子郵件地址。

現在,關於開源技術,有件很酷的事情。他們是自由的而且工作很棒!這就像在炎炎夏日裡免費吃冰淇一塊新烤好的巧克力曲奇餅一樣。

BeautifulSoup 允許你在網頁上搜尋特定的 HTML tag 或者 marker。而且 Craigslist 已經把它們處理的很好了,所以找到電子郵件地址輕而易舉。tag 是類似於 “email-reply-link” 這樣的東西,它基本上已經說明了電子郵件連結是可用的。

自此以後,一起都變得簡單了。我依賴於 BeautifulSoup 提供的內建功能,只需使用一些簡單的操作,我就可以很容易的從 Craigslist 部落格中獲取電子郵件地址。

進行內容組合

不到一小時,我就有了自己的第一個 MVP,我已經建立了一個網頁爬蟲,可以收集電子郵件地址,並回復西雅圖半徑 100 英里範圍內尋找軟體工程師的人。

[譯] 我是如何從零開始建立一個網路爬蟲來實現我的求職自動化的

程式碼截圖

我在原始指令碼的基礎上新增了各種附加元件,來得到更好的效果。例如,我將結果儲存在 CSV 和 HTML 頁面中,以便可以更快速地解析它們。

當然還有許多其他值得注意的特點,例如:

  • 記錄我傳送電子郵件地址的能力
  • 疲勞規則可以防止向我已經接觸過的人傳送電子郵件的特殊情況
  • 特列,一些郵件在顯示之前,需要驗證碼,以防止機器人操作(就像我這樣的)
  • Craigslist 不允許爬蟲在它們的網頁上,所以如果我執行的太頻繁,就會被禁止操作。(我試圖在不同的 VPN 之間切換,來“欺騙” Craigslist,但是不起作用)。
  • 我仍然無法檢索 Craigslist 上的所有帖子

最後一個是 kicker。但我認為如果一個帖子已經存在一段時間,那麼發帖人可能無法在找到。這需要權衡,但我應該可以處理。

整個體驗就像是 Tetris。我知道我的最終目標是什麼,而我真正的挑戰是把合適的部分組合在一起以實現特定的最終目標。每一個拼圖都給我帶來了不同的旅程。雖然這很有挑戰性,但我卻樂在其中,而且每一次我都會學到新的東西。

學到的教訓

這是一次讓人大開眼界的經驗,我最終學習了一些關於網際網路(和 Craigslist)如何執行的知識,各種不同的工具如何協同工作來解決一個問題,而且我得到了一個很酷的小故事,我可以和朋友分享這些。

從某種意義上說,這就像現在的技術是如何工作的。你發現了一個你需要解決的巨大而複雜的問題。而你看不到任何直接的、明顯的解決方案。你把這個大而複雜的問題分解成多個不同的可管理的塊,然後依次解決每一個塊。

回顧過去,我的問題是:**我如何才能利用網際網路上這個優秀的目錄,迅速接觸到有特定興趣的人?**當時沒有已知的產品或解決方案,所以我把它分解成多個部分:

  1. 查詢平臺上的所有列表
  2. 收集有關每個列表的聯絡資訊
  3. 如果有聯絡資訊,就傳送一封郵件

這就是它的全部。技術只是作為達到目的手段。如果我能用 Excel 電子表格來幫我做,我會選擇這樣做。然而,我不是 Excel 大師,所以我採用了當時對我最有意義的方法。

有待改進的地方

我還有很多地方可以改進:

  • 我選擇了一門並不熟悉的語言開始,所以一開始會存在學習曲線。還好並不算太糟糕,因為 Python 非常容易掌握。所以我強烈建議任何一個軟體愛好者使用它作為第一門語言。
  • 過度依賴開源技術,開源軟體自己也存在的一系列問題。 我使用的多個庫不再處於積極的開發階段,因此我很早就遇到了問題,我無法匯入庫,或者庫因為一些看似無害的原因而失敗。
  • 獨自處理一個專案可能很有趣,但是同時帶來的壓力也不容小覷。你需要很大的動力才可以獲取這些東西。這個專案快速而簡單,但是我仍然花了幾個週末來改進。隨著專案的進行,我開始失去了動力,找到工作後,我完全放棄了這個專案。

我使用的資源和工具

The Hitchhiker’s Guide to Python —— 總的來說,這是一本學習 Python 的好書。我推薦 Python 作為初學者的第一門程式語言,在我的文章中,我討論瞭如何使用它獲取來自多家頂級公司的報價。

BeautifulSoup —— 用於構建我的網路爬蟲的實用性工具。

Web Scraping with Python —— 學習如何使用 Python 進行 web 抓取的實用性指南。

Lean Startup —— 從這本書中,我學到了快速原型和建立一個 MVP 來測試的想法。我認為這裡的想法適用於許多不同的領域,它也幫助我完成了這個專案。

Evernote —— 我使用 Evernote 來為這篇文章組織我的想法。強烈推薦它 —— 我使用它來做我做的每一件事

我的膝上型電腦 —— 這是我目前在家用的膝上型電腦,設定為一個工作站。與一臺舊的 BenQ 筆記本相比,使用它要容易的多,但兩者都適用於一般的程式設計工作。

Credits:

Brandon O’brien,我的良師益友,對於如何改進這篇文章進行校對,而且提供了有價值的反饋。

Leon Tager,我的同事和朋友,用我迫切需要的經濟智慧引領我,啟迪我。

你可以註冊 ndustry news 和 random tidbits,並在我登入的地方釋出新文章時,成為第一個知道的人。


Zhia Chong 是 Twitter 的軟體工程師。他在西雅圖的廣告測量團隊工作,評估廣告客戶的影響和投資回報率。該團隊是 hiring

**你可以在 **Twitter LinkedIn 上找到他。

感謝開源 portfolio

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章