Scrapy Splash: улучшите парсинг веб-страниц с помощью рендеринга JavaScript

Парсинг веб-сайтов – ценный метод извлечения данных с веб-сайтов. Scrapy — это популярная платформа Python, используемая для парсинга веб-страниц, предоставляющая мощные инструменты и гибкость. Однако при работе с динамическими веб-сайтами, которые в значительной степени полагаются на JavaScript для рендеринга контента, традиционные методы очистки могут оказаться неэффективными. Вот тут-то и пригодится Scrapy Splash. В этой статье мы рассмотрим различные методы и примеры кода, позволяющие использовать Scrapy Splash для эффективного парсинга веб-страниц с рендерингом JavaScript.

  1. Установка Scrapy Splash:
    Чтобы начать, нам нужно установить Scrapy Splash. Откройте командную строку или терминал и выполните следующую команду:

    pip install scrapy-splash
  2. Настройка промежуточного программного обеспечения Splash:
    Для работы Scrapy Splash требуется промежуточное программное обеспечение. Добавьте следующий код в файл settings.py вашего проекта Scrapy:

    DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
  3. Настройка Scrapy Splash:
    Далее нам нужно настроить Scrapy Splash. Добавьте следующий код в файл settings.py вашего проекта Scrapy:

    SPLASH_URL = 'http://localhost:8050'
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
  4. Написание Scrapy Splash Spider:
    Теперь давайте создадим Scrapy Splash Spider. Этот паук будет использовать Scrapy Splash для рендеринга JavaScript и извлечения данных с веб-сайта. Вот пример:

    import scrapy
    from scrapy_splash import SplashRequest
    class MySpider(scrapy.Spider):
    name = 'my_spider'
    def start_requests(self):
        yield SplashRequest(url='http://example.com', callback=self.parse)
    def parse(self, response):
        # Extract data from the rendered page
        # ...
        # Follow links or perform further scraping
        # ...
  5. Передача аргументов в Scrapy Splash:
    Вы можете передавать аргументы в Scrapy Splash для большей настройки. Вот пример передачи аргументов в SplashRequest:

    yield SplashRequest(
    url='http://example.com',
    callback=self.parse,
    endpoint='render.json',
    args={'wait': 0.5}
    )
  6. Использование сценариев Lua:
    Scrapy Splash позволяет выполнять собственные сценарии Lua для более сложных задач очистки. Вот пример использования сценария Lua для нажатия кнопки и загрузки дополнительного контента:

    script = '''
    function main(splash, args)
    assert(splash:go(args.url))
    assert(splash:wait(0.5))
    assert(splash:runjs("document.getElementById('load-more-button').click()"))
    assert(splash:wait(0.5))
    return {
        html = splash:html(),
        cookies = splash:get_cookies(),
    }
    end
    '''
    yield SplashRequest(
    url='http://example.com',
    callback=self.parse,
    endpoint='execute',
    args={'lua_source': script}
    )

Scrapy Splash – мощный инструмент для очистки веб-страниц, особенно при работе с веб-сайтами, которые в значительной степени полагаются на рендеринг JavaScript. В этой статье мы рассмотрели различные методы и предоставили примеры кода, которые помогут вам эффективно использовать Scrapy Splash. Включив рендеринг JavaScript в рабочий процесс парсинга, вы сможете более эффективно и точно извлекать данные с динамических веб-сайтов.