以关键字“Lysin”为例,https://www.ncbi.nlm.nih.gov/protein/?term=lysin,我们打开网址发现关于Lysin的蛋白质序列一共有13708页,每页有20条蛋白信息,通过点击FASTA,我们找到了对应蛋白的氨基酸序列,通过尝试不同序列的FASTA,我们发现其url的后缀为其蛋白的Accession号,因此我们只要得到蛋白的Accession号,我们就可以通过网址链接获取蛋白质的氨基酸序列,第一页20条蛋白的Accession号我们可以通过网址链接加循环获取语句获得,而第二页及以后我们发现找不到对应网页链接了,我们无法通过网页链接获取对应页的内容,这个时候就要使用find_element_by_id/name/class_name/link_text/tag_name/xpath/css_selector('target')来找到目标并对其进行下一步操作,如点击.click()进行下一页,或者获取目标下的文本.text,如果一个页面中含有多个相同的target,如果只获取第一个则使用element,获取全部则使用element的复数形式elements。
1.获取多个关键字的前7页蛋白Accession
# -*- coding:UTF-8 -*-
python
import requests
import time
import random
from bs4 import BeautifulSoup
from selenium import webdriver
browser = webdriver.Firefox()
keywords = ['Lysin','peptidoglycan' + '+' + 'hydrolase','amidase']
for kwd in keywords:
browser.get('https://www.ncbi.nlm.nih.gov/protein/?term=' + kwd)
m = browser.find_elements_by_tag_name('dd')
m = m[0:40]
a_total = []
for each in m:
a = each.text
a_total.append(a)
browser.find_element_by_xpath('//*[@id="EntrezSystem2.PEntrez.Protein.Sequence_ResultsPanel.Entrez_Pager.Page"]').click()
m = browser.find_elements_by_tag_name('dd')
m = m[0:40]
b_total = []
for each in m:
a = each.text
b_total.append(a)
b = 0
c_total = []
for b in range(5):
b += 1
browser.find_element_by_css_selector('div.pagination:nth-child(2) > a:nth-child(4)').click()
time.sleep(random.randint(1,10))
m = browser.find_elements_by_tag_name('dd')
m = m[0:40]
time.sleep(random.randint(1,10))
c_total = []
for each in m:
a = each.text
c_total.append(a)
d_total = a_total + b_total + c_total
f = open("NCBI_protein_ID_GI.txt", "a+")
for each in d_total:
f.write(each + "\n")
f.close()
b = []
i = 0
f = open("NCBI_protein_ID_GI.txt","r")
for line in f.readlines():
i += 1
if (i % 2 != 0):
b.append(line)
f.close()
print(b)
2.根据蛋白Accession号,我们获得所有关键词的氨基酸序列
在以上代码基础上,我们继续输入如下代码:
seq = []
for i in b:
url = 'https://www.ncbi.nlm.nih.gov/protein/' + i.replace('\n','') + '?report=fasta'
time.sleep(random.randint(1,10))
browser.get(url)
time.sleep(random.randint(1,10))
m = browser.find_elements_by_tag_name('pre')
k = m[0].text
f = open("NCBI_protein_sequence","a+")
f.write(k + '\n')
seq.append(k)
f.close()
print(seq)
我们发现每次爬虫,界面都会按照代码打开新的页面,这就使得代码运行的速度大大的减慢,我们可以添加不加载浏览器的指令:
# -*- coding:UTF-8 -*-
python
import selenium
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver import FirefoxOptions
option = FirefoxOptions()
option.add_argument('--headless')
browser = webdriver.Firefox(options = option)
将以上代码可以合并到同一个文本文件中去掉第二行代码‘python’,修改后缀为xxx.py,告诉系统这是一个python文件,在ubuntu环境下添加可执行权限并运行。
chmod +x ./NCBI_protein_ID_download.py
python NCBI_protein_ID_download.py
喜欢的点击下方链接,可以加个微信公众号关注,不定时会推送一些学习所得网络爬虫进阶版:如何批量获得具有关键字的NCBI蛋白质序列