Scrapy & Splash ничего не возвращая со страницы javascript - PullRequest
0 голосов
/ 11 мая 2018

В настоящее время я слежу за официальными документами, а также за видео на Youtube, чтобы очистить страницы javascript с помощью Scrapy и их службы рендеринга js splash.

https://splash.readthedocs.io/en/stable/install.html

https://www.youtube.com/watch?v=VvFC93vAB7U

На моем Mac установлен Docker, и я запускаю его в соответствии с официальными инструкциями по документации:

docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

Затем я взял этот демонстрационный код из видео Youtube:

import scrapy
from scrapy_splash import SplashRequest

class Demo_js_pider(scrapy.Spider):
    name = 'jsdemo'

    def start_request(self):
        yield SplashRequest(
            url = 'http://quotes.toscrape.com/js',
            callback = self.parse,
        )

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                'text': quote.css("span.text::text").extract.first(),
                'author': quote.css("small.author::text").extract_first(),
                'tags': quote.css("div.tags > a.tag::text").extract(),
            }

это выполняется с помощью 'scrapy crawl jsdemo' (у меня уже установлена ​​программа scrapy в локальном virtualenv (python 3.6.4) и все правильные модули, включая модуль scrapy-splash)

Однако, когда он запускается, ничего не возвращается, кроме приведенного ниже вывода и сообщений об ошибках:

2018-05-11 12:42:27 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2018-05-11 12:42:27 [scrapy.core.engine] INFO: Spider opened
2018-05-11 12:42:27 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-05-11 12:42:27 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-05-11 12:42:27 [scrapy.core.engine] INFO: Closing spider (finished)
2018-05-11 12:42:27 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 5, 11, 5, 42, 27, 552500),
 'log_count/DEBUG': 1,
 'log_count/INFO': 7,
 'memusage/max': 49602560,
 'memusage/startup': 49602560,
 'start_time': datetime.datetime(2018, 5, 11, 5, 42, 27, 513940)}
2018-05-11 12:42:27 [scrapy.core.engine] INFO: Spider closed (finished)

вышеприведенное урезано, это ссылка на полный вывод: https://pastebin.com/yQVp3n6z

Я пробовал это несколько раз сейчас. Я также попытался запустить базовый html-скребок из основного учебника по Scrapy, и он запустился очень хорошо, поэтому я предполагаю, что ошибка где-то в Splash?

Я заметил это и в выводе:

DEBUG: Telnet console listening on 127.0.0.1:6023

это правильно? Команды docker запускают Splash на telnet 5023, я попытался изменить это значение на 6023, и это ничего не изменило. Я также попытался установить TELENTCONSOLE_PORT в настройках 5023 и 6023, и это просто выдает эти ошибки, когда я пытаюсь запустить scrapy crawl:

Traceback (most recent call last):
  File "/Users/david/Documents/projects/cryptoinfluencers/env/bin/scrapy", line 11, in <module>
    sys.exit(execute())
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/cmdline.py", line 150, in execute
    _run_print_help(parser, _run_command, cmd, args, opts)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/cmdline.py", line 90, in _run_print_help
    func(*a, **kw)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/cmdline.py", line 157, in _run_command
    cmd.run(args, opts)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/commands/crawl.py", line 57, in run
    self.crawler_process.crawl(spname, **opts.spargs)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/crawler.py", line 170, in crawl
    crawler = self.create_crawler(crawler_or_spidercls)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/crawler.py", line 198, in create_crawler
    return self._create_crawler(crawler_or_spidercls)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/crawler.py", line 203, in _create_crawler
    return Crawler(spidercls, self.settings)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/crawler.py", line 55, in __init__
    self.extensions = ExtensionManager.from_crawler(self)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/middleware.py", line 58, in from_crawler
    return cls.from_settings(crawler.settings, crawler)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/middleware.py", line 36, in from_settings
    mw = mwcls.from_crawler(crawler)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/extensions/telnet.py", line 53, in from_crawler
    return cls(crawler)
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/extensions/telnet.py", line 46, in __init__
    self.portrange = [int(x) for x in crawler.settings.getlist('TELNETCONSOLE_PORT')]
  File "/Users/david/Documents/projects/cryptoinfluencers/env/lib/python3.6/site-packages/scrapy/settings/__init__.py", line 182, in getlist
    return list(value)
TypeError: 'int' object is not iterable

На данный момент я не уверен, что еще мне нужно изменить ...

1 Ответ

0 голосов
/ 11 мая 2018

У вас есть простая опечатка: start_request() против start_requests()

Также у вас есть другая опечатка extract.first()

Вот рабочий код:

import scrapy
from scrapy_splash import SplashRequest

class Demo_js_pider(scrapy.Spider):
    name = 'jsdemo'

    def start_requests(self):
        yield SplashRequest(
            url = 'http://quotes.toscrape.com/js',
            callback = self.parse,
        )

    def parse(self, response):
        print("Parsing...\n")
        for quote in response.css("div.quote"):
            yield {
                'text': quote.css("span.text::text").extract_first(),
                'author': quote.css("small.author::text").extract_first(),
                'tags': quote.css("div.tags > a.tag::text").extract(),
            }
...