iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
0
Data Technology

職場老鳥的資料科學初體驗-R語言專案實作紀錄系列 第 9

(Day9)爬蟲作業二:爬出第一層所需的所有議題

  • 分享至 

  • xImage
  •  

接續前一篇,接下來就是拿著前一篇的總頁數,繼續往下處理每個頁面的議題列表.

以迴圈的方式,逐一爬完所有的頁數.

迴圈開始

#根據頁數執行迴圈
for (i in 1:totalpage){

url的頁碼,隨著迴圈數進行翻頁
比照前篇,準備所需資料的xpath,開始爬找.

  #準備處理列表頁網址
  url <- paste0(base.url,i)
  doc <- read_html(url)
  doc1<-xml_find_all(doc, "//*[@id='searchResult']/div/div/h4/a")
  doc2<-xml_find_all(doc, "//*[@id='searchResult']/div/div/div/ul[2]/li")

比照所需要搜集的資料記錄,對應到xpath,一樣帶入程式中,取出資料.
這裡要注意的是date時間的xpath跟另兩組不同,記得要分開處理.
各自取出後,按data.frame物件收留.

簡單的判定,確認dfl這個物件在第一次被執行時,進行初始指定.
之後的每次,因資料欄位數相同,用函數rbind(),套句大家比較熟的說法,“插入一列”.
頁碼也一併置入.

  #[解析]根據規則得出所需的資料
  title<-xml_attr(doc1,"title")
  href<-paste0(web.url,xml_attr(doc1, "href")) #Get tag href
  date<-xml_text(doc2,"date") 
  if (i==1){
    dfl<-data.frame(title,href,page=i,date)
    }else{
    dfl <- rbind(dfl, data.frame(title,href,page=i,date))
    }

重要步驟:每次用runif()函數,發出1個2到8之間的亂數,當作系統暫停Sys.sleep()的秒數.(S大寫)
下方的右大括號,表示迴圈結束

Sys.sleep(runif(1,2,8))
}

迴圈結束後,代表所有的資料應該都已處理完畢.
此時,因需要一序號,當作一Key值.
這部分就引用函數rep(),跑一序列欄位出來.
再用所謂“插入一欄”cbind()函數處理.

#加入序號併入dfl
id=rep(1:nrow(dfl))
dfl=cbind(id,dfl)
#檢查一下資料
View(dfl)

檢視結果如下:共計搜集了500多筆議題紀錄.
https://ithelp.ithome.com.tw/upload/images/20171212/20107033YJbJ2hruaH.png

最後,可選擇將本次結果,輸出成為csv,作為資料來源或是傳遞資料之用.
存檔路徑,結合了上一篇工作檔路徑,並自行進行命名.

# write your table to file
write.csv(dfl,file=paste0(wdpath,"/dscsv/pagelist.csv"),row.names=FALSE)

以上就幾段程式碼,對R語言進行爬蟲的演示.


上一篇
(Day8) 爬蟲作業一:準備工作與爬出頁碼
下一篇
(Day10) 爬蟲作業終:爬完所有所需資料!
系列文
職場老鳥的資料科學初體驗-R語言專案實作紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
yujoe
iT邦新手 5 級 ‧ 2019-09-07 23:46:59

Kimi 您好:
觀看您的爬蟲程式文章多日,您寫得很詳細,
但執行 dfl<-data.frame(title,href,page=i,date)
遇到下列錯誤
Error in data.frame(title, href, page = i, date) :
arguments imply differing number of rows: 0, 1, 20

gooole諸多文章未能解決,尚請不吝指導
Joe 筆

我要留言

立即登入留言