這裡介紹一個 R 使用 httr 套件,以 POST 方式抓取網路資料的範例。
Broad Institute 的網站上有提供 SNP Annotation 的資料供使用者下載,下載時使用這要先傳送相關的搜尋參數,才能取得查詢的結果,以下介紹如何使用 R 的 httr 套件自動抓取這個網站上的資料。
Step 2
在 Input SNPs 欄位選擇「Text Entry」,並點選 Example 載入範例。
Step 3
在 Output Options 中,將 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
。
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)
這樣就完成資料的捉取動作了。