scrapy如何从csv文件中读取start_urls?

时间:2020-01-16 14:21:47

标签: python scrapy

我有两只蜘蛛。假设A和B。A抓取一堆URL并将其写入一个csv文件,B抓取这些URL内的A生成的csv文件读取。但是在A实际创建文件之前,它会从B抛出FileNotFound错误。如何使我的蜘蛛行为使B等待直到A返回URL?任何其他解决方案都将有所帮助。

WriteToCsv.py文件

def write_to_csv(item):
    with open('urls.csv', 'a', newline='') as csvfile:
        fieldnames = ['url']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({'url': item})


class WriteToCsv(object):
    def process_item(self, item, spider):
        if item['url']:
            write_to_csv("http://pypi.org" +item["url"])
        return item

Pipelines.py文件

ITEM_PIPELINES = {
    'PyPi.WriteToCsv.WriteToCsv': 100,
    'PyPi.pipelines.PypiPipeline': 300,
}

read_csv方法

def read_csv():                   
x = []
with open('urls.csv', 'r') as csvFile:
    reader = csv.reader(csvFile)
    for row in reader:
        x = [''.join(url) for url in reader]
return x

B蜘蛛文件中的起始网址

start_urls = read_csv() #Error here

1 个答案:

答案 0 :(得分:1)

我会考虑使用具有两种方法parsefinal_parse的单个蜘蛛。据我所提供的上下文所知,无需将URL写入磁盘。

parse应该包含用于抓取Spider A当前正在写入csv的URL的逻辑,并应返回带有final_parse方法回调的新请求。

def parse(self, response):
    url = do_something(response.body_as_unicode())
    return scrapy.Request(url, callback=self.final_parse)

final_parse应该包含蜘蛛B以前的解析逻辑。

def final_parse(self, response):
    item = do_something_else(response.body_as_unicode())
    return item

注意:如果您需要将其他信息从parse传递到final_parse,则可以使用meta的{​​{1}}参数。

如果确实需要这些URL,则可以将其作为字段添加到您的商品中。 可以使用scrapy.Request进行访问。