2013-09-13 3 views
5

Я пытаюсь запустить scrapy spider, который отлично работает с использованием scrapy crall single, но я не могу запустить его внутри скрипта python.Scrapy run from script not working

Мне известно, что документы сообщают, как: https://scrapy.readthedocs.org/en/0.18/topics/practices.html, и я также прочитал этот уже ответ на вопрос (How to run Scrapy from within a Python script), но я не могу сделать эту работу.

Основная проблема заключается в том, что метод SingleBlogSpider.parse никогда не выполняется, в то время как start_requests выполняется

Здесь код и вывод из работы этого сценария. Я также попытался переместить выполнение в отдельный файл, но это же произойдет.

from urlparse import urlparse 
from scrapy.http import Request 
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 


class SingleBlogSpider(BaseSpider): 
    name = 'single' 

    def __init__(self, **kwargs): 
     super(SingleBlogSpider, self).__init__(**kwargs) 

     url = kwargs.get('url') or kwargs.get('domain') or 'seaofshoes.com' 
     if not url.startswith('http://') and not url.startswith('https://'): 
      url = 'http://%s/' % url 

     self.url = url 
     self.allowed_domains = [urlparse(url).hostname.lstrip('www.')] 
     self.link_extractor = SgmlLinkExtractor() 
     self.cookies_seen = set() 

     print 0, self.url 

    def start_requests(self): 
     print '1', self.url 
     return [Request(self.url, callback=self.parse)] 

    def parse(self, response): 
     print '2' 
     # Actual scraper code, that is never executed 

if __name__ == '__main__': 
    from twisted.internet import reactor 
    from scrapy.crawler import Crawler 
    from scrapy.settings import Settings 
    from scrapy import log, signals 

    spider = SingleBlogSpider(domain='scrapinghub.com') 

    crawler = Crawler(Settings()) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configure() 
    crawler.crawl(spider) 
    crawler.start() 

    log.start() 
    reactor.run() 

Выход:

0 http://scrapinghub.com/ 
1 http://scrapinghub.com/ 
2013-09-13 14:21:46-0500 [single] INFO: Closing spider (finished) 
2013-09-13 14:21:46-0500 [single] INFO: Dumping Scrapy stats: 
    {'downloader/request_bytes': 221, 
     'downloader/request_count': 1, 
     'downloader/request_method_count/GET': 1, 
     'downloader/response_bytes': 9403, 
     'downloader/response_count': 1, 
     'downloader/response_status_count/200': 1, 
     'finish_reason': 'finished', 
     'finish_time': datetime.datetime(2013, 9, 13, 19, 21, 46, 563184), 
     'response_received_count': 1, 
     'scheduler/dequeued': 1, 
     'scheduler/dequeued/memory': 1, 
     'scheduler/enqueued': 1, 
     'scheduler/enqueued/memory': 1, 
     'start_time': datetime.datetime(2013, 9, 13, 19, 21, 46, 328961)} 
2013-09-13 14:21:46-0500 [single] INFO: Spider closed (finished) 

Программа никогда не получает SingleBlogSpider.parse и печатает '2', так что ничего не ползет. Но, как вы можете видеть на выходе, он делает запрос, поэтому не уверен, что происходит.

Scrapy версия == 0.18-2

Я действительно не могу обнаружить ошибку и помощь очень ценится.

Спасибо!

ответ

3

parse() фактически выполняется. Просто печать не отображается.

Просто, чтобы проверить, поставить a=b в parse():

def parse(self, response): 
    a = b 

И вы увидите exceptions.NameError: global name 'b' is not defined.

+0

Ничего себе, я чувствую себя действительно глупо. , если кто-то заинтересован в разрешении печати, теперь просто нужно удалить строку 'log.start()'. Спасибо! – danielfrg

+0

@ dfrodriguez143 да, спасибо за обмен. – alecxe

+0

После запуска журнала вы не можете печатать на консоли. Теперь вопрос в том, как получить возможность печатать на консоли после этого? – Medeiros

1

Я считаю, что когда вы говорите, что вы «не можете заставить его работать со сценарием», вы на самом деле имеете в виду «не может заставить искателя генерировать выходные файлы». Это пример bug в примере кода документации. Измените свой код на это.

if __name__ == '__main__': 
    from twisted.internet import reactor 
    from scrapy.crawler import Crawler 
    from scrapy import log, signals 
    from scrapy.utils.project import get_project_settings 

    spider = SingleBlogSpider(domain='scrapinghub.com') 
    settings = get_project_settings() 
    crawler = Crawler(settings) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configure() 
    crawler.crawl(spider) 
    crawler.start() 

    log.start() 
    reactor.run() 

Для дальнейшего ознакомления ознакомьтесь с этим answer.