
R語言爬蟲初嘗試-基于RVEST包學(xué)習(xí)
在學(xué)完coursera的getting and Cleaning data后,繼續(xù)學(xué)習(xí)用R弄爬蟲網(wǎng)絡(luò)爬蟲。主要用的還是Hadley Wickham開發(fā)的rvest包。再次給這位矜矜業(yè)業(yè)開發(fā)各種好用的R包的大神奉上膝蓋
查閱資料如下:
rvest的github
rvest自身的幫助文檔
rvest + CSS Selector 網(wǎng)頁數(shù)據(jù)抓取的最佳選擇-戴申: 里面有提及如何快速獲得html的位置??赐赀@篇,想想我之前看代碼看半天分段真是逗比。。經(jīng)測試,遨游瀏覽器,右鍵,審查元素可以得到類似結(jié)果。戴申的blog里面還有若干相關(guān)文章,國內(nèi)RVEST資料基本就靠他的BLOG了,感激!
言歸正傳,拿了幾個網(wǎng)頁練手。包括對拉勾網(wǎng)爬了一下蟲,還嘗試了對國外某黃頁爬蟲,對ebay用戶評價爬蟲分析其賣家賣的東西主要在哪個價格段(我查的那個賣家,賣8.99和39.99最多,鞋子類),做了一下文本挖掘,還有爬了一下股票數(shù)據(jù),基金買入情況等等。
之所以放拉勾網(wǎng)為例子,因為這個大家都比較熟一點?其他的都有點小眾=_=而且雖然我沒有跳槽的心,但年初卻是很多人跳槽的熱點。另外,因為之前聽人說過,要了解一個公司的動態(tài),有一個辦法是去看這個公司放出來的招聘崗位,可以知道他們最近哪個業(yè)務(wù)線要擴(kuò)張了,哪個業(yè)務(wù)線要跑人了,以及了解技術(shù)需求。
rvest基礎(chǔ)語法:
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") #讀取數(shù)據(jù),規(guī)定編碼
#之前我是用關(guān)鍵字搜索,閱讀html代碼,獲得html_nodes里需要什么屬性,不過許多瀏覽器有開發(fā)者工具,可以直接獲得層級信息。如遨游
position<-web %>% html_nodes("li div.hot_pos_l a") %>% html_text()
#上面就是直接讀取數(shù)據(jù),獲得位置信息
#不過在后面做其他網(wǎng)站時發(fā)現(xiàn),有時候信息儲存在同類數(shù)據(jù)里(如div沒有class等等),建議是找一個大的分類,先獲得表格信息,再做數(shù)據(jù)
list_lagou<-web %>% html_nodes("li.clearfix")
#這里正確找準(zhǔn)正確的劃分點很重要。有<li class="odd clearfix">,其實用li.clearfix一樣可以取(對于空格二選一,如"li.odd"或者"li.clearfix")
#接下來的company/position照選即可,因為事先已經(jīng)分好了list,所以每一個出多少心里有數(shù)。。
在講完原理之后,現(xiàn)在開始嘗試寫代碼
因為里面涉及太多的選取數(shù)據(jù)工作。為了避免出現(xiàn)太多變量,我最后是編了一個函數(shù),輸出數(shù)據(jù)庫
函數(shù)部分
#下面開始寫代碼,首先寫一個函數(shù)getdata,會輸出一個數(shù)據(jù)框
getdata<-function(page,urlwithoutpage){
url=paste0(urlwithoutpage,page) #這里輸入拉勾網(wǎng)沒有頁碼的url
web<-html(url,encoding="UTF-8") #讀取數(shù)據(jù),規(guī)定編碼,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"))
#接下來的由于數(shù)據(jù)都存在span里,沒有很好的劃分。這個取數(shù)要復(fù)雜一些。我在這里,研究他們的表,先取15個完整list,然后用seq等序列取數(shù)
#之后要研究是否有更好的方法
#如果有table,可以直接用data.table取數(shù)更快。。。
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("經(jīng)驗:","",temp[seq(3,90,by=6)]%>% html_text())
degree<-gsub("最低學(xué)歷:","",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)
}
然后是使用該函數(shù),我這里就爬兩頁
#使用該函數(shù),
library(rvest)
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:5){
final<-rbind(final,getdata(i,url))
} #定義個數(shù),把上面的getdata得到的Data.frame合并
head(final)
上面完成了第一個列表。爬出效果如圖
關(guān)于這個數(shù)據(jù)有什么用呢…… 簡單來說,我們可以用它來看這個網(wǎng)上有多少在招的,各公司招人的比例,以及薪資水平,做一點基礎(chǔ)的數(shù)據(jù)分析。
雖然我現(xiàn)在不跳槽,不過了解一下市場狀況也是不錯的~譬如見下圖,從目前這網(wǎng)上的平均薪資與工作年限的關(guān)系來看,數(shù)據(jù)分析崗至少在職位前五年屬于薪資增長期,初始漲得快,后面漲得慢,但平均應(yīng)有13%左右的增長?然后這網(wǎng)上目前沒有什么高級崗位開出來(工作5-10年的崗位很少),反而是有些公司搞錯分類,放了一堆數(shù)據(jù)錄入的到數(shù)據(jù)分析欄目。。。
值得一提的是,因為數(shù)據(jù)分析這個類目里包含了不同的類別,如數(shù)據(jù)錄入的也被歸到數(shù)據(jù)分析,還有高薪也被歸到這里,所以不能完全按這個做參考。不過這個研究讓我深刻體會到了爬蟲的有效性!好玩!實用!可以用到工作中去:) 還可以像個獵頭一樣了解人才市場~~做個有情調(diào)的數(shù)據(jù)分析師~~
另外,其實我們還可以遍歷JD,看近期是什么技術(shù)最吃香,是R還是Python還是SQL還是SAS還是別的啥啥啥。下面是我隨機(jī)抽了個JD做的爬蟲??梢灾苯幽玫较嚓P(guān)數(shù)據(jù)。
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.金融、計算機(jī)、財務(wù)、經(jīng)濟(jì)相關(guān)專業(yè);"
## [2] "2.有證券從業(yè)資格證者優(yōu)先;"
## [3] "3.想從事文職類工作,對辦公軟件熟悉;"
## [4] "4.可接收已拿到學(xué)歷證的應(yīng)屆畢業(yè)生。"
## [5] "<U+00A0>"
注意事項:
對于被編碼保護(hù)的數(shù)據(jù)(如國外yellow.local.ch,email被編碼保護(hù)了。需要用 decodeURIComponent函數(shù)反編譯。)
xpath語句對html_nodes適用。但是它好像是全局語句。。就是如果用div[1]//span[4]取數(shù)的話,它直接就只出全局的那個結(jié)果。。。
如
取數(shù),可以用li.da或者li.daew取數(shù),兩者等價
正則表達(dá)式很有用!!尤其是對網(wǎng)頁數(shù)據(jù),某些不會寫,或者技術(shù)高超不愿意被我們爬蟲的工程師,用rvest去抓數(shù)據(jù),會抓到一堆堆亂碼= =這幾天練習(xí)下來感受到了無盡惡意
中文,html(data,encoding='UTF-8')還有iconv(data,'utf-8','gbk')可以有效避免大部分亂碼。但是R對中文支持真的很渣。
rvest對于靜態(tài)抓取很方便!但是對于腳本訪問的網(wǎng)頁,還需要繼續(xù)學(xué)習(xí)RCurl包。備查資料如下:
javascript數(shù)據(jù)提取-RCurl包-戴申: 介紹對腳本解析后抓取數(shù)據(jù)經(jīng)驗
RCurl提取統(tǒng)計之都論壇數(shù)據(jù)演示-medo
等學(xué)會了再寫總結(jié)。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計學(xué)領(lǐng)域,假設(shè)檢驗是驗證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學(xué)計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學(xué)計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務(wù)價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導(dǎo)向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10CDA 數(shù)據(jù)分析師:商業(yè)數(shù)據(jù)分析實踐的落地者與價值創(chuàng)造者 商業(yè)數(shù)據(jù)分析的價值,最終要在 “實踐” 中體現(xiàn) —— 脫離業(yè)務(wù)場景的分 ...
2025-09-10