作者: Zhia Hwa Chong
編譯: Mika本文為 CDA 數據分析師原創作品,轉載需授權
前言
當時我剛從大學畢業,需要找一份工作。那時我不太喜歡社交,因此我決定以我所知道的最佳方法來找工作,即開發一個應用程式,這篇文章就介紹了我是如何做到的。
Craigslist
我打算通過開發應用程式,幫我在Craigslist在找尋軟體工程師的相關工作。
Craigslist是美國著名的大型免費分類廣告網站,你可以在上面找到東西出售,服務信息,社區帖子等內容。
Craigslist
那時我還從未開發過成熟的應用程式。我在大學裡做的學術項目主要是:構建和解析二叉樹,計算機圖形和簡單的語言處理模型等等。
換句話說,我是妥妥的小白。
Python是當下非常熱門的新興程式語言,我不太會Python,但我打算試著學一學。因此,我打算結合這兩者,用Python開發一個小型的應用程式。
我是怎麼做的
大學畢業後,我哥哥送了我一臺明基筆記本電腦,我就用這臺電腦進行開發。
這臺電腦並不具備最好的開發環境,我用的是Python 2.4和Sublime的舊版本,但從零開始開發應用的過程確實令人振奮。
我不知道我需要做些什麼,我在不斷地嘗試,看會遇到哪些問題。我的第一個挑戰就是如何輕鬆訪問Craigslist的數據。
首先,我查看Craigslist是否有公開的REST API,但令我沮喪的是,並沒有。但我找到了不錯的替代品。
Craigslist有公開供個人使用的RSS feed。RSS feed是網站發送更新的計算機可讀摘要。RSS feed能讓我獲取發布的工作列表,這非常適合我的需求。
RSS feed大概是這樣
接下來,我需要閱讀這些RSS feed。我不想手動瀏覽RSS feed,這很耗時,與一頁頁瀏覽Craigslist沒有什麼不同。
這時我開始意識到谷歌的作用。有一個說法是,軟體工程師的大部分時間都用在谷歌搜索上,我認為這是有一定道理的。
經過谷歌搜索後,我在StackOverflow上找到了這篇有用的帖子,上面描述了如何搜索Craiglist 的RSS feed,這是Craigslist免費提供的一種過濾功能。我所要做的就是通過特定的參數對感興趣的關鍵字進行查詢。
我主要在找西雅圖的軟體相關工作。因此,我通過特定的URL來查找西雅圖包含關鍵字"software"的列表。
看,效果很不錯。
西雅圖的RSS feed中標題中包含"software"的內容
遇到的問題
我不認為我的方法能行得通。
首先,列表的數量有限。我的數據未包含西雅圖的所有發布的職位,返回的結果僅是一部分。我希望儘可能擴大搜索,因此我需要獲得所有可用的工作列表。
其次,我意識到RSS feed 不包含任何聯繫方式,這太可惜了。我能找到職位發布信息,但除非我手動過濾這些列表,否則我無法聯繫到這些職位。
Craigslist回復連結的截圖
繼續迭代
經過第一次失敗的嘗試,我發現Craigslist有我可以進行爬取的RSS feed,每個帖子都指向實際發布的連結。
如果我可以訪問實際的帖子,那麼也許我能從中爬到郵箱地址?這意味著我需要找到一種方法來從原始帖子中獲取郵件地址。
再次,我在谷歌上搜索"解析網站的方法"。結果我發現了一個很酷的Python小工具,叫做Beautiful Soup。它能讓你解析整個DOM樹,並幫助你了解網頁的結構。
我的需求很簡單:需要一個易於使用的工具,能讓我從網頁收集數據。
BeautifulSoup符合這兩點,這是我並不是花更多時間去挑選工具,而是選擇了這個工具繼續開始嘗試。
這裡也有類似的工具可供選擇。
BeautifulSoup的主頁
有了這個新工具,我的工作流程就搞定了。
我的工作流程
我準備進行下一個任務:從實際發布貼中爬取郵箱地址。
開源技術的好處在於,它們是免費的,而且性能強大。BeautifulSoup能讓你在網頁上搜索特定的HTML標記。Craigslist以這樣的方式構建其列表,以便輕鬆找到郵箱地址。
之後就簡單了,通過BeautifulSoup提供的內置功能,我就能簡單地從Craigslist帖子獲取郵箱地址。
整合起來
用了約1個小時,我就達到了預期目標。我開發了網絡爬蟲工具,這能夠收集西雅圖100英裡範圍內軟體工程師相關工作的郵箱地址,並回覆郵件。
代碼截圖
我在原始腳本之上添加了些附加組件,讓爬取更為輕鬆。例如,我將結果保存到CSV和HTML頁面中,以便我能快速進行解析。
當然還有一些不足:
無法記錄已發送的郵件無法防止重複發送郵件有些郵件為了防止機器人發送,需要驗證碼才能顯示Craigslist不允許在其平臺上進行爬蟲,如果我經常運行腳本則會被禁止。(我試圖切換VPN,但不管用)仍然無法檢索Craigslist上的所有帖子
最後這點讓人鬱悶,但我認為如果一篇招聘貼發布了一段時間,可能發布者已經沒有再招人了,這樣也是可以接受的。
整個過程感覺像是俄羅斯方塊。我知道最終目標是什麼,真正的挑戰是將正確的部分組合在一起,從而實現最終目標。每一步都有不同的挑戰,整個過程中我學到了很多新知識。
經驗教訓
這次經歷讓我大開眼界,我學到了更多網際網路和Craigslist的工作原理,以及該如何運用各種不同的工具協同解決問題。
可改進的方面
當中有很多方面我能夠進行改進:
我選擇了一種不太熟悉的語言,這需要一個學習過程。不過還挺順利,因為Python非常容易上手。我強烈建議編程初學者將Python作為第一選擇。過分依賴開源技術,開源軟體也存在問題。我使用的一些庫已不再處於活躍開發階段,因此會遇到一些問題。例如無法導入庫,庫會莫名其妙地崩潰等。自己完成一個項目很有趣,但也有壓力,你需要很大的動力才能做出成果。我的這個項目很快很簡單,但我也花了幾周進行改進。隨著項目的進行,我逐漸失去動力,找到工作後,我完全放棄了這個項目。
使用的資源和工具
The Hitchhiker’s Guide to Python一本很棒的學習Python的書。
BeautifulSoup我用來開發網絡爬蟲實用工具
Web Scraping with Python如何使用Python進行Web抓取的使用指南。
Lean Startup我從這本書中學習了如何快速進行原型設計。這裡的很多想法適用於許多不同領域,也有助於我完成項目。
Evernote我用Evernote寫了這篇文章,強烈推薦。
MacBook Pro這是我目前使用的筆記本電腦,與之前的明基相比,它更容易使用,但兩者都適用於一般的編程工作。