#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. Я отредактировал вышеприведенный пост и в части «РЕДАКТИРОВАТЬ» поместил ошибку, которую я получил. Я также изменил сценарий заставки, как вы сказали. Я знаю, это может показаться глупым, но я не нашел ни одного отладчика для ошибок, которые я получаю, и другие подобные вопросы не помогли в этой ошибке. Итак, я поместил это здесь. Еще раз спасибо.