У меня есть кусок кода для тестирования. Моя цель - использовать scrapy без необходимости вызывать команду 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
, я вижу, что код выполнен и точки отладки никогда не достигнуты, поэтому настраиваемый конвейер не используется.
Как это можно исправить?
Действительно проблема '{'__main __. JsonWriterPipeline': 1}' была проблемой, а вторая ошибка заключается в том, что команда open должна вызывать 'w' вместо 'wb' для json –