2017-12-27 3 views
0

치료를 사용하여 링크가 포함 된 테이블을 구문 분석하고 json에 저장합니다. 표의 링크는 추가 세부 정보를 포함하며 다른 JSON으로 가져와 저장됩니다. (이 예 : https://docs.scrapy.org/en/latest/topics/exporters.html)치료 파이프 라인 내보내기 개체가 인스턴스화되지 않습니다.

이 작업을 수행하려면 파이프 라인을 사용하여 항목 유형을 확인하고 결과를 적절한 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

음, 네 말이 맞아, 배차자와 그 방법은 반대된다. 예제에서 언급 한 방법으로 메소드를 변경했습니다. print()를 사용하여 인쇄 한 출력을 볼 수 있습니다. 그러나 두 개의 파일을 열고 각각의 항목 객체를 쓰고 싶지만 오류가 발생했습니다.''파이프 라인 객체에는 속성 파일이 없습니다. '파이프 라인 객체에는 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 

이렇게하면 원한다면 수출업자를 사용할 수 있다면 더 좋을 것이다. 누군가 어떻게 작동하는지 알고 있다면 업데이트하십시오.

관련 문제