Scrapy Splash нажмите на ссылку с помощью javascript href - PullRequest
0 голосов
/ 16 февраля 2019

Я использую Scrapy Splash для очистки страницы, на которой есть такой элемент:

Страница 1 из 349 |1 |2 |3 |4 |5 |6 |7 |8 |9 |10 |Далее ›

Я хочу« кликнуть »на якорь с текстом« Далее »и выполнить JavaScript для получения следующей страницы.

Вот как выглядит мой скребок:

script = """
    function main(splash)
        splash:init_cookies(splash.args.cookies)
        assert(splash:go(splash.args.url))
        splash:wait(0.5)
        local element = splash:select('div.result-content-columns div.result-title')
        local bounds = element:bounds()
        element:mouse_click{x=bounds.width/2, y=bounds.height/2}

         return {
            cookies = splash:get_cookies(),
            html = splash:html()
            }
    end
"""

class MySpider(scrapy.Spider):
   custom_settings = {
                'DOWNLOADER_MIDDLEWARES' : {
                            'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
                            'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
                            'scrapy_splash.SplashCookiesMiddleware': 723,
                            'scrapy_splash.SplashMiddleware': 725,
                            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
                            },

               'SPLASH_URL': 'http://192.168.59.103:8050',

               'SPIDER_MIDDLEWARES': {
                        'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
                        },

                'DUPEFILTER_CLASS':  'scrapy_splash.SplashAwareDupeFilter',

                'HTTPCACHE_STORAGE': 'scrapy_splash.SplashAwareFSCacheStorage',
                }


    def star_requests(self):
          yield SplashRequest(url=some_url, meta={'cookiejar': 1},
                                callback=self.parse,
                                cookies={'store_language':'en'},
                                endpoint='render.html',
                                args={'wait': 5},
                            )

    def parse(self, response):
           self.extract_data_from_page(response)

            href = response.xpath('//div[@class="paging"]/p/a[contains(text(),"Next")]/@href')
            if href:
                new_url = href.extract_first()
                yield SplashRequest(new_url, self.parse,
                                    cookies={'store_language':'en'},
                                    endpoint='execute', args={'lua_source': self.script})

Неправильный скрипт Lua (я скопировал его из несвязанного примера).У меня такой вопрос: как передать требуемые аргументы в скрипт Lua, чтобы был запущен JavaScript?

1 Ответ

0 голосов
/ 16 февраля 2019

Вы можете передать дополнительные аргументы ( документы ) в скрипт Lua, добавив значения в SplashRequest args:

javascript = "doSubmit('frmRow',1,0)"

yield SplashRequest(new_url, self.parse,
                    cookies={'store_language':'en'},
                    endpoint='execute',
                    args={'lua_source': self.script, 'javascript': javascript})

Внутри скрипта Lua вы можете получить значениев args и выполните Javascript с помощью runjs:

function main(splash, args)
    -- ...

    -- Get the argument here:
    local javascript = args.javascript

    -- Run the JS:
    assert(splash:runjs(javascript))

    return {
        html = splash:html()
    }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...