⽹页爬⾍(超超简单的⼀个⼩例⼦)
(⼀) ⽬标:
在Uniprot中查询⼀系列基因编号(如图中第⼆列gene)对应的详细信息,基因编号以csv格式存储,输出的详细信息也存⼊csv中 (⼆) 思路:
查询了⼏个基因编号之后发现,⽹页的排版不会变化,唯⼀改变的是其具体内容,所以决定⾸先获取⽹页所有的内容,然后进⾏分析,从中提取出⾃⼰想要的信息
(三) ⼯具:
基于python3,BeautifulSoup,⽤pandas来读写csv
需要的库:urllib bs4 pandas
注意:python3和python2的urllib不⼀样,python2中为urllib2
简单网页(四) 具体步骤:
A. 导⼊相关库:
B. ⽤pandas读⼊csv:
C. 获取⽹页信息:
由于要查询⼀系列的基因号,例如:B0024.14,F38E9.2,且通过观察⽹址可知,基因号的变化只是修改了⽹址中对应的‘query’,如查询B0024.14时,query= B0024.14,所以每次只需修改⽹址对应部分即可。这步通过for来实现:
import quest
from bs4 import BeautifulSoup
import csv
import pandas as pd
csvFile = 'index.csv'
data = pd.read_csv(csvFile )
*读⼊的data 是⼀个字典
for geneName in data['gene']:
anaUrl = '/uniprot/?query=' + geneName + '&sort=score'
page = quest.urlopen(anaUrl)#请求响应⽹址
contents = ad()#读取⽹址的内容
soup = BeautifulSoup(contents, "html.parser")#对获得的内容进⾏解析以便于后续分析
D. 内容分析:
⽹页内容都存于soup中,想要获得相应的内容,需要先对某⼀个查询结果⽹页的源代码进⾏分析,观察⾃⼰想要的信息存在什么样的标签之下。⾸先点击⿏标右键→‘检查’查看源代码,然后按‘Ctrl+Shif+C’,将⿏标放在⽹页中的相应位置,代码的elements中即会跳转⾄相应的位置,如将⿏标放在图中的“supporting data”,右边显⽰该内容存在<div class id="supporting-data-browse"><h3>Supporting data</h3></div>。
此步分析只要到了相应的位置就可以提取出数值,我⽤得⽐较多的命令是“.find_all”,如soup.find_all(‘div’,class_=’content results),其中div为标签的名称,class_是类(注意此处的class,在⽹页中没有下划线,但在python中必须加⼊,⽹上看到的解释是python中class是关键字,避免冲突,使⽤下划线)。
针对我的⽬标,观察发现内容都存在content results下的tbody中,所以实现如下:
for tag in soup.find_all('div', class_='content results'):
m_body = tag.find('tbody')
if m_body is None:
print('None')
else:
en = m_body.find_all("a")#寻body中的所有a标签
entry = en[0].text
organism = en[1].text
enn = m_body.find_all("td")#
entryName = enn[2].text
protein = tag.find('div', class_="protein_names")#精确定位
kk = protein.find_all('div', class_="short")
proteinName = kk[0].text
其中,en为列表,所以直接输出每⼀项的内容即可,protein不是最终的结果,还有下层,所以可以再使⽤find_all,直到最后⼀层。在html中,可能有很多相同的标签,所以有些内容提⽰不到时,就先寻此标签的上级标签,应该就可以到。
E. 结果存储:
可将结果存⼊⼀个列表中,然后调⽤
with open(resultFile, 'a', newline='') as out:
csv_write = csv.writer(out, dialect='excel')
csv_write.writerow(label)
csv_write.writerow(result)
这⾥采取’a’是追加csv形式,会在原内容下⽅新增内容,不会覆盖原内容。更多的格式可参考。
其中label为csv的标题,只需调⽤⼀次即可,如label=[‘name’,’entry’,’proteinName’],对应的result为[‘b0024 14’,‘G5EF34’,’ CRiM (Cysteine Rich motor neuron protein) homolog’]。
注意:*
find_all 返回包含⽬标值的⼀个列表,当对象为空时,返回空列表;find_all之后不能再⽤find_all
find 直接返回⽬标值,当对象为空时,返回None
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论