我有两只蜘蛛。假设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
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
,则可以使用meta
的scrapy.Request
自变量。
如果您确实需要这些URL,则可以将其作为字段添加到您的商品中。可以通过response.url
进行访问。