R爬蟲實戰1(學習)—基於RVEST包


這里用Hadley Wickham開發的rvest包。再次給這位矜矜業業開發各種好用的R包的大神奉上膝蓋。

查閱資料如下:

  1. rvest的github
  2. rvest自身的幫助文檔
  3. rvest + CSS Selector 網頁數據抓取的最佳選擇-戴申 : 里面有提及如何快速獲得html的位置。看完這篇,想想我之前看代碼看半天分段真是逗比。。經測試,遨游瀏覽器,右鍵,審查元素可以得到類似結果。 戴申的blog 里面還有若干相關文章,國內RVEST資料基本就靠他的BLOG了,感激!

言歸正傳,拿了幾個網頁練手。包括 對拉勾網爬了一下蟲,還嘗試了對國外某黃頁爬蟲,對ebay用戶評價爬蟲分析其賣家賣的東西主要在哪個價格段(我查的那個賣家,賣8.99和39.99最多,鞋子類),做了一下文本挖掘,還有爬了一下股票數據,基金買入情況等等。

之所以放拉勾網為例子,因為這個大家都比較熟一點?其他的都有點小眾=_=而且雖然我沒有跳槽的心,但年初卻是很多人跳槽的熱點。另外, 因為之前聽人說過,要了解一個公司的動態,有一個辦法是去看這個公司放出來的招聘崗位,可以知道他們最近哪個業務線要擴張了,哪個業務線要跑人了,以及了解技術需求。

rvest基礎語法:

library(rvest)
lagou<-"http://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?kd=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc
=&workAddress=&city=%E6%B7%B1%E5%9C%B3&requestId=&pn=3"
web<-html(lagou,encoding="UTF-8") #讀取數據,規定編碼
#之前我是用關鍵字搜索,閱讀html代碼,獲得html_nodes里需要什么屬性,不過許多瀏覽器有開發者工具,可以直接獲得層級信息。如遨游
position<-web %>% html_nodes("li div.hot_pos_l a") %>% html_text()
#上面就是直接讀取數據,獲得位置信息
#不過在后面做其他網站時發現,有時候信息儲存在同類數據里(如div沒有class等等),建議是找一個大的分類,先獲得表格信息,再做數據
list_lagou<-web %>% html_nodes("li.clearfix")
#這里正確找准正確的划分點很重要。有<li class="odd clearfix">,其實用li.clearfix一樣可以取(對於空格二選一,如"li.odd"或者"li.clearfix")
#接下來的company/position照選即可,因為事先已經分好了list,所以每一個出多少心里有數。。

在講完原理之后,現在開始嘗試寫代碼

因為里面涉及太多的選取數據工作。為了避免出現太多變量,我最后是編了一個函數,輸出數據庫。

函數部分

#下面開始寫代碼,首先寫一個函數getdata,會輸出一個數據框
getdata<-function(page,urlwithoutpage){
  url=paste0(urlwithoutpage,page) #這里輸入拉勾網沒有頁碼的url
  web<-html(url,encoding="UTF-8") #讀取數據,規定編碼,access用
  list_lagou<-web %>% html_nodes("li.clearfix") #獲得一個清單,15個職位
  title<-list_lagou %>% html_nodes("div.hot_pos_l div.mb10 a")%>%html_text()
  company<-list_lagou %>% html_nodes("div.hot_pos_r div.mb10 a")%>%html_text()
  link<-gsub("\\?source\\=search","",list_lagou %>% html_nodes("div.hot_pos_l div.mb10 a")%>%html_attr("href"))
#接下來的由於數據都存在span里,沒有很好的划分。這個取數要復雜一些。我在這里,研究他們的表,先取15個完整list,然后用seq等序列取數
#之后要研究是否有更好的方法
#如果有table,可以直接用data.table取數更快。。。
  temp<-list_lagou %>% html_nodes("div.hot_pos_l span")
  city<-temp[seq(1,90,by=6)] %>% html_text()
  salary<-gsub("月薪:","",temp[seq(2,90,by=6)]%>% html_text())
  year<-gsub("經驗:","",temp[seq(3,90,by=6)]%>% html_text())
  degree<-gsub("最低學歷:","",temp[seq(4,90,by=6)]%>%html_text())
  benefit<-gsub("職位誘惑:","",temp[seq(5,90,by=6)]%>% html_text())
  time<-temp[seq(6,90,by=6)]%>%html_text()
  data.frame(title,company,city,salary,year,degree,benefit,time,link)
}

獲取函數,這里先爬一頁!

> url<-"http://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?kd=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc=&workAddress=&city=%E6%B7%B1%E5%9C%B3&requestId=&pn="
> final<-data.frame()
> for (i in 3){
+     final<-rbind(final,getdata(i,url))        
+ } #定義個數,把上面的getdata得到的Data.frame合並

查看爬取結果

image

分析數據

關於這個數據有什么用呢…… 簡單來說,我們可以用它來看這個網上有多少在招的,各公司招人的比例,以及薪資水平,做一點基礎的數據分析。

雖然我現在不跳槽,不過了解一下市場狀況也是不錯的~譬如見下圖,從目前這網上的平均薪資與工作年限的關系來看,數據分析崗至少在職位前五年屬於薪資增長期,初始漲得快,后面漲得慢,但平均應有13%左右的增長?然后這網上目前沒有什么高級崗位開出來(工作5-10年的崗位很少),反而是有些公司搞錯分類,放了一堆數據錄入的到數據分析欄目。

(等待……代碼還需要完善,要設置間隔時間,要不然會被當掉!!!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM