1. 程式人生 > >R語言爬取前程無憂網招聘職位

R語言爬取前程無憂網招聘職位

資料的獲取是資料探勘的第一步,如果沒有資料何談資料探勘?有時候在做演算法測試的時候,一個好的資料集也是演算法實驗成功的前提保障。當然我們可以去網上下載大型資料網站整理好的,專業的資料,但是自己動手爬取資料是不是更愜意呢?

說到這裡,給大家推薦一些常用的大型資料集:

(1)、MovieLens

MovieLens資料集中,使用者對自己看過的電影進行評分,分值為1~5。MovieLens包括兩個不同大小的庫,適用於不同規模的演算法.小規模的庫是943個獨立使用者對1682部電影作的10000次評分的資料;大規模的庫是6040個獨立使用者對3900部電影作的大約100萬次評分。

(2)、EachMovie

HP/Compaq的DEC研究中心曾經在網上架設EachMovie電影推薦系統對公眾開放.之後,這個推薦系統關閉了一段時間,其資料作為研究用途對外公佈,MovieLens的部分資料就是來自於這個資料集的.這個資料集有72916個使用者對l628部電影進行的2811983次評分。早期大量的協同過濾的研究工作都 是基於這個資料集的。2004年HP重新開放EachMovie,這個資料集就不提供公開下載了。

(3)、BookCrossing

這個資料集是網上的Book-Crossing圖書社群的278858個使用者對271379本書進行的評分,包括顯式和隱式的評分。這些使用者的年齡等人口統計學屬性(demographic feature)都以匿名的形式儲存並供分析。這個資料集是由Cai-Nicolas Ziegler使用爬蟲程式在2004年從Book-Crossing圖書社群上採集的。

(4)、Jester Joke

Jester Joke是一個網上推薦和分享笑話的網站。這個資料集有73496個使用者對100個笑話作的410萬次評分。評分範圍是-10~10的連續實數。這些資料是由加州大學伯克利分校的Ken Goldberg公佈的。

(5)、Netflix

這個資料集來自於電影租賃網址Netflix的資料庫。Netflix於2005年底公佈此資料集並設立百萬美元的獎金(netflix prize),徵集能夠使其推薦系統性能上升10%的推薦演算法和架構。這個資料集包含了480189個匿名使用者對大約17770部電影作的大約lO億次評分。

(6)、Usenet Newsgroups

這個資料集包括20個新聞組的使用者瀏覽資料。最新的應用是在KDD2007上的論文。新聞組的內容和討論的話題包括計算機技術、摩托車、籃球、政治等。使用者們對這些話題進行評價和反饋。

(7)、UCI知識庫

UCI知識庫是Blake等人在1998年開放的一個用於機器學習和評測的資料庫,其中儲存大量用於模型訓練的標註樣本。

其他資料集:

(8)、http://snap.stanford.edu/na09/resources.html

(9)、http://archive.ics.uci.edu/ml/

(10)、http://www.ituring.com.cn/article/details/1188

閒來無事,用R語言爬取了一下前程無憂網上的招聘職位資料,要找工作的司機們可以借鑑一下最近到底有哪些熱門職位呢?

這是我儲存的本地職位檔案:
http://mmbiz.qpic.cn/mmbiz_png/pKsJz0Y4P7rdcoMicAv2h1bZpwQJ7V0Hicic3aQWIXC3ItTHhIrKJE97ZON83SrGY8DxAAAST6giaYum2kygxN18Lg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1
好像還是不錯的哦!當然了,網路爬蟲要懂一些網頁的基本知識,一些簡單的網頁元素、標籤要懂,最好會做一些簡單的網頁。這裡用到的R包主要是”rvest”,沒有的話可以安裝一下,很簡單隻需要執行以下命令:

install.packages(“rvest”)

建立一個本地資料夾儲存抓取的資料:

filename<-"E:\\工作簿2.csv"    #如果不存在這個檔案,會自動建立新檔案
這是我抓取主頁面的網址,有點長,沒辦法:
url_<-"http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=010000%2C00&district=000000&funtype=0000&industrytype=32&issuedate=9&providesalary=99&keyword=測試工程師&keywordtype=2&curr_page=1&lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&list_type=0&fromType=14&dibiaoid=0&confirmdate=9"

開啟主頁面如下圖;
這裡寫圖片描述
可以看出一共有48個頁面,爬取玩當前頁面後需要跳轉到下一個網頁,然後繼續爬取,那麼怎麼獲取下一頁網址呢?像這種大型網站,再簡單也是有點小複雜的。思考了好久,我決定從下一頁下手,不管當前處於哪一頁(比如第二頁),點選下一頁直接跳轉(第三頁),這樣就避免了獲取下一頁網址的困難。

link<-web%>%html_nodes(‘div.p_in li.bk a’)%>%html_attr(“href”)
獲取下一頁網址

根據“div.p_in li.bk a”獲取連結link裡面會有兩個連結,也就是說length(link)=2。當然我也不知道什麼原因,畢竟這個大型網站還是比較複雜的,但是,我發現,當處於第一頁時,link[1]就是第二頁的網址,當不處於第一頁時link[2]即為下一頁網址,於是有:

 for(i in 1:48){

  if(i==1){

      web<-read_html(url_,encoding = "GBK")    #注意網頁編碼為'GBK',不是常用的'utf-8',可以右擊編碼(E)

      title<-html_text(html_nodes(web,'p.t1 a'))    #職位名根據網頁結構剖析,下同

      location<-html_text(html_nodes(web,'span.t3'))    #工作地域

      location<-location[2:length(location)]

      salary<-html_text(html_nodes(web,'span.t4'))

      salary<-salary[2:length(salary)]

      Time<-html_text(html_nodes(web,'span.t5'))

      Time<-Time[2:length(Time)]

 這裡發現除了title(職位名)外,其它長度多了一個【地域】、【薪水】、【時間】,取2~length()長度

     url_<-link[1]

     Data<-data.frame(title,location,salary,Time)    #拼接成資料框

 }

 else{    #不是第一頁時,前面解釋過



     web<-read_html(url_,encoding = "GBK")

             title<-html_text(html_nodes(web,'p.t1 a'))

             web<-read_html(url_,encoding = "GBK")

             title<-html_text(html_nodes(web,'p.t1 a'))

             location<-html_text(html_nodes(web,'span.t3'))

             location<-location[2:length(location)]

             salary<-html_text(html_nodes(web,'span.t4'))

             salary<-salary[2:length(salary)]

             Time<-html_text(html_nodes(web,'span.t5'))

             Time<-Time[2:length(Time)]

             link<-web%%html_nodes('div.p_in li.bk a')%%html_attr("href")
 # 從當前頁面獲取下一頁網址,審查元素【下一頁】那個按鈕

             url_<-link[2]    #前面解釋過

             Data<-rbind(Data,data.frame(title,location,salary,Time))    #每次迴圈都拼接資料框Data,直到把48個頁面所有資料拼接在一個數據框裡

         }

     }



 ################將資料框以csv格式寫入本地檔案##################

 write.csv(Data,file = filename,row.names = FALSE)

上面的Data<-rbind(Data,data.frame(title,location,salary,Time)) 是按行拼接,它還有個兄弟cbind()。分別是列數相同按行拼接,行數相同按列拼接。以上程式碼親測好用,直接拿來用的哦。