自學python的大四狗發現校招招python的屈指可數,全是C++、Java、PHP,但看了下社招崗位還是有的。於是為了更加確定有多少可能找到工作,就用python寫了個爬蟲爬取招聘資訊,資料處理,最後用R語言進行視覺化呈現。專案地址:Github Repo 求關注。
scrapy爬蟲
python語言簡單強大,雖然效率比不上C++這類程式語言,但因為沒有了繁瑣嚴格的語法,能讓程式設計師更加專注於業務邏輯,縮短開發週期。雖然用urllib、beautifulsoup之類的包也可以寫出爬蟲,但是使用scrapy框架能夠避免重複製造輪子,可以寫儘可能少的程式碼實現。以下就介紹爬蟲核心的程式碼:
Item
首先需要定義你要爬取的是什麼樣的資料,在scrapy自動生成的專案檔案裡的items.py中定義爬取的資料。我爬取了招聘的崗位名稱(title)、城市(company)、地址(location)和招聘資訊的url:
Spider
爬蟲自然是主體的邏輯部分,可以用scrapy的genspider子命令生成模板程式碼,還可以設定spider型別。此處用的最基礎的spider.Spider型別。爬取的列表頁是51job(51job好爬!)手動搜尋全國python招聘資訊得到的,通過觀察可以發現它翻頁是通過url裡的引數實現的,因此寫了個生成器生成每頁對應的request。parse方法則是其實request對應的response預設的處理方法,在此用css選擇器(這裡應該是用瀏覽器工具直接生成的,實際應該不需要這麼長)和正規表示式抽取出每一條招聘資訊的地址,呼叫Request方法獲得response再把response傳給parse_item方法(這個方法是自定義的,不是scrapy預設支援的方法)處理。在parse_item方法中的response才是真正的每條招聘資訊詳情頁。這裡主要使用xpath選擇器,因為不是前端不大熟悉css選擇器。xpath和css選擇器都可以在w3cschool找到教程,很短很快能看完。
Pipelines
Pipeline管道用於爬取到Item後的資料處理,雖然scrapy本身自帶一些儲存功能如CSV,但如果要自定義更復雜的處理儲存可以在pipeline裡實現,最主要是在process_item(self,item,spider)方法中實現。在這實現了兩個pipeline,第一個是dropPipeline,用於判斷爬取的Item招聘崗位標題中是否有python字串,如果沒有就丟擲DropItem異常丟棄Item。第二個pipeline實現了sqlite儲存。注意在setting裡設定好每個管道的順序,先通過丟棄的管道剩下的再經過儲存管道,否則丟棄就沒有意義了。
middleware
其實上面程式碼能實現爬取儲存了,不過我寫了個沒用上的middleware。middleware中介軟體就是用於處理request和response的,可以在request發出前對其進行處理,response收到後進行處理。寫了一個自動切換http代理的中介軟體,本來想得是http代理從西刺網站抓取(程式碼倉庫裡有,用的selenium爬的),但是測試了下其實西刺網站代理很多是不能用的,所以最後乾脆不用了~
資料處理
資料處理主要是用高德地圖的api獲取地理位置座標,但因為在資料視覺化階段使用的視覺化工具是不是國產的,而國內地圖的經緯度又經過了加偏處理,所以還需要進一步轉換成國際標準的經緯度,幸虧也有api可以用。在這一步還同時統計了每座城市的招聘數量,不過其實這個放最後用R語言統計好像更方便。具體程式碼就不貼了,太長,可以去github看。
R語言視覺化
這個是最後的重頭戲,其實R語言不是很精通,在coursera上上的約翰霍普金斯大學的資料科學系列課程,書上沒有的乾貨很多,比如shiny,比如R語言包怎麼寫,分析報告怎麼寫,甚至用R寫ppt怎麼寫,還有很多設計的專案可以實踐。。。但是要在統計分析方面深入的話還是看書比較好,課上的有點快,特別是統計學那部分一個個概念分分鐘扔給你,根本聽不懂。。。由於實在沒怎麼學過統計學,並且爬取的資訊也有限,所以這裡只進行了視覺化。
- ggplot可以是R語言視覺化最著名的包,下載量也是在所有R語言包中靠前的。而plotly是專門做資料視覺化的,支援python、R、Matlab等(還是在公開課乾貨中看到的)。plotly包只要一個函式(ggplotly)就可以把普通的ggplot轉換成可互動的圖,可以放大縮小拖拽,滑鼠經過時還會顯示具體的資料。圖中可見北上深廣python招聘還是挺多的,北上都有兩百多,而到深圳就只有90了,再後面就更少了。還是得去大城市機會比較多~
- plotly的scatergeo圖,圓圈大小代表資料大小,經過根號調整過大小,不然差距太大,小圓圈全都被覆蓋了。右側的四分位點選後是可以隱藏或者顯示特定顏色的圓圈的。還有滑鼠懸停在圓圈上同樣會顯示詳細資訊。遺憾的是plotly在亞洲部分的地圖還不能細分到省。
- leaflet地圖則是另一個R語言包,同樣是公開課看到的。地圖上會顯示每一個招聘資訊的位置,點選後有職位名稱和公司名稱,職位名稱還是個連結。leaflet地圖還是很讓人吃驚,竟然不用梯子而且放大後地點還挺多的。要找離你最近的python招聘用這個圖還是真的很不錯的!
分析報告地址
由於報告是2.5M的html檔案,所以載入會比較慢,而微信還給說是危險網站,無語。地址如下:七牛連結、rpub
rpub是一個專門用於釋出R語言分析報告的網站。