首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >python静态爬取ENCODE数据(requests + BeautifulSoup)

python静态爬取ENCODE数据(requests + BeautifulSoup)

作者头像
生信编程日常
修改2023-09-21 15:35:28
修改2023-09-21 15:35:28
6110
举报

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”,这一个内容在这个网页中是唯一的,可以通过这个标签来找到我们想要的描述信息。

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

代码语言:javascript
复制
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的那一段:

代码语言:javascript
复制
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)”。

最后封装到函数中:

代码语言:javascript
复制
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)

欢迎关注~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档