0
私はscrapyを使用してリンクを含むテーブルを解析し、jsonで保存します。テーブルからのリンクには追加の詳細が含まれており、それらをフェッチして別のJSONに格納します。 (この例に続く:https://docs.scrapy.org/en/latest/topics/exporters.html)scrapyパイプラインエクスポータオブジェクトがインスタンス化されていません
これを達成するために、パイプラインを使用して項目の種類をチェックし、結果を適切なjsonに格納しています。しかし、私はいくつかの奇妙なエラーで立ち往生しています。下記をご参照ください:
from scrapy import signals
from scrapy.exporters import JsonItemExporter
from for_icu import items
class ListPipeline(object):
def __init__(self):
self.files = {}
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
crawler.signals.connect(pipeline.spider_opened, signals.spider_opened)
crawler.signals.connect(pipeline.spider_closed, signals.spider_closed)
return pipeline
def spider_opened(self, spider):
print("spider_opened")
file_table = open('%s_table.json' % spider.name, 'w+b')
self.files[spider].append(file_table)
self.exporter1 = JsonItemExporter(file_table)
self.exporter1.start_exporting()
file_detail = open('%s_detail.json' % spider.name, 'w+b')
self.files[spider].append(file_detail)
self.exporter2 = JsonItemExporter(file_detail)
self.exporter2.start_exporting()
def spider_closed(self, spider):
print("spider_closed")
self.exporter1.finish_exporting()
self.exporter2.finish_exporting()
for file in self.files.pop(spider):
file.close()
def process_item(self, item, spider):
print("process_item")
if isinstance(item, items.UniListItem):
self.exporter1.export_item(item)
return item
elif isinstance(item, items.UniDetail):
self.exporter22.export_item(item)
return item
がエラー:
2017-12-27 11:41:15 [scrapy.core.scraper] ERROR: Error processing {'country': ('Finland',),
'country_code': ('fi ',),
'u_link': ('http://www.xxxxxxx.xxx/xxxxxxx/xxxx.htm',),
'u': (' pisto',)}
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "/Users/website_scrapy/for_icu/for_icu/pipelines.py", line 31, in process_item
self.exporter.export_item(item)
AttributeError: 'ListPipeline' object has no attribute 'exporter1'
私は私がここで行方不明です何を教えてください...時間の過去のカップルから、この時に立ち往生している...
'print()'をメソッドに配置し、実行されるメソッドを確認します。なぜあなたは 'spider_opened'を使うのですか? [examples](https://docs.scrapy.org/en/latest/topics/item-pipeline.html)のように '' open_spider ''を使用できませんか? – furas
ええ、あなたが正しいです、ディスパッチャーとそれらのメソッドはdepricatedです。私は例を挙げた方法に変更しました。 'print()'を使用して出力したものを見ることができます。 しかし、以下を参照してください。2つのファイルを開き、それぞれのアイテムオブジェクトを書きたいが、今はエラーが発生しています... 'pipeline objectに属性ファイルがありません'パイプラインオブジェクトには属性exporter1'がありません。上記の変更されたコードを投稿する – nikhil14
'__init__'に' self.exporter1 = None'を追加する必要があります –