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)
网友评论