簡單好用的 web scraping R 套件 – rvest

近年來很流行網路爬蟲技術,可以自行捉取自己想要的資訊; 只要不是太複雜的網站,使用 R 底下的套件 httr 就可以捉取了;不過由於 httr 並沒有直接支援 CSS 與 xpath 選取,所以還要額外安裝其他的套件來輔助解析網頁資訊。

最近發現到 rvest 這個套件,直接支援 ccs 與 xptah 選取,安裝 rvest 後,在啟用 rvest 時也會順道加入支援 pipeline 編寫,可以有效避免恐怖的巢狀地獄…

rvest 使用如同一般網路爬蟲技術,流程如下所示:

  • 要捉的網頁真實的網址是什麼 --url = ???
  • 把網頁捉下來 --html( )
  • 解析(parse)網頁,選取所需內容(使用 CSS 或 XPATH ) --html_nodes()
  • 過濾掉其他雜質 -- 此例中我們只留下純文字就好 不留下超連結 html_text()

因為蘋果日報最近的全幅廣告真的很討人厭 > <" ,以下就以自由時報的即時總覽的第一頁進行說明 網址如下: http://news.ltn.com.tw/list/BreakingNews

首先我們可以使用 chrome 中的開發者工具 或是 Firefox 中的 Firebug 來協助我們進行選取,可以發現用以下的語法就能正確捉取我們所要的資料…

  • css 選取語法 .picword
  • xpath 選取語法 //*[@id='newslistul']/li/a

接著就幾乎等於完成了,沒錯這就是最簡單的一隻網路爬蟲 🙂

此處以 css選取(html_nodes函數)舉例,並將資料存成 dataframe 格式,以利串接至資料庫中:

然後你就會有2個重大的發現:

(1)網路爬蟲的入門也蠻簡單的啊~~

(2)即時新聞大部份都不是很重要~~ XD

BLOG1

 

備註1:使用 xpath 選取

將html_nodes(".picword")以html_nodes( xpath = "//*[@id='newslistul']/li/a")取代即可

備註2: 想要取捉每篇即時新聞的網址,以利後續捉取內文的話呢??

備註3: 套件作者 Github https://github.com/hadley/rvest

Share the joy
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

近期文章

近期迴響

彙整

分類

其它

chia-hung Written by:

4 Comments

  1. Jaxon
    九月 29, 2015
    Reply

    想請問,我按照範例代碼去抓,但抓回來都變成亂碼,請問該怎麼辦?
    p.s.現在html改成read_html了

    • 九月 29, 2015
      Reply

      在WINDOWS 底下會有亂碼,rvest套件 WINDOS 目前最新版是 0.3 MAC 版是0.2
      WINDOWS 系統請將程式碼,如下調整:

      library(rvest)
      library(tmcn)
      # WINDOWS 系列需使用此一套件,mac與 linux無此需求 
      # 若無安裝請自行安裝
      # install.packages("tmcn", repos="http://R-Forge.R-project.org")

      news_url="http://news.ltn.com.tw/list/BreakingNews"

      title_css = html(news_url) %>% html_nodes(".picword") %>% html_text()

      utf8_text_title <- toUTF8(title_css ) ## 將捉下來的標題轉成 UTF8

      my_news = data.frame(title = utf8_text_title )

      View(my_news)

      效果節錄:

      未使用tmcn套件前:
      [1] "\xe7摰單\x87\xae葉敹圾\xe9\xe6\x89偷\xe5 \xe5\xe9\xe5\xe5璈\xe6頧\x9f"
      [2] "鈭箸腦\xe6\x96嚗\xb6晷\xe3\u0080擛亦\xb5\u0080\x8d 瞈\u0080瘣芷\xe7\x87\xe6"

      使用tmcn套件與 toUTF8 函數後:
      [1] "大樹阻台北淡水路 北投警冒雨排除"
      [2] "曾抗議連戰赴中被美禁入境 王世堅坦然面對"

  2. 十月 3, 2015
    Reply

    謝謝CHIA-HUNG,很有用的資訊!

    • 十月 3, 2015
      Reply

      對了
      提醒一下大家,新版的 rvest 除了將 html() 改為 read_html()
      也改了引用套件,相信套件作者應該是為了效率提升所做的改變
      但是似乎比較起舊版的 rvest 更容易當掉…
      然後也有一些奇怪的bug… 例如捉 R blogger 某篇文章時 html_nodes()就會報錯… 但其他篇就不會

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *