我有两只蜘蛛。假设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
答案 0 :(得分:1)
我会考虑使用具有两种方法parse
和final_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
进行访问。