如何告诉 Lua 无限点击 "loading button"?
how to tell Lua to click on "loading button" infinitely?
这是我第一次使用 splash 抓取网站。我需要告诉 splash 单击一个按钮,以便其他元素加载到浏览器上。这无限地继续下去。然后我想要启动 return HTML 代码,这样我就可以用我的蜘蛛抓取它。加载按钮没有 href,所以我不能使用分页。因此,我尝试编写启动脚本来执行此操作。但是当我 运行 带有启动的脚本时,似乎“btn”部分在 returned HTML 中没有任何作用(只有第一页的 HTML return每次都编辑。)
这是我写的启动脚本:
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“当“加载按钮”存在时,按下它,然后 return 整个 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 '='"
}
}
如果不存在,请稍等,然后重试。你可以对你的容器做同样的事情,而不是 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()
这是我第一次使用 splash 抓取网站。我需要告诉 splash 单击一个按钮,以便其他元素加载到浏览器上。这无限地继续下去。然后我想要启动 return HTML 代码,这样我就可以用我的蜘蛛抓取它。加载按钮没有 href,所以我不能使用分页。因此,我尝试编写启动脚本来执行此操作。但是当我 运行 带有启动的脚本时,似乎“btn”部分在 returned HTML 中没有任何作用(只有第一页的 HTML return每次都编辑。)
这是我写的启动脚本:
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“当“加载按钮”存在时,按下它,然后 return 整个 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 '='"
}
}
如果不存在,请稍等,然后重试。你可以对你的容器做同样的事情,而不是 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()