如何在scrapy中从csv文件读取开始URL?

2024-03-29 14:16:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两只蜘蛛。假设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,
}

读取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 spider文件中启动\u URL

start_urls = read_csv() #Error here

Tags: 文件csvtopyurldefwithopen
1条回答
网友
1楼 · 发布于 2024-03-29 14:16:31

我会考虑使用两种方法的单个蜘蛛{{CD1>}和^ {< CD2}}。据我所知,从您提供的上下文来看,没有必要将URL写入磁盘

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应该包含以前在spider B中的解析逻辑

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

注意:如果需要将任何附加信息从parse传递到final_parse,可以使用scrapy.Requestmeta参数

如果您确实需要URL,可以将其作为字段添加到项目中。 它可以通过response.url访问

相关问题 更多 >