R爬蟲小白例項教程
一入爬蟲深似海,從此複製是路人。
都說在這一行混,多多少少都要會點爬蟲,畢竟自己動手豐衣足食,本文記錄小鑫第一次練習爬蟲的過程。僅供參考,歡迎各路朋友指點。(E-mail:[email protected])
文末有原始碼及資料。
準備 | 必要的工具
chrome瀏覽器+SelectorGadget外掛。
用來獲得網頁中某些部分的相關標籤,若不懂HTML和CSS,強烈安利這個外掛。懂HTML和CSS的話,略過,用不著我來教了。
安裝外掛之後,在網頁的右上角就會出現圖示,在使用的時候單機一下就可以。
點選之後,滑鼠移動到網頁上就會出現一系列的變化,再單機想要知道標籤的地方,比如標題部分:
可以看到,雖然選中了標題,但同時公司名稱和薪資也同樣被選中了,想要取消選中公司名稱很簡單,單機一下公司名稱所在的位置就可以了,如下圖
至於不選中薪資,在這裡沒法做到,不過沒關係,在後面可以進行清理。
當然,也可以通過右鍵檢視網頁原始碼或者右鍵審查,可以檢視標籤,這種方式顯然需要一點HTML基礎。
至於R的操作環境,推薦使用RStudio,沒有原因,它就是非常好……
開始 | 準備爬取
網上有看到爬知乎、爬微博、爬智聯招聘、爬拉勾網,各種網站的爬取方式略微不同,小鑫在找了幾個招聘的網站之後,發現BOSS直聘的網址比較簡單,頁面原始碼也不復雜,因此,就從這裡開始。
先載入需要的包:
library(xml2)
library(rvest)
首先,分析網址
其中個地方引起了我注意:page=2
和ka=page-2
,小鑫試了一下,只要改變這個數字,就能控制翻頁,這個網站最多隻能顯示30頁,每頁15個。所以,不同頁,除了數字不同之外,其他部分都是一模一樣的,那就好辦了,給出一個變數page,然後用for迴圈:
site1 <- "https://www.zhipin.com/c101280600/h_101280600/?query=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&page=" site2 <- "&ka=page-" page <- 1 for(page in 1:30){ site <- paste(site1,page,site2,page,sep="") webpage <- read_html(site) 循… 環… 內… 容… … }
site1和site2控制著整個網址的固定部分,page控制網址的變動部分,從1迴圈到30。
迴圈中的第一個語句,用paste將site1、site2、page連線成一個完整的網址。
第二句:將網頁資訊儲存到webpage這個變數裡,以後的所有抓取動作,都是從這個變數裡來的。
然後,確定抓取內容
這一步主要是回到網頁中來:
可以發現,在每條招聘資訊裡,可以爬取這些內容:標題、薪資、公司名、地點、經驗要求、學歷要求、行業、融資/上市情況、公司規模、關鍵詞、聯絡人及其崗位。
不同的內容在不同的標籤裡面,這裡僅僅拿部分內容舉例說明,其他資訊的爬取都是大同小異的,詳見附件原始碼或聯絡小鑫(E-mail:[email protected])
值得一提的是,不同招聘資訊的關鍵詞數量不同,所以,我就單獨把關鍵詞作為另一項內容儲存了起來,用於後面做詞雲。
OK | 開始爬取
先爬取標題和公司名稱,用谷歌瀏覽器和外掛,可得知標題和公司名稱所在的標籤分別是:.info-primary .name
和.company-text .name
,使用如下語句:
name1 <- html_nodes(webpage,'.info-primary .name')# 抓取標題
name2 <- html_nodes(webpage,'.company-text .name')# 抓取公司名稱
檢視name1和name2。
可以看出,已經爬取了正確的資訊,只是需要刪除那些標籤和不需要的內容,接下來的思路就很簡單了,使用gsub
函式,將不必要的內容替換成空。
比如:< h3 class=”name”>、< span class=”red”>、< /span>\n這些標籤。
name1 <- gsub("<h3 class=\"name\">","",name1)
name1 <- gsub(" <span class=\"red\">.*","",name1)
name1 <- gsub("</span>\n</h3>","",name1)
name1 <- gsub("</h3>","",name1)
titlename <- as.data.frame(name1)
name2 <- gsub("<h3 class=\"name\">","",name2)
name2 <- gsub("</h3>","",name2)
companyname <- as.data.frame(name2)
這個時候,再看一下資料內容:
儲存資料:
bossdata <- data.frame(companyname,titlename)
bossdata
可以看出,能完成到這一步,基本上算是完成了90%,後面的思路都是大同小異的,注意變換一下形式就OK了,但是還是有一個小問題,就是剩下的10%。
繼續 | 最後一小步
然後就是抓取薪資,這一步也很簡單,直接上程式碼:
# 抓取薪資
salary <- html_nodes(webpage,'.red')
salary <- gsub("<span class=\"red\">","",salary)
salary <- gsub("</span>","",salary)
bossdata <- cbind(bossdata,salary)
bossdata
問題出在了這一步:
# 抓取要求及公司資訊
message <- html_nodes(webpage,'p')
message <- message[-1]
message <- gsub("<p>","",message)
message <- gsub("<em class=\"vline\"></em>",",",message)
message <- gsub("</p>","",message)
message <- gsub("<img",",",message)
message
可以看得出來,問題就在於“地點、工作經驗、學歷”在同一個位置,“行業、融資/上市情況、公司規模”也在同一個位置,這樣的情況下,就不能按照上面的方法來操作了,其實也不難,只要設定一個迴圈,重點就解決了。
# 先設定三個變數,分別讀取message中的不同資料
xx <- c(1:as.numeric(length(message)/3))
yy <- c(1:as.numeric(length(message)/3))
zz <- c(1:as.numeric(length(message)/3))
# xx用來存放message中的地點、經驗、學歷要求
k1 <- 1
l1 <- 1
for(k1 in seq(1:(length(message)/3))){
xx[k1] <- message[l1]
l1 <- k1*3+1
}
xx
# 可以看出xx雖然提取正確了,但是還需要進一步處理
xx <- as.data.frame(xx)
xx <- apply(as.data.frame(xx),1,strsplit,",")
xx <- as.data.frame(xx)
xx[1,]
# 分別提取xx中的地點,經驗,學歷
place <- t(as.data.frame(xx[1,]))
experience <- t(as.data.frame(xx[2,]))
education <- t(as.data.frame(xx[3,]))
# 合併資料框
bdata <- data.frame(place,experience,education)
names(bdata) = c("place", "experience", "education")
bossdata <- data.frame(bossdata, bdata)
bossdata
後面需要提取行業、融資/上市情況、公司規模等資訊,都是採用相同的方法,具體內容,可以檢視附件程式碼。至此,最簡單的一個爬蟲就寫好了。
一般來說,行業、融資/上市情況、公司規模這三個是在一起的,但是有兩條資訊,只有兩個內容,如下圖:
我的解決方法是:找到相應的位置,然後在那個地方填補一個缺失值NA,比如,在小鑫執行程式的時候,他們處在第一頁的第十一和第十五條資料,因此,小鑫使用如下程式碼:
if(page == 1){
financing11 <- financing[11,]
financing15 <- financing[15,]
financing[11,] <- NA
financing[15,] <- NA
companysize[11,] <- financing11
companysize[15,] <- financing15
}
else {
print("Hello World")
}
但是這種方法有很大的弊端,小鑫在寫這篇文章的時候,這兩條資訊又跑到了第二頁第五條和第十三條。因此,第一行的程式碼就變成了page == 2
,第二三行分別是:financing5 <- financing[5,]
financing13 <- financing[13,]
小鑫在想是不是可以讓R自動識別他們的位置,然後填充NA,甚至於在以後出現第三條、第四條類似資訊的時候,也能識別出空缺的位置,然後進行自動填補呢?
應該是可以的,不過小鑫現在才疏學淺,還沒那個技術。待小鑫技術學成,再奉上文章。
——2017年5月19日【END】
原始碼及爬取後資料
密碼:0cjv
相關推薦
R爬蟲小白例項教程
一入爬蟲深似海,從此複製是路人。 都說在這一行混,多多少少都要會點爬蟲,畢竟自己動手豐衣足食,本文記錄小鑫第一次練習爬蟲的過程。僅供參考,歡迎各路朋友指點。(E-mail:[email protected]) 文末有原始碼及
小白Sass教程---通過例項學Sass--第五講--scss檔案匯入及Sass樣式優先順序測試
一、sass提供匯入機制,可以將頁面的共用較為通用的scss提取出來,這樣方便維護,其他頁面按需匯入相關的scss檔案,避免了所有的樣式都在一個樣式檔案中,一個樣式檔案較為繁重難以維護。 @import "../sass/lesson4"; 這樣就匯入了lesson4這
小白Sass教程---通過例項學Sass--第四講--屬性巢狀
CSS規則在sass中可以進行巢狀,css屬性也可以進行巢狀,屬性巢狀的規則是: 有中橫線的屬性可以拆解巢狀,以中橫線為界限進行拆解,依次巢狀 廢話不多說,直接上程式碼: .lesson3-demo2{ .box{ height: 100px; wid
小白Sass教程---通過例項學Sass--第三講--後代選擇器巢狀
我們在css中定義子樣式時,要從父節點一層一層的向內尋找,程式碼會很長,而且會有重複的程式碼。 比如: .lesson2 div table{ border: 1px solid #ccc; } .l
小白Sass教程---通過例項學Sass--第二講--變數
1、變數宣告: $宣告一個sass變數 $highlight-color: #F90; 2、變數使用 span{  
小白Sass教程---通過例項學Sass--第一講--例項環境搭建
我們不考慮Sass是怎麼被編譯成css的,也不考慮Sass怎麼安裝,我們通過構建工具或者腳手架快速搭建一個可編譯Sass的平臺。通過例項來學習Sass的用法。 環境:Windows7 工具:WebStorm、Node、Vue-cli、Webpack 不需要任何webpack、Nod
Vue2.0--14.小白入門教程--例項化多個vue物件,可初始化操作幾種方法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>VueJS Tutorials</title> <link href="styles.c
Python爬蟲小白---(二)爬蟲基礎--Selenium PhantomJS
decode bject windows beautiful 結構 由於 target header 速度 一、前言 前段時間嘗試爬取了網易雲音樂的歌曲,這次打算爬取QQ音樂的歌曲信息。網易雲音樂歌曲列表是通過iframe展示的,可以借助Selenium獲
H5牌九源碼架設小白入門教程
所有 資料 phy 打包 ron 包括 焦點 調試 egret H5牌九源碼架設小白入門教程http://diguaym.com/h5 有問題Q2152876294,官網下載【diguaym.com】很多剛剛接觸到遊戲開發,準備大展拳腳的小鮮肉們,往往在技術選型這第一關就栽
Windows 10下怎麽遠程連接 Ubuntu 16.0.4(小白級教程)
搜索欄 server 否則 img 圖形界面 encrypt install 打開 ubun 前言: 公司因為用Ruby做開發,所有適用了Ubuntu系統,但是自己筆記本是W10,又不想裝雙系統,搭建開發環境,便想到倒不如自己遠程操控公司電腦,這樣在家的時候也可以
小宋深度學習之旅(小白入門教程)0
這是針對和我一樣非計算機專業小白開發人員,基於TensorFlow框架,Python語言,主要使用Windows平臺開發的深度學習,小白入門教程。 先put出一個示例程式碼 Hello World 程式碼: # encode : utf-8 import tens
2018最新Python小白入門教程,30天學會Python
隨著Python的技術的流行,Python在為人們帶來工作與生活上帶來了很多的便捷,因為Python簡單,學起來快,也是不少新手程式設計師入門的首選語言。作為一名Python愛好者,我也想跟大家分享分享我自學Python的一些小經驗。 Python是面向物件,高階語言,解釋,動態和多用途程式語言。Pytho
Linux真小白入門教程第二集——LINUX發行版本
Linux完整的系統包被稱為發行版 不同的Linux發行版會滿足不同的具體需求,大多數的發行版都是為某個特定使用者群定製的。 完整的核心Linux發行版:含核心、一個或者多個圖形化桌面以及預編譯好的幾乎所有能見到的Linux應用,比如:Debian(商用產品發行版)和RedHat
Linux真小白入門教程第一集——什麼是LINUX?
Linux是一款作業系統: 包含以下四個模組: 模組一: Linux核心:是Linux系統的核心,控制著計算機系統上的所有硬體和軟體,負責硬體的分配和軟體的執行 又分為四個細分功能: 系統記憶體管理: 核心不僅可以管理伺服器上的實體記憶體,還可以建
微信小程式例項教程
微信小程式例項教程(一)原文:https://www.cnblogs.com/niejunchan/p/5918855.html 拼序網(小程式製作服務商)
Linux真小白入門教程第十集——環境變數
對於Linux來說,很多程式和指令碼都要通過環境變數來獲取系統的資訊、儲存臨時資料和配置資訊。 bash shell有一個叫做環境變數的特性來儲存有關shell會話和工作環境的資訊,它允許你在記憶體中儲存資料,以便shell指令碼能夠訪問到他們,這也是持久儲存資料的簡便方法。 bash
Linux真小白入門教程第十集——詳探shell
shell不單單是一個CLI,它是一個時刻執行著的複雜互動式 程式。它本身就是一個程序,那麼學習shell程序就顯得尤為必要。 系統啟動的shell程式型別取決於你的個人使用者ID配置,不過一般預設的都是bash shell 預設的互動式shell會在使用者登入某個虛擬控制檯終端或在GU
Linux真小白入門教程第九集——Bash Shell命令學習(6)
Linux還提供了一些命令列工具來處理大型的資料 sort命令可以對資料進行排序(預設按照回話指定的預設語言的排序規則對文字檔案中的資料行進行排序)(預設是升序) 且預設情況下,sort命令會把數字當做字元執行標準的字元排序,所以對數字進行排序時,需要使用-n引數 -M引
Linux真小白入門教程第八集——Bash Shell命令學習(5)
不管是執行簡單的Linux桌上型電腦或者是大型的Linux伺服器,都需要進行系統磁碟的檢測,以下幾個命令可以幫助你管理儲存媒體 Linux檔案系統將所有的磁碟都併入一個虛擬目錄下,在使用新的儲存媒體之前,需要把它放到虛擬目錄下,這項工作被稱為掛載(插U盤),現如今的大部分Linux發行版都支
Linux真小白入門教程第七集——Bash Shell命令學習(4)
之前講了Linux對檔案和目錄的管理和相關操作,下面主要講一些Linux系統管理的一些命令,來探查Linux系統的內部資訊。 Linux系統管理員面臨的最複雜的任務之一就是跟蹤執行在系統中的程式。圖形化介面總是顯示不出所有正在執行的程式,好在還有一些命令可以進行管理。