CrawlerRunner не сканирует страницы с помощью крючка - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь запустить Scrapy из скрипта с помощью CrawlerRunner () для запуска в AWS Lambda.

Я наблюдал в Stackoverflow решение с библиотекой вязания крючком, но оно у меня не работает.

Ссылки: StackOverflow 1 StackOverflow 2

Это код:

import scrapy
from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_settings
from scrapy.utils.log import configure_logging

# From response in Stackoverflow: https://stackoverflow.com/questions/41495052/scrapy-reactor-not-restartable
from crochet import setup
setup()

class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]

        print ('Scrapped page n', page)


    def closed(self, reason):
        print ('Closed Spider: ', reason)


def run_spider():

    configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})

    crawler = CrawlerRunner(get_project_settings())
    crawler.crawl(QuotesSpider)        


run_spider()

, и когда я выполняю скрипт, он возвращаетэтот журнал:

INFO: Overridden settings: {}
2019-01-28 16:49:52 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.logstats.LogStats']
2019-01-28 16:49:52 [scrapy.middleware] INFO: 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']
2019-01-28 16:49:52 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2019-01-28 16:49:52 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2019-01-28 16:49:52 [scrapy.core.engine] INFO: Spider opened
2019-01-28 16:49:52 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2019-01-28 16:49:52 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023

Почему сканер не сканирует Spider?Я использую Mac и Python 3.7.1.

Любая помощь?Я очень ценю вашу поддержку.

1 Ответ

0 голосов
/ 04 августа 2019

Я не уверен, что вы уже решили эту проблему, но в любом случае.

Без использования Вязание крючком , он мог бы написать скребок, используя Scrapy 's CrawlerRunner следующим образом.

import scrapy
from scrapy.crawler import CrawlerRunner
from twisted.internet import reactor

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url)
    def parse(self, response):
        page = response.url.split('/')[-2]
        print ("Scrapped page n", page)
    def closed(self, reason):
        print ("Closed Spider: ", reason)

def run_spider():
    crawler = CrawlerRunner()
    d = crawler.crawl(QuotesSpider)
    d.addCallback(lambda _: reactor.stop())
    reactor.run()

if __name__ == '__main__':
    run_spider()

Если вы хотите использовать Crochet с Scrapy's CrawlerRunner по любым причинам, тогда

  1. оберните вашу функцию run_spiderс декоратором вязания крючком @ wait_for
  2. и верните отложено из декорированной функции run_spider.

Попробуйте это!

from crochet import setup, wait_for
import scrapy
from scrapy.crawler import CrawlerRunner

setup()

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url)
    def parse(self, response):
        page = response.url.split('/')[-2]
        print ("Scrapped page n", page)
    def closed(self, reason):
        print ("Closed Spider: ", reason)

@wait_for(10)
def run_spider():
    crawler = CrawlerRunner()
    d = crawler.crawl(QuotesSpider)
    return d

if __name__ == '__main__':
    run_spider()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...