使用API訪問ClinVar數據
公眾號第一篇文章ClinVar學習筆記就是關於ClinVar的,當時只是提到API,並沒有拿來用,最近工作用到這個,於是順便做整理出來,希望可以給你能帶來幫助。
開始之前
如果你也需要使用ClinVar API或者出於其他原因,需要使用NCBI 的API,那麼建議先看一看Entrez Programming Utilities Help,ClinVar是NCBI收錄遺傳變異信息的資料庫,它提供的API也包含在Entrez裡面。這個文檔除了告訴我們,Entrez支持哪些方法,怎麼使用,重要的是還講了要獲取什麼樣的信息,合適的方法是什麼。如果你開始前沒看過這個文檔,而是隨便搜到一個例子,就拿去用了。那麼你有可能會因不當使用而被封IP。
上面那份文檔,規定了使用程序介面訪問NCBI,一秒內請求不得超過3次,超過的話會被封IP。使用過程中,需要提交程序開發者的郵箱和程序名,任何缺少這兩者的請求以及訪問頻率不合規的請求,都可能會被封IP。實際使用中發現少量的請求,不提供這兩個的話也能用,發起的查詢請求一多,就不行了,所以最好還是按照規範操作。
舉例
使用Entrez發起請求有兩種方式:GET和POST,區別在於,如果一次提交的ID超過200個,要使用POST才可以,這點和網頁的道理一樣,畢竟API也是通過網路提供的。下面的第一個例子,直接打開一個網址,使用的是GET;第二個使用POST。
gene_names = set(gene_names)ngene_varid = {}nfor gene in gene_names:n gene_search_url = https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=clinvar&term={gene}[gene]&retmax=100&retmode=json.format(**locals() )n gene_varid[gene] = json.loads(urllib2.urlopen(gene_search_url).read() )n time.sleep(1) #這裡我設為等待1 sec,實際中可以更短,只要大於1/3 sec就行。n
上面的例子中,retmax是返回的最多記錄數,默認20,最大不超過100,000個,如果要查的記錄數目很大,可以使用usehistory和retstart,分多次查詢。retmode是返回的數據類型,默認是XML,這裡使用的是json。
import requestsnnfor gene in gene_varid:n varid = ,.join(gene_varid[gene][esearchresult][idlist][:20] ) #最開始使用GET,且沒有在url中加上郵箱和程序名,出現「IncompleteRead」錯誤。nn req = requests.post(https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi, n data={db:clinvar, id:varid, nretmode:json, email:user@mail.com, ntool:Link2Clinvar} )n gene_varid[gene][esumresult] = req.json()n time.sleep(1)n
參考:
示例代碼完整版題圖:Ben White Photography | Unsplash
http://weixin.qq.com/r/tETI0BDESU02rVSz9xGm (二維碼自動識別)
推薦閱讀:
※碼農轉臨床,未來想做癌症數據分析,解決癌症問題,可行嗎?
※生信進階第2課-你應該知道的人類基因組信息
※P值與基因組學(1):從fastq文件的分析的分析談起
※合成引物要批量操作 DNA 序列? 你需要 Tailorbird!
※能飲一杯無?