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
クラスのデバッグポイントを設定すると、コードが実行され、デバッグポイントに到達することはないので、カスタムパイプラインは使用されていないことがわかります。
どのようにこれを修正できますか?
実際に '{'__main__。JsonWriterPipeline':1}'が問題で、2番目のエラーは、openコマンドがjsonのために 'wb'の代わりに 'w'を呼び出さなければならないためです –