ale*_*n13 1 python scrapy splash-js-render
在avito.ru(俄罗斯房地产网站)上,隐藏人的电话,直到您单击它为止。我想使用Scrapy + Splash收集电话。
范例网址:https://www.avito.ru/moskva/kvartiry/2-k_kvartira_84_m_412_et._992361048
单击按钮后,将显示弹出窗口,并且可以看到电话。
我使用带有以下Lua脚本的Splash execute API:
function main(splash)
splash:go(splash.args.url)
splash:wait(10)
splash:runjs("document.getElementsByClassName('item-phone-button')[0].click()")
splash:wait(10)
return splash:png()
end
Run Code Online (Sandbox Code Playgroud)
未单击该按钮,也不显示电话号码。这是一项微不足道的任务,我无法解释为什么它不起作用。
如果将替换item-phone-button为,则单击可以在同一页面上的其他字段上正常使用js-show-stat。因此,在一般情况下,Javascript 和蓝色的“显示电话”按钮必须具有某种特殊性。
为了隔离问题,我创建了一个包含最少示例脚本的存储库和用于Splash的docker-compose文件:https : //github.com/alexanderlukanin13/splash-avito-phone
Javascript代码有效,您可以使用Chrome和Firefox中的Javascript控制台进行验证
document.getElementsByClassName('item-phone-button')[0].click()
Run Code Online (Sandbox Code Playgroud)
我已经在Splash 3.0、3.1、3.2版本中尝试过,结果是一样的。
我也尝试过:
@Lore的建议,包括simulateClick()方法(请参见simulate_click分支)
mouseDown / mouseUp事件,如此处所述:模拟Tampermonkey中的mousedown,click,mouseup序列?(请参见trigger_mouse_event分支)
以下脚本适用于我:
function main(splash, args)
splash.private_mode_enabled = false
assert(splash:go(args.url))
btn = splash:select_all('.item-phone-button')[2]
btn:mouse_click()
btn.style.border = "5px solid black"
assert(splash:wait(0.5))
return {
num = #splash:select_all('.item-phone-button'),
html = splash:html(),
png = splash:png(),
har = splash:har(),
}
end
Run Code Online (Sandbox Code Playgroud)
原始解决方案有两个问题:
btn.style.border = "5px solid black"。