Scrapy Nameko DependencyProvider不抓取页面
问题描述:
我正在使用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提供商无法抓取页面时,要弄清楚。请纠正我要出错的地方。
答
Tarun的评论是正确的。 Nameko使用Eventlet进行并发,而Scrapy使用Twisted。这两者都以类似的方式工作:有一个主线程(Twisted中的Reactor)调度所有其他工作,作为普通Python线程调度程序的替代方法。不幸的是,这两个系统不能互操作。
如果你真的想整合滑子蘑和Scrapy,最好的办法是使用一个单独的进程Scrapy,作为这些问题的答案:
+0
它确实为scrapy使用了不同的过程。 谢谢马特和塔伦。 干杯! –
你想从中获得什么?暂时保留实施,您的实际要求是什么? –
我想这是对nameko服务方法的依赖,这意味着nameko微服务框架将调用ScrapyDependency()。crawl()来处理请求(web抓取请求)并返回结果。问题是这样使用时不会刮页面。 –
您正在混合nameko和扭曲的服务器,不知道他们凝胶如何。 –