Scrapy-splash - выполняет ли splash: go (url) в lua_script запрос GET снова? - PullRequest
0 голосов
/ 23 января 2019

Я новичок в Scrapy-splash и пытаюсь почистить ленивого datatable, который представляет собой таблицу с нумерацией страниц AJAX.

Итак, мне нужно загрузить веб-сайт, дождаться выполнения JS, получить html таблицы и затем нажать кнопку «Далее» на пагинации.

Мой подход работает, но я боюсь, что запрашиваю веб-сайт два раза.

Первый раз, когда я выдаю SplashRequest, а затем, когда lua_script выполняется.

Это правда? Если да, то как заставить его выполнить запрос только один раз?

class JSSpider(scrapy.Spider):
    name = 'js_spider'
    script = """
    function main(splash, args)
        splash:go(args.url)
        splash:wait(0.5)
        local page_one = splash:evaljs("$('#example').html()")
        splash:evaljs("$('#example_next').click()")
        splash:wait(2)
        local page_two = splash:evaljs("$('#example').html()")
        return {page_one=page_one,page_two=page_two}
    end"""

    def start_requests(self):
        url = f"""https://datatables.net/examples/server_side/defer_loading.html"""
        yield SplashRequest(url, endpoint='execute',callback=self.parse, args={'wait': 0.5,'lua_source':self.script,'url':url})

    def parse(self, response):
        # assert isinstance(response, SplashTextResponse)
        page_one = response.data.get('page_one',None)
        page_one_root = etree.fromstring(page_one, HTMLParser())
        page_two = response.data.get('page_two',None)
        page_two_root = etree.fromstring(page_one, HTMLParser())

EDIT

Также я бы хотел подождать, пока AJAX будет выполнен лучше, чем просто splash:wait(2). Можно ли как-то подождать, пока таблица поменяется? Идеально с некоторым таймаутом.

1 Ответ

0 голосов
/ 24 января 2019

Скрипт Lua очень буквальный - если у вас есть 1 splash:go, то один работник делает один запрос.
С вашим сканером все в порядке.

Бессмысленно придираться: ваш паук подключаетсяк работнику через http, поэтому в теории делается два запроса: 1-й для службы-заставки и 2-й для цели для работника-службы.

...