美文网首页小教程收藏生物信息学与算法
python静态爬取ENCODE数据(requests + Be

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

作者: 生信编程日常 | 来源:发表于2020-01-02 15:23 被阅读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)

    相关文章

      网友评论

        本文标题:python静态爬取ENCODE数据(requests + Be

        本文链接:https://www.haomeiwen.com/subject/mdznoctx.html