使用scrapy从值列表中抓取网站

时间:2017-01-18 17:19:23

标签: python scrapy scrapy-spider scrapy-pipeline

我有一份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)

2 个答案:

答案 0 :(得分:0)

假设您有一个来自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)

答案 1 :(得分:0)

嗯,这取决于你的csv文件的结构,但是如果它在单独的行中包含npis,你可以做类似的事情

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
            )