2017-12-27 21 views
0

私はscrapyを使用してリンクを含むテーブルを解析し、jsonで保存します。テーブルからのリンクには追加の詳細が含まれており、それらをフェッチして別のJSONに格納します。 (この例に続く:https://docs.scrapy.org/en/latest/topics/exporters.htmlscrapyパイプラインエクスポータオブジェクトがインスタンス化されていません

これを達成するために、パイプラインを使用して項目の種類をチェックし、結果を適切な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' 

私は私がここで行方不明です何を教えてください...時間の過去のカップルから、この時に立ち往生している...

+0

'print()'をメソッドに配置し、実行されるメソッドを確認します。なぜあなたは 'spider_opened'を使うのですか? [examples](https://docs.scrapy.org/en/latest/topics/item-pipeline.html)のように '' open_spider ''を使用できませんか? – furas

+0

ええ、あなたが正しいです、ディスパッチャーとそれらのメソッドはdepricatedです。私は例を挙げた方法に変更しました。 'print()'を使用して出力したものを見ることができます。 しかし、以下を参照してください。2つのファイルを開き、それぞれのアイテムオブジェクトを書きたいが、今はエラーが発生しています... 'pipeline objectに属性ファイルがありません'パイプラインオブジェクトには属性exporter1'がありません。上記の変更されたコードを投稿する – nikhil14

+0

'__init__'に' self.exporter1 = None'を追加する必要があります –

答えて

0

私がいました輸出者の仕事ができないので、私は仕事のために簡単なファイルライターを使いました:

class ListPipeline(object): 
unilist = [] 
unidetail = [] 

def close_spider(self, spider): 
    print("spider_closed") 
    file_table = open('%s_table.json' % spider.name, 'w') 
    line = json.dumps(self.unilist) 
    file_table.write(line) 
    file_table.close() 
    file_detail = open('%s_detail.json' % spider.name, 'w') 
    line = json.dumps(self.unidetail) 
    file_detail.write(line) 
    file_detail.close() 
    self.unilist.clear() 
    self.unidetail.clear() 

def process_item(self, item, spider): 
    print("process_item") 
    if isinstance(item, items.UniListItem): 
     self.unilist.append(dict((item))) 
     return item 
    elif isinstance(item, items.UniDetail): 
     self.unidetail.append(dict((item))) 
     return item 

私は私が欲しいが、組み込みの輸出業者を使うことができる方が良いだろう。それを動作させる方法が分かっている場合は、更新してください。

関連する問題