Spla sh Сервер работает с командой терминала Scrapy, но не из скрипта - PullRequest
0 голосов
/ 08 апреля 2020

Я недавно пытался интегрировать скрапбукинг, чтобы сделать некоторую чистку для моей веб-страницы и сравнить результаты с содержимым моей базы данных. В настоящее время я знакомлюсь с основами scrapy и, поскольку целевые URL имеют файлы javascript для интерпретации, я также установил сервер spla sh.

Использование моего кода с командой scrapy crawl <spidername> работает как Ожидается: я получаю весь DOM для страницы. Но так как я хочу вызвать паука из задач сельдерея, а также использовать конвейер scrapy для обновления моей модели, я хочу выполнить код из сценария следующим образом:

runner = CrawlerProcess()
runner.crawl(emdoku_spider)
runner.start(stop_after_crawl=True)

Пока он просто находится в одиночном скрипте для целей тестирования и пишет DOM только в текстовом файле для меня, чтобы проверить результат. (Конечно, я мог бы начать новый процесс с python, сохранить результаты и затем обработать эти файлы, но я хотел бы иметь чистое решение). Выполнение кода, показанного в приведенном ниже коде, из IDE (spyder) не работает. Ответ - это просто заголовок, тело и имя javascript файлов, которые нужно открыть.

Весь скрипт выглядит следующим образом и следует коду из учебников по scrapy (используя SplashRequest):

import scrapy
from scrapy import Request, Spider
from scrapy.spiders import CrawlSpider, Rule
from scrapy.crawler import CrawlerProcess
import scrapy_splash
from scrapy_splash import SplashRequest
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from twisted.internet import reactor
from urllib.parse import urlencode


class emdoku_spider(Spider):
    name=<spider name>

    def start_requests(self):
        urls = self.generate_start_urls(<head url>)
        for url in urls:
            yield SplashRequest(url, self.parse,
                                args={
                                    'wait': 5,
                                    'html': 1,
                                },
                                endpoint='render.html', # optional; default is render.html
                                magic_response=True,
                                dont_process_response=True,
                                dont_send_headers=True,
                                )



    def generate_start_urls(self, base_url):
        urls = []
        for i in range(2):
            if i > 0: #page 0 is just a strange test page
                urls.append("".join([base_url, str(i)]))
        return urls


    def parse(self, response):
        f = open(<file destnination>, 'w')
        f.write(str(response.css('body').getall()))
        f.close()
        pass


runner = CrawlerProcess()
runner.crawl(emdoku_spider)
runner.start(stop_after_crawl=True)
...