2017-02-21 1 views
0

치료를 테스트 할 코드가 있습니다. 내 목표는 단말기에서 scrapy 명령을 호출하지 않고도 치료를 사용하는 것이므로이 코드를 다른 위치에 삽입 할 수 있습니다.할당 된 파이프 라인을 호출하지 않는 치료

코드는 다음과 같다 :

보시다시피
from scrapy import Spider 
from scrapy.selector import Selector 
from scrapy.item import Item, Field 
from scrapy.crawler import CrawlerProcess 
import json 


class JsonWriterPipeline(object): 

    file = None 

    def open_spider(self, spider): 
     self.file = open('items.json', 'wb') 

    def close_spider(self, spider): 
     self.file.close() 

    def process_item(self, item, spider): 
     line = json.dumps(dict(item)) + "\n" 
     self.file.write(line) 
     return item 


class StackItem(Item): 
    title = Field() 
    url = Field() 


class StackSpider(Spider): 
    name = "stack" 
    allowed_domains = ["stackoverflow.com"] 
    start_urls = ["http://stackoverflow.com/questions?pagesize=50&sort=newest"] 

    def parse(self, response): 

     questions = Selector(response).xpath('//div[@class="summary"]/h3') 

     for question in questions: 
      item = StackItem() 
      item['title'] = question.xpath('a[@class="question-hyperlink"]/text()').extract()[0] 
      item['url'] = question.xpath('a[@class="question-hyperlink"]/@href').extract()[0] 

      yield item 

if __name__ == '__main__': 

    settings = dict() 
    settings['USER_AGENT'] = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
    settings['ITEM_PIPELINES'] = {'JsonWriterPipeline': 1} 

    process = CrawlerProcess(settings=settings) 

    spider = StackSpider() 
    process.crawl(spider) 
    process.start() 

, 코드 자체에 포함 나는 두 가지 설정이 우선이다 USER_AGENT 및 ITEM_PIPELINES. 그러나 JsonWriterPipeline 클래스의 디버그 지점을 설정하면 코드가 실행되고 디버그 지점에 도달하지 못하므로 사용자 지정 파이프 라인이 사용되지 않습니다.

어떻게이 문제를 해결할 수 있습니까?

답변

0

치료 1.3.2 및 Python 3.5를 사용하여 스크립트를 실행할 때 2 개의 오류가 발생합니다.

첫째 :

Unhandled error in Deferred: 
2017-02-21 13:47:23 [twisted] CRITICAL: Unhandled error in Deferred: 

2017-02-21 13:47:23 [twisted] CRITICAL: 
Traceback (most recent call last): 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/utils/misc.py", line 39, in load_object 
    dot = path.rindex('.') 
ValueError: substring not found 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/twisted/internet/defer.py", line 1301, in _inlineCallbacks 
    result = g.send(result) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/crawler.py", line 72, in crawl 
    self.engine = self._create_engine() 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/crawler.py", line 97, in _create_engine 
    return ExecutionEngine(self, lambda _: self.stop()) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/core/engine.py", line 70, in __init__ 
    self.scraper = Scraper(crawler) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/core/scraper.py", line 71, in __init__ 
    self.itemproc = itemproc_cls.from_crawler(crawler) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/middleware.py", line 58, in from_crawler 
    return cls.from_settings(crawler.settings, crawler) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/middleware.py", line 34, in from_settings 
    mwcls = load_object(clspath) 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/scrapy/utils/misc.py", line 41, in load_object 
    raise ValueError("Error loading object '%s': not a full path" % path) 
ValueError: Error loading object 'JsonWriterPipeline': not a full path 

당신은 파이프 라인에 대한 전체 경로를 제공해야합니다. 여기 예를 들어, __main__ 네임 스페이스는 작동합니다

settings['ITEM_PIPELINES'] = {'__main__.JsonWriterPipeline': 1} 

둘째, 당신의 부하를 얻을 수 (위의이 파이프 라인 클래스 수정과) : 당신이 바이트로 쓰기 항목 JSON으로 해결할 수

2017-02-21 13:47:52 [scrapy.core.scraper] ERROR: Error processing {'title': 'Apply Remote Commits to a Local Pull Request', 
'url': '/questions/42367647/apply-remote-commits-to-a-local-pull-request'} 
Traceback (most recent call last): 
    File "/home/paul/.virtualenvs/scrapy13.py3/lib/python3.5/site-packages/twisted/internet/defer.py", line 653, in _runCallbacks 
    current.result = callback(current.result, *args, **kw) 
    File "test.py", line 20, in process_item 
    self.file.write(line) 
TypeError: a bytes-like object is required, not 'str' 

을 :

def process_item(self, item, spider): 
     line = json.dumps(dict(item)) + "\n" 
     self.file.write(line.encode('ascii')) 
     return item 
+0

실제로 '{'__main __. JsonWriterPipeline ': 1}'이 문제 였고 두 번째 오류는 json에 대해'wb '대신'w '를 호출해야하기 때문에 두 번째 오류입니다. –

관련 문제