小教程收藏生物信息学与算法

python静态爬取ENCODE数据(requests + Be

2020-01-02  本文已影响0人  生信编程日常

ENCODE(Encyclopedia of DNA Elements)是由美国国家人类基因组研究所(NHGRI)在2003年发起的一个项目,内有人类,小鼠,果蝇,蠕虫的多种组织和不同类型的测序数据,如果要分析公共数据的话,这是一个很好的数据库选择。


image.png

查询某一个experiments的信息在search里可以输入信息,比如ENCSR014GSQ,即可跳转:https://www.encodeproject.org/experiments/ENCSR014GSQ,所有的experiment的网址都是这种格式,前面是https://www.encodeproject.org/experiments/, 后面是ID。如果是文件的话,网址格式为https://www.encodeproject.org/files/ENCFF877XUC/这种。

在首页Data-Experiment Matrix中可以下载得到各种类型的Metadata信息,不过有时候一步步手动下载会比较烦人,这时候我们根据experiments的id列表用python爬虫就可以简单方便的得到这些实验数据的各种信息了。下面用ENCSR014GSQ为例做一个简单爬虫。

首先打开刚才的experiment的界面,右键“检查”,显示页面的前端代码,箭头选择想要查看的信息(这里想要拿出来的信息是Biosample summary),可以看到:


image.png

可以注意到这句描述在<span>标签中,但是这个标签不好定位。往上看可以看到<dt>标签的内容是“Biosample summary”,这一个内容在这个网页中是唯一的,可以通过这个标签来找到我们想要的描述信息。

然后我们可以先爬取出来整个网页:

import requests
from bs4 import BeautifulSoup

exp = 'ENCSR014GSQ'
url = 'https://www.encodeproject.org/experiments/' + exp
r = requests.get(url, timeout=30) 
r.raise_for_status() # 返回状态码,200是正常
r.encoding = r.apparent_encoding #识别页面编码
html = r.text # 返回页面信息

这样出来是我们从"检查"上看到的所有的标签信息,现在找出来想要的biosample summary中的信息。用BeautifulSoup对html解析,找到dt标签为Biosample summary的那一段:

soup = BeautifulSoup(html, 'html.parser')
dt = soup.find_all('dt') # 注意find_all返回一个list
for i in dt:
    if i.string == 'Biosample summary':
        tmp_summary = i.next_sibling.children # 兄弟节点的子节点
        print(exp + '\t' + [j for j in tmp_summary][1].string) # 第二个子节点中的信息

解释一下最后两句,写有描述信息的<span>标签是<dt>标签的下一个兄弟节点(next.sibling)<dd>的子节点(children)的第二个,children返回一个迭代器,[j for j in tmp_summary][1].string通过迭代返回第二个标签,并取出里面的信息“adrenal gland female adult (51 year)”。

最后封装到函数中:

import requests
from bs4 import BeautifulSoup


def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

    
def get_message(html):
    soup = BeautifulSoup(html, 'html.parser')
    dt = soup.find_all('dt')
    for i in dt:
        if i.string == 'Biosample summary':
            tmp_summary = i.next_sibling.children
            summary = [j for j in tmp_summary][1].string
            return summary
    
def main(exp):
    url = 'https://www.encodeproject.org/experiments/' + exp
    html = getHTMLText(url)
    biosample_summary = get_message('' + html)
    print(exp + '\t' + biosample_summary)

欢迎关注~


python静态爬取ENCODE数据(requests + BeautifulSoup)
上一篇下一篇

猜你喜欢

热点阅读