2017-09-03 7 views
1

Scale을 사용하여 Nameko 종속 공급자로 샘플 웹 크롤러를 만들었지 만 어떤 페이지도 크롤링하지 않습니다. 다음은 코드입니다.스킨 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() 

그리고 여기에 로그가 있습니다.


로그에서
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) 

우리가 한 페이지를 크롤링 할 것으로 예상 한 페이지를 크롤링하지 않았다 그것을 볼 수


Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 
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 

.

반면에 일반 CrawlerRunner을 만들고 페이지를 크롤링하면 예상 결과가 {'heading': 'Example Domain'}으로 되돌아옵니다. 아래는 코드입니다

그것은이 문제로 어려움을 겪고 며칠되고, 내가 페이지를 크롤링 할 수없는 나도 팽나무 버섯 실행 종속 공급자로 scrapy 크롤러를 사용하는 경우 알아낼 수 없어요 것
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() 

. 내가 잘못 가고있는 곳을 바로 잡아주세요.

+0

이걸로 무엇을 성취하려고합니까? 구현을 현재의 상태로 두십시오. 실제 요구 사항은 무엇입니까? –

+0

나는 nameko 서비스에 대한 의존성으로 이것을 원한다. 이는 nameko 마이크로 서비스 프레임 워크가 요청 (웹 스크래핑 요청)을 처리하고 결과를 반환하기 위해'ScrapyDependency(). crawl()'을 호출 할 것임을 의미한다. 문제는이 방법으로 페이지를 긁어 모으지 않는 것입니다. –

+0

네임코와 트위스트 서버를 섞어서 섞어서 젤이 얼마나 잘 자르지는 못했습니다. –

답변

1

Tarun의 코멘트는 정확합니다. Nameko는 병행성에 Eventlet을 사용하고 Scrapy는 Twisted를 사용합니다. 두 가지 모두 비슷한 방식으로 작동합니다. 일반 스레드 (Reactor, Twisted에서)는 일반적인 Python 스레드 스케줄러 대신 다른 모든 작업을 스케줄합니다. 불행히도 두 시스템은 상호 운용되지 않습니다.

당신이 정말로 나도 팽나무 버섯과 Scrapy을 통합하려는 경우

, 당신의 가장 좋은 방법은 이러한 질문에 대한 답변에서와 같이 Scrapy에 대해 별도의 프로세스를 사용하는 것입니다

+0

그것은 치료를위한 다른 과정으로 작동했습니다. Matt와 Tarun에게 감사드립니다. 건배! –