R語言爬蟲初嘗試-基於RVEST包學習

R語言爬蟲初嘗試-基於RVEST包學習javascript

在學完coursera的getting and Cleaning data後,繼續學習用R弄爬蟲網絡爬蟲。主要用的仍是Hadley Wickham開發的rvest包。再次給這位矜矜業業開發各類好用的R包的大神奉上膝蓋html

查閱資料以下:java

rvest的githubnode

rvest自身的幫助文檔git

rvest CSS Selector 網頁數據抓取的最佳選擇-戴申: 裏面有說起如何快速得到html的位置。看完這篇,想一想我以前看代碼看半天分段真是逗比。。經測試,遨遊瀏覽器,右鍵,審查元素能夠獲得相似結果。戴申的blog裏面還有若干相關文章,國內RVEST資料基本就靠他的BLOG了,感激!github

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

之因此放拉勾網爲例子,由於這個你們都比較熟一點?其餘的都有點小衆=_=並且雖然我沒有跳槽的心,但年初倒是不少人跳槽的熱點。另外,由於以前聽人說過,要了解一個公司的動態,有一個辦法是去看這個公司放出來的招聘崗位,能夠知道他們最近哪一個業務線要擴張了,哪一個業務線要跑人了,以及瞭解技術需求。正則表達式

rvest基礎語法:數據庫

library(rvest)
lagou<-"http://www.lagou.com/jobs/list_數據分析?kd=數據分析&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc=&workAddress=&city=深圳&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.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)
}

而後是使用該函數,我這裏就爬兩頁

#使用該函數,
library(rvest)
url<-"http://www.lagou.com/jobs/list_數據分析?kd=數據分析&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc=&workAddress=&city=深圳&requestId=&pn="
final<-data.frame()
for (i in 3:5){
        final<-rbind(final,getdata(i,url))        
} #定義個數,把上面的getdata獲得的Data.frame合併
head(final)

上面完成了第一個列表。爬出效果如圖

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

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

值得一提的是,由於數據分析這個類目裏包含了不一樣的類別,如數據錄入的也被歸到數據分析,還有高薪也被歸到這裏,因此不能徹底按這個作參考。不過這個研究讓我深入體會到了爬蟲的有效性!好玩!實用!能夠用到工做中去:) 還能夠像個獵頭同樣瞭解人才市場~~作個有情調的數據分析師~~

另外,其實咱們還能夠遍歷JD,看近期是什麼技術最吃香,是R仍是Python仍是SQL仍是SAS仍是別的啥啥啥。下面是我隨機抽了個JD作的爬蟲。能夠直接拿到相關數據。

final[1,9]
## [1] http://www.lagou.com/jobs/378361.html
## 45 Levels: http://www.lagou.com/jobs/113293.html ...
url<-as.character(final[1,9])
w<-html(url,encoding = "UTF-8")
d<-w %>% html_nodes("dd.job_bt p") %>% html_text()
d
## [1] "1.金融、計算機、財務、經濟相關專業;"
## [2] "2.有證券從業資格證者優先;"          
## [3] "3.想從事文職類工做,對辦公軟件熟悉;"
## [4] "4.可接收已拿到學歷證的應屆畢業生。"  
## [5] ""

注意事項:

對於被編碼保護的數據(如國外yellow.local.ch,email被編碼保護了。須要用 decodeURIComponent函數反編譯。)

xpath語句對html_nodes適用。可是它好像是全局語句。。就是若是用div[1]//span[4]取數的話,它直接就只出全局的那個結果。。。

取數,能夠用li.da或者li.daew取數,二者等價

正則表達式頗有用!!尤爲是對網頁數據,某些不會寫,或者技術高超不肯意被咱們爬蟲的工程師,用rvest去抓數據,會抓到一堆堆亂碼= =這幾天練習下來感覺到了無盡惡意

中文,html(data,encoding='UTF-8')還有iconv(data,'utf-8','gbk')能夠有效避免大部分亂碼。可是R對中文支持真的很渣。數據分析培訓

rvest對於靜態抓取很方便!可是對於腳本訪問的網頁,還須要繼續學習RCurl包。備查資料以下:

javascript數據提取-RCurl包-戴申: 介紹對腳本解析後抓取數據經驗

RCurl提取統計之都論壇數據演示-medo

 等學會了再寫總結。

相關文章
相關標籤/搜索