2017-09-03 93 views
1

我正在使用scrapy创建一个示例web抓取器作为Nameko的依赖提供者,但它不抓取任何页面。以下是密码Scrapy Nameko DependencyProvider不抓取页面

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() 

这里是日志。

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) 

在日志中,我们可以看到它没有抓取单页,预计抓取一个页面。

鉴于,如果我创建一个常规的CrawlerRunner并抓取页面,我会将预期结果返回为{'heading': 'Example Domain'}。下面是代码:

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() 

它已经两天这个问题挣扎,我无法用scrapy履带,滑菇dependecy提供商无法抓取页面时,要弄清楚。请纠正我要出错的地方。

+0

你想从中获得什么?暂时保留实施,您的实际要求是什么? –

+0

我想这是对nameko服务方法的依赖,这意味着nameko微服务框架将调用ScrapyDependency()。crawl()来处理请求(web抓取请求)并返回结果。问题是这样使用时不会刮页面。 –

+0

您正在混合nameko和扭曲的服务器,不知道他们凝胶如何。 –

回答

1

Tarun的评论是正确的。 Nameko使用Eventlet进行并发,而Scrapy使用Twisted。这两者都以类似的方式工作:有一个主线程(Twisted中的Reactor)调度所有其他工作,作为普通Python线程调度程序的替代方法。不幸的是,这两个系统不能互操作。

如果你真的想整合滑子蘑和Scrapy,最好的办法是使用一个单独的进程Scrapy,作为这些问题的答案:

+0

它确实为scrapy使用了不同的过程。 谢谢马特和塔伦。 干杯! –