進階R網路爬蟲:利用rvest來爬取需要帳號密碼登入的藥物基因體資料庫

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授權資料的,這邊只是想做一個練習!)


%e8%9e%a2%e5%b9%95%e5%bf%ab%e7%85%a7-2017-01-18-%e4%b8%8b%e5%8d%8811-44-20

那要怎麼解決這個問題呢?

可以利用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

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s