2017-09-03 1 views
1

J'utilise scrapy pour créer un exemple de moteur de balayage Web en tant que fournisseur de dépendances Nameko, mais il n'analyse aucune page. Ci-dessous le codeScrapy Nameko DependencyProvider n'analyse pas la page

import scrapy 
from scrapy import crawler 
from nameko import extensions 
from twisted.internet import reactor 


class TestSpider(scrapy.Spider): 
    name = 'test_spider' 
    result = None 

    def parse(self, response): 
     TestSpider.result = { 
      'heading': response.css('h1::text').extract_first() 
     } 


class ScrapyDependency(extensions.DependencyProvider): 

    def get_dependency(self, worker_ctx): 
     return self 

    def crawl(self, spider=None): 
     spider = TestSpider() 
     spider.name = 'test_spider' 
     spider.start_urls = ['http://www.example.com'] 
     self.runner = crawler.CrawlerRunner() 
     self.runner.crawl(spider) 
     d = self.runner.join() 
     d.addBoth(lambda _: reactor.stop()) 
     reactor.run() 
     return spider.result 

    def run(self): 
     if not reactor.running: 
      reactor.run() 

et voici le journal.

Enabled extensions: 
['scrapy.extensions.memusage.MemoryUsage', 
'scrapy.extensions.logstats.LogStats', 
'scrapy.extensions.telnet.TelnetConsole', 
'scrapy.extensions.corestats.CoreStats'] 
Enabled downloader middlewares: 
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 
'scrapy.downloadermiddlewares.retry.RetryMiddleware', 
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 
'scrapy.downloadermiddlewares.stats.DownloaderStats'] 
Enabled spider middlewares: 
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 
'scrapy.spidermiddlewares.referer.RefererMiddleware', 
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 
'scrapy.spidermiddlewares.depth.DepthMiddleware'] 
Enabled item pipelines: 
[] 
Spider opened 

Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 

Closing spider (finished) 
Dumping Scrapy stats: 
{'finish_reason': 'finished', 
'finish_time': datetime.datetime(2017, 9, 3, 12, 41, 40, 126088), 
'log_count/INFO': 7, 
'memusage/max': 59650048, 
'memusage/startup': 59650048, 
'start_time': datetime.datetime(2017, 9, 3, 12, 41, 40, 97747)} 
Spider closed (finished) 

Dans le journal, nous pouvons le voir ne pas analyser une seule page, devrait explorer une page.

Considérant que, si je crée un CrawlerRunner régulière et que j'analyse la page, le résultat attendu est de nouveau {'heading': 'Example Domain'}. Voici le code:

import scrapy 


class TestSpider(scrapy.Spider): 
    name = 'test_spider' 
    start_urls = ['http://www.example.com'] 
    result = None 

    def parse(self, response): 
     TestSpider.result = {'heading': response.css('h1::text').extract_first()} 

def crawl(): 
    runner = crawler.CrawlerRunner() 
    runner.crawl(TestSpider) 
    d = runner.join() 
    d.addBoth(lambda _: reactor.stop()) 
    reactor.run() 

if __name__ == '__main__': 
    crawl() 

Cela fait deux jours aux prises avec ce problème, je suis incapable de comprendre lors de l'utilisation crawler scrapy comme nameko fournisseur de dependecy incapable de ramper pages. S'il vous plaît, corrigez-moi là où je me trompe.

+0

Qu'est-ce que vous essayez d'obtenir de cela? Laissez la mise en œuvre pour l'instant, quelle est votre exigence actuelle? –

+0

Je voudrais que cela soit une dépendance à la méthode de service nameko, ce qui signifie que le framework microservices nameko appellera 'ScrapyDependency(). Crawl()' pour traiter la requête (demande de scrap web) et retourner le résultat. Le problème est qu'il ne racle pas la page lorsqu'il est utilisé de cette façon. –

+0

Vous mélangez un serveur nommé et tordu, pas sûr de savoir comment ils gelent. –

Répondre

1

Le commentaire de Tarun est correct. Nameko utilise Eventlet pour la concurrence, alors que Scrapy utilise Twisted. Ces deux fonctionnent de la même manière: il y a un thread principal (le Reactor, dans Twisted) qui planifie tous les autres travaux, comme une alternative au planificateur de threads Python normal. Malheureusement, les deux systèmes n'interopèrent pas.

Si vous voulez vraiment intégrer Nameko et Scrapy, votre meilleur pari est d'utiliser un processus distinct pour Scrapy, comme dans les réponses à ces questions:

+0

Il a travaillé avec un processus différent pour le scrapy. Merci Matt et Tarun. À la votre! –