rvest是由Hadley Wickham所開發的R的package,其結合httr和xml2,提供更簡潔方便的來抓取網頁的html, xml資料。單純使用httr其實就可以很方便地使用http的方式來抓取網站資源,但還需要再另外使用其他處理回傳資料的軟件包,所以rvest就解決這個問題,可以直接指定css或是xpath來抓取特定的xml/html nodes。
關於如何選定css或是xpath,可以使用Hadley Wickham推薦的selectorgadget,可以很方面的在網頁上選取想要抓取的部分。
這邊想要分享更進階的應用,使用rvest來爬取需要先登入帳號密碼的網站。
問題
主要是想用rvest來爬取藥物基因體學PharmGKB的資料庫,但此資料庫需要先登入
(此資料庫是可以申請License授權資料的,這邊只是想做一個練習!)
那要怎麼解決這個問題呢?
可以利用rvest裡面的html_session, html_form, submit_form, jump_to這幾個函數來解決!
# create a session # 首先,第一個使用的url為有填寫登入帳號密碼的頁面 url.address <-"https://www.pharmgkb.org/sign-in-start.do" ## 使用html_session建立一個session(session其實是用package所建立的,可以保持你在此網站互動的足跡,想更深入可以稍微瞭解一下http協定和這篇文章) pgsession <-html_session(url.address) ## 抓取填寫帳密欄位的表格(這邊的2是要根據每個人所登入的網頁不同調整,這邊帳密表格剛好在第2個) pgform <-html_form(pgsession)[[2]] ## pull form from session ## 填寫帳密 filled_form <- set_values(pgform, `userId` = "****@gmail.com", `password` = "*****") ## 送出帳密到這個session中,取得進一步爬取資料的授權 submit_form(pgsession,filled_form) ## 接者要跳轉入自己真正有興趣的網頁 rs.url.address <- paste0("https://www.pharmgkb.org/view/variant-annotations.do?variantId=",rsID) # 使用jump_to函數在此session中送出url request(模擬個人瀏覽網頁的狀況) web.page <- jump_to(pgsession, rs.url.address) %>% read_html
參考閱讀:
關於http協定和session
1. how programming language implement “session"
stackover討論串
1. scrape password-protected website in R
2. automating the login to the uk data service website in R with Rcurl or httr
3. scraping password protected forum in r
4. Using rvest or httr to log in the non-standard forms on a webpage
rvest資料
1.rvest package on Github
2.rvest documentation on CRAN
3.rvest tutorial