【发布时间】:2015-11-07 18:44:14
【问题描述】:
我有 2 个蜘蛛并在这里运行它:
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
process1 = CrawlerProcess(settings)
process1.crawl('spider1')
process1.crawl('spider2')
process1.start()
我希望这些蜘蛛写一个通用文件。
这是管道类:
class FilePipeline(object):
def __init__(self):
self.file = codecs.open('data.txt', 'w', encoding='utf-8')
self.spiders = []
def open_spider(self, spider):
self.spiders.append(spider.name)
def process_item(self, item, spider):
line = json.dumps(OrderedDict(item), ensure_ascii=False, sort_keys=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.spiders.remove(spider.name)
if len(self.spiders) == 0:
self.file.close()
但是虽然我没有收到错误消息,但当所有蜘蛛都在公共文件中完成写入时,我的行(项目)比 scrapy 日志少。几行被剪掉了。也许有一些练习可以同时从两个蜘蛛中写入一个文件?
更新:
谢谢大家!) 我是这样实现的:
class FilePipeline1(object):
lock = threading.Lock()
datafile = codecs.open('myfile.txt', 'w', encoding='utf-8')
def __init__(self):
pass
def open_spider(self, spider):
pass
def process_item(self, item, spider):
line = json.dumps(OrderedDict(item), ensure_ascii=False, sort_keys=False) + "\n"
try:
FilePipeline1.lock.acquire()
if isinstance(item, VehicleItem):
FilePipeline1.datafile.write(line)
except:
pass
finally:
FilePipeline1.lock.release()
return item
def spider_closed(self, spider):
pass
【问题讨论】:
-
什么不能正常工作 - 您在解释时是否遇到错误?还是该程序无法按照您的意愿进行操作?将这些详细信息添加到您的问题中。
-
我没有收到错误消息,但是当所有蜘蛛都以公共文件结尾时,我的行(项目)更少,然后在日志中写入。并剪了几行。也许有一些练习可以同时从两个蜘蛛中写入一个文件?
标签: python scrapy scrapy-pipeline