【问题标题】:Crawl website from list of values using scrapy使用scrapy从值列表中爬取网站
【发布时间】:2017-01-18 17:19:22
【问题描述】:

我有一个 NPI 列表,我想从 npidb.org 抓取提供者的名称 NPI 值存储在 csv 文件中。

我可以通过在代码中粘贴 URL 来手动完成。但是,如果我有一个 NPI 列表,每个我想要提供者名称,我就无法弄清楚该怎么做。

这是我当前的代码:

import scrapy
from scrapy.spider import BaseSpider



class MySpider(BaseSpider):
    name = "npidb"

    def start_requests(self):
        urls = [

            'https://npidb.org/npi-lookup/?npi=1366425381',
            'https://npidb.org/npi-lookup/?npi=1902873227',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-1]
        filename = 'npidb-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

【问题讨论】:

  • 您想从命令行提供所有npi 值吗?文本文件?
  • NPI 存储在从另一个代码派生的 csv 文件中。
  • csv文件的结构是什么?如果您将每个 URL 作为每行的条目,则可以编写如下内容: open(file_name).read().split() 并获取所有行的列表。
  • 它们只是其中的 NPI。挑战是将它们粘贴到 URL 中并获取与每个 NPI 关联的名称。这可能是一件非常容易的事情,但我是一个完全的新手,无法破解它。

标签: python scrapy scrapy-spider scrapy-pipeline


【解决方案1】:

假设你有一个来自 csv 文件的 npi 列表,那么你可以简单地使用format 来更改网站地址如下(我还添加了从 csv 文件中获取列表的部分。如果你已经有了,你可以省略那部分):

    def start_requests(self):
        # get npis from csv file
        npis = []
        with open('test.csv', 'r') as f:
            for line in f.readlines():
                l = line.strip()
                npis.append((l))
       # generate the list of address depending on npi
        start_urls = []
        for npi in npis:
            start_urls.append('https://npidb.org/npi-lookup/?npi={}'.format(npi))
        for url in start_urls:
            yield scrapy.Request(url=url, callback=self.parse)

【讨论】:

    【解决方案2】:

    嗯,这取决于您的 csv 文件的结构,但如果它在单独的行中包含 npi,您可以执行类似的操作

    def start_requests(self):
        with open('npis.csv') as f:
            for line in f:
                yield scrapy.Request(
                    url='https://npidb.org/npi-lookup/?npi={}'.format(line.strip()), 
                    callback=self.parse
                )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多