如何从草皮的csv文件中读取start_urls?

问题描述 投票:0回答:1

我有两只蜘蛛。假设A和B。A抓取一堆网址并将其写入csv文件,B抓取从A生成的csv文件读取的这些url中的内容。但是在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
python scrapy
1个回答
0
投票
[parse应包含用于抓取蜘蛛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,则可以使用metascrapy.Request自变量。

如果您确实需要这些URL,则可以将其作为字段添加到您的商品中。可以通过response.url进行访问。
© www.soinside.com 2019 - 2024. All rights reserved.