как сказать Lua нажимать на «кнопку загрузки» бесконечно?

#web-scraping #lua #scrapy-splash

#веб-очистка #lua #scrapy-splash

Вопрос:

Это первый раз, когда я использую splash для очистки веб-сайта. Мне нужно сказать splash, чтобы нажать на кнопку, чтобы другие элементы загружались в браузере. Это продолжается бесконечно. Затем я хочу, чтобы заставка возвращала HTML-код, чтобы я мог очистить его своим пауком. Кнопка загрузки не имеет href, поэтому я не могу использовать разбивку на страницы. Таким образом, я попытался написать сценарий заставки для этого. Но когда я запускаю скрипт с помощью splash, кажется, что часть «btn» не играет никакой роли в возвращаемом HTML (каждый раз возвращается только HTML первой страницы.)

Вот сценарий заставки, который я написал:

 function main(splash,args)

    local function wait_for(it)
        item=splash:select(it)
        while not item:visible() do
            splash:wait(0.25)
            item=splash:select(it)
            return item
        end 
    end 

    splash.private_mode_enabled=false
    local head={'User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome'}
    assert(splash:go(args.url,headers=head))

    selector='.undefined.btn.small-Font'
    wait_for(selector):mouse_click()

    selector='.rtl.custom-container.pb-5'
    wait_for(selector):mouse_click()

    return splash:html()

end
 

Кто-нибудь может помочь мне понять, как я могу сказать splash, что «пока существует «кнопка загрузки», нажмите ее, а затем верните весь HTML сразу»?

Кстати, вот неанглоязычный URL, который я хочу очистить: http://namlik.me/channels

Большое вам спасибо!!

—РЕДАКТИРОВАТЬ—

Это ошибка, которую я получил на странице ответа:

 {
    "error": 400,
    "type": "ScriptError",
    "description": "Error happened while executing Lua script",
    "info": {
        "source": "[string "function main(splash,args)r..."]",
        "line_number": 14,
        "error": "')' expected near '='",
        "type": "LUA_INIT_ERROR",
        "message": "[string "function main(splash,args)r..."]:14: ')' expected near '='"
    }
}
 

Ответ №1:

Если он не существует, подождите немного и повторите попытку. Вы можете сделать то же самое с вашим контейнером вместо splash:wait(10) . https://splash.readthedocs.io/en/stable/scripting-element-object.html#element-visible

 btn = splash :select(".undefined.btn.small-Font")
visible = btn :visible()
while not visible do
    splash :wait( 0.25 )
    btn = splash :select(".undefined.btn.small-Font")
    visible = btn :visible()
end
btn :mouse_click()
 


Эта процедура ожидания может быть функцией.

 function main( splash, args )

    local function wait_for( it )
        item = splash :select( it )
        while not item :visible() do
            splash :wait( 0.25 )
            item = splash :select( it )
        end  --  visible?
        return item
    end  --  wait_for()

    splash .private_mode_enabled = false
    local head = { 'User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome' }
    splash :set_user_agent( head )
    assert(  splash :go( args .url )  )

    selector = '.undefined.btn.small-Font'
    wait_for( selector ) :mouse_click()

    selector = '.rtl.custom-container.pb-5'
    wait_for( selector ) :mouse_click()

    return splash :html()

end  --  main()
 

Комментарии:

1. Спасибо, @Doyousketch2 за ваше объяснение. Я заменил часть «btn» вашим кодом и запустил splash. Он работал без каких-либо ошибок. Но опять же, на странице ответа я получил HTML первой страницы веб-сайта. Разве это не должно показывать весь HTML-файл? или он всегда показывает первую страницу? Кстати, «html: строка (длина 44838)» такая же, как и раньше.

2. Недостаточно знаю об этой веб-странице, чтобы объяснить вам, почему это так. Возможно, для навигации по страницам требуются файлы cookie. Вы можете попробовать удалить фигурные скобки в своем заявлении return return splash:html()

3. Большое спасибо, @Doyousketch2. Я отредактировал вышеприведенный пост и в части «РЕДАКТИРОВАТЬ» поместил ошибку, которую я получил. Я также изменил сценарий заставки, как вы сказали. Я знаю, это может показаться глупым, но я не нашел ни одного отладчика для ошибок, которые я получаю, и другие подобные вопросы не помогли в этой ошибке. Итак, я поместил это здесь. Еще раз спасибо.