2017-02-21 15 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() 

ご覧のとおり、コードは自己完結型であると私は2つの設定を上書きします。 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}'が問題で、2番目のエラーは、openコマンドがjsonのために 'wb'の代わりに 'w'を呼び出さなければならないためです –

関連する問題