分類: R

R 使用 httr 套件抓取網路資料教學:以 SNP Annotation 為例

這裡介紹一個 R 使用 httr 套件,以 POST 方式抓取網路資料的範例。

Broad Institute 的網站上有提供 SNP Annotation 的資料供使用者下載,下載時使用這要先傳送相關的搜尋參數,才能取得查詢的結果,以下介紹如何使用 R 的 httr 套件自動抓取這個網站上的資料。


Step 1
開啟 Broad Institute 的 SNP Annotation 搜尋頁面

SNP Annotation 搜尋頁面

Step 2
在 Input SNPs 欄位選擇「Text Entry」,並點選 Example 載入範例。

Input SNPs 欄位選擇「Text Entry」

Step 3
在 Output Options 中,將 Download to 選項改為「Browser」,讓資料可以直接顯示在瀏覽器中。

將 Download to 選項改為 Browser

Step 4
從 Google Chrome 瀏覽器的選單中,開啟「開發人員工具」視窗,將頁面切換至「Network」那一頁,準備觀察所有的連線資料。

接著點選網頁下方的「search」按鈕,將查詢的參數送出,取得查詢結果,完成後就會看到類似這樣的畫面。

查詢結果

Step 5
在下方的連線中,選擇最主要的 ldsearchpw.php 連線,接著從 Headers 的籤頁檢查 Request URL 與 Request Method,這裡的 URL 是 http://www.broadinstitute.org/mpg/snap/ldsearchpw.php,而 Method 則是 POST

網址與 Method

Step 6
在下方的 Request Payload 中,將每一個欄位的名稱與值都複製出來。例如 searchPairwise 欄位的值就是 true,其餘以此類推。

Step 7
使用 R 的 httr 套件,仿照瀏覽器丟出一模一樣的請求(request)。由於這個網頁是使用 POST 的方式送出請求,所以這裡要用 httr 的 POST 送出請求,至於 POST 請求中要放的參數,則是按照上面 Request Payload 中的資料來設定,以下是完整的 R 程式碼。

library(httr)
url <- "http://www.broadinstitute.org/mpg/snap/ldsearchpw.php"
result <- POST(url, body = list(
  searchPairwise = "true",
  snpList = "rs9627183
rs11134178
rs12915721
rs2157697
rs4011946
rs6501530
rs12301774
rs2594278
rs3792452 
rs1065758
rs12360508
rs16847570
rs175126
rs933771
rs1381795
rs3845659
rs2382075
rs16959263
rs1005324
rs2039430
rs4853259
rs12651081
rs11999224
rs17755054
rs11652864
rs2653306
rs7791083
rs10217716
rs6580967",
  hapMapRelease = "onekgpilot",
  hapMapPanel = "CEU",
  RSquaredLimit = "0.8",
  distanceLimit = "500000",
  downloadType = "Browser",
  suppressWarnings = "no",
  arrayFilter = "query",
  "columnList[]" = "DP",
  "columnList[]" = "GP",
  "columnList[]" =  "AM",
  submit = "search"
  ))
result

執行之後,就可以抓到跟瀏覽器一模一樣的結果:

Response [http://www.broadinstitute.org/mpg/snap/ldsearchpw.php]
  Date: 2016-09-02 06:01
  Status: 200
  Content-Type: text/plain; charset=UTF-8
  Size: 325 B
SNP	Proxy	Distance	RSquared	DPrime	Arrays	Chromosome	Coordinate_HG18
rs4011946	rs2653306	21118	1.000	1.000	A6,AxM,AAH	chr3	188658023
rs6501530	rs11652864	2898	1.000	1.000	AN,A5,A6	chr17	67807860
rs11652864	rs6501530	2898	1.000	1.000	AS,A5,A6,AxM	chr17	67810758
rs2653306	rs4011946	21118	1.000	1.000	A6,CM	chr3	188679141

最後我們可以使用 read.table 將資料轉為 R 的 data frame:

result.conn <- textConnection(content(result))
result.table <- read.table(result.conn, header = TRUE)

這樣就完成資料的捉取動作了。

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

3 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago