2014-12-19 2 views
3

Я пытаюсь запустить Scrapy из сценария, и я не могу получить программу для создания файла экспортаScrapy from Script. Не будет экспортировать данные

Я пытался получить файл для экспорта двумя различными способами:

  1. С трубопроводом
  2. С экспортом корма.

Оба эти способа работают, когда я запускаю scrapy из командной строки, но не работают, когда запускаю scrapy из сценария.

Я не одинок с этой проблемой. Вот еще два других вопроса без ответа. Я не заметил их до тех пор, пока я не разместил вопрос.

  1. JSON not working in scrapy when calling spider through a python script?
  2. Calling scrapy from a python script not creating JSON output file

Вот мой код для запуска Scrapy из сценария. Он включает в себя настройки для печати выходного файла как с конвейером, так и с экспортером кормов.

from twisted.internet import reactor 

from scrapy import log, signals 
from scrapy.crawler import Crawler 
from scrapy.xlib.pydispatch import dispatcher 
import logging 

from external_links.spiders.test import MySpider 
from scrapy.utils.project import get_project_settings 
settings = get_project_settings() 

#manually set settings here 
settings.set('ITEM_PIPELINES',{'external_links.pipelines.FilterPipeline':100,'external_links.pipelines.CsvWriterPipeline':200},priority='cmdline') 
settings.set('DEPTH_LIMIT',1,priority='cmdline') 
settings.set('LOG_FILE','Log.log',priority='cmdline') 
settings.set('FEED_URI','output.csv',priority='cmdline') 
settings.set('FEED_FORMAT', 'csv',priority='cmdline') 
settings.set('FEED_EXPORTERS',{'csv':'external_links.exporter.CsvOptionRespectingItemExporter'},priority='cmdline') 
settings.set('FEED_STORE_EMPTY',True,priority='cmdline') 

def stop_reactor(): 
    reactor.stop() 

dispatcher.connect(stop_reactor, signal=signals.spider_closed) 
spider = MySpider() 
crawler = Crawler(settings) 
crawler.configure() 
crawler.crawl(spider) 
crawler.start() 
log.start(loglevel=logging.DEBUG) 
log.msg('reactor running...') 
reactor.run() 
log.msg('Reactor stopped...') 

В после того, как я запускаю этот код говорит журнал: «Stored фид CSV (341 пунктов), в: output.csv», но нет output.csv можно найти.

вот мой канал код экспортера:

settings = get_project_settings() 

#manually set settings here 
settings.set('ITEM_PIPELINES', {'external_links.pipelines.FilterPipeline':100,'external_links.pipelines.CsvWriterPipeline': 200},priority='cmdline') 
settings.set('DEPTH_LIMIT',1,priority='cmdline') 
settings.set('LOG_FILE','Log.log',priority='cmdline') 
settings.set('FEED_URI','output.csv',priority='cmdline') 
settings.set('FEED_FORMAT', 'csv',priority='cmdline') 
settings.set('FEED_EXPORTERS',{'csv':'external_links.exporter.CsvOptionRespectingItemExporter'},priority='cmdline') 
settings.set('FEED_STORE_EMPTY',True,priority='cmdline') 


from scrapy.contrib.exporter import CsvItemExporter 


class CsvOptionRespectingItemExporter(CsvItemExporter): 

    def __init__(self, *args, **kwargs): 
     delimiter = settings.get('CSV_DELIMITER', ',') 
     kwargs['delimiter'] = delimiter 
     super(CsvOptionRespectingItemExporter, self).__init__(*args, **kwargs) 

Вот мой код трубопровода:

import csv 

class CsvWriterPipeline(object): 

def __init__(self): 
    self.csvwriter = csv.writer(open('items2.csv', 'wb')) 

def process_item(self, item, spider): #item needs to be second in this list otherwise get spider object 
    self.csvwriter.writerow([item['all_links'], item['current_url'], item['start_url']]) 

    return item 
+0

ли вы когда-нибудь понять это? – ccdpowell

ответ

1

У меня была такая же проблема.

Вот что работает для меня:

  1. Помещенный экспорт URI в settings.py

    FEED_URI='file:///tmp/feeds/filename.jsonlines'

  2. Создать scrape.py скрипт рядом с вашим scrapy.cfg со следующим содержанием

    
    from scrapy.crawler import CrawlerProcess 
    from scrapy.utils.project import get_project_settings 
    
    
    process = CrawlerProcess(get_project_settings()) 
    
    process.crawl('yourspidername') #'yourspidername' is the name of one of the spiders of the project. 
    process.start() # the script will block here until the crawling is finished 
    
    
  3. Пробег: python scrape.py

Результат: создается файл.

Примечание: У меня нет трубопроводов в моем проекте. Поэтому не уверен, будет ли конвейер фильтроваться или нет ваших результатов.

Также: Вот общие подводные камни раздел на docs, которые помогли мне