【问题标题】:Scrapy error pulling up SelectorScrapy错误拉起选择器
【发布时间】:2018-08-03 15:48:43
【问题描述】:

我正在使用 335 个 URL 的列表,每个 URL 由不同的基因访问号组成,以向 NCBI 网站 GenBank 发出请求。我想要的部分数据在一个名为:

//*[@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

非常感谢任何帮助。

【问题讨论】:

    标签: python html xml scrapy python-requests


    【解决方案1】:

    你在这里并不需要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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 2019-08-07
      相关资源
      最近更新 更多