我使用的是335个URL列表,每个URL均来自不同的基因访问号,以向NCBI网站GenBank发出请求。我想要的数据部分在一个名为XPath的XPath中:
//*[@id="viewercontent1"]/pre
我似乎无法拿起所需的选择器工具,我需要从GenBank的每个XML页面中摘录一些文本。
我的代码是:
import csv
result = []
for line in open("C:/Projects/NCBI Scraper project/geneAccNumbers.txt"):
result.append(line.split(','))
csv = open("C:/Projects/NCBI Scraper project/geneAccNumbers.txt", 'r')
for gene in csv.readline().split(','):
URL = URL = 'https://www.ncbi.nlm.nih.gov/nuccore/' + gene + '.1?report=fasta'
def build_url(gene):
return 'https://www.ncbi.nlm.nih.gov/nuccore/' + gene + '.1?report=fasta'
genes_urls = [build_url(gene) for gene in csv]
import pip
import requests
res = []
for url in genes_urls:
res.append(requests.get(url))
import scrapy
hxs.select('//*[@id="viewercontent1"]/pre').extract()
除了最后一行,一切都进行了。我还需要知道拆分和整理我想要的所有已抓取文本数据的方法。
这是我要抓取的信息的网站示例:
https://www.ncbi.nlm.nih.gov/nuccore/DQ147858.1?report=fasta
非常感谢任何帮助。
答案 0 :(得分:0)
您实际上不需要scrapy
。您只需要其中一部分,称为parsel
即可用于解析响应(您可以使用beautifulsoup
或任何您喜欢的HTML解析库)。
但是还有另外一件事:所需的数据是通过JavaScript代码添加的,这意味着在您请求的URL的响应中不存在这些数据。因此,您需要向其API(link)发出额外请求,以获取所需的数据。如您所见,此链接将完全返回您所需的内容。
但是,如果仔细查看URL参数,您会注意到id
,我们没有。但是可以很容易地从第一个响应中进行解析。
所以代码将如下所示:
import parsel
import requests
# URL of the data you want
detail_url_template = (
'https://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi'
'?id={id}'
'&db=nuccore'
'&report=fasta'
'&extrafeat=null'
'&conwithfeat=on'
'&retmode=html'
'&withmarkup=on'
'&tool=portal'
'&log$=seqview'
'&maxdownloadsize=1000000'
)
data = []
for url in genes_urls:
# Get the response from the gene URL
response = requests.get(url)
s = parsel.Selector(response.text)
# Extract id value for future request
val = s.css('#viewercontent1::attr(val)').extract_first()
# Get the URL where the data you want is located
detail_url = detail_url_template.format(id=val)
response = requests.get(detail_url)
data.append(response.text)