执行JavaScript代码以接受条款并打开下一页。
我想爬取一个需要点击“接受条款”按钮才能进入的Java代码渲染网站。 我正在使用Scrapy和Splash,并尝试使用' render.html'和' execute'两个Splash端点执行JavaScript代码。 在这两种情况下,输出都是起始页面。 为什么这不符合预期?
url =带有“接受条款”按钮的起始页面。
url / index.aspx =我想要呈现的页面。
使用render.html:
' '' yield scrapy.Request('url',self.parse,meta = { 'splash': { 'endpoint':'render.html','args':{'js_source': 'document.getElementById(“AcceptTerms”)。click();','html':1,'wait': 0.5}}} ' ''
或通过使用执行和lua:
' '' lua_source_string ='function main(splash) splash:go(“url / index.aspx”) splash:wait(0.5) splash:runjs(“document.getElementById('AcceptTerms').click();” 返回splash:html()end'
yield scrapy.Request('url',self.parse,meta = { 'splash': {'endpoint':'execute','args':{'lua_source':lua_source_string}})
' ''
' url'是渲染的页面。
如果我遵循http://blog.scrapinghub.com/2015/03/02/handling-javascript-in-scrapy-with-splash/中的示例并使用以下lua字符串与jquery,如下所示:
' '' lua_source_string ='function main(splash) splash:autoload(“https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js”) splash:go(“url / index.aspx”) splash:wait(0.5) splash:runjs(“$('#AcceptTerms').Click();”) 返回splash:html()end' ' ''
或者使用以下jquery代码:
' '' lua_source_string ='function main(splash) splash:autoload(“i / am / restricted / to / only / two / links / see / above / jquery.min.js”) splash:go(“url / index.aspx”) splash:wait(0.5) splash:runjs(“$('#AcceptTerms').trigger('click');”) 返回splash:html()end'
' ''
我得到了同样的结果。 渲染的页面是'url'。
我也遇到了同样的问题。我建议使用以下解决方法:
function setup_casperjs(splash)
-- 预加载CasperJS客户端工具
-- __utils__对象与CasperJS兼容
splash:autoload("https://raw.githubusercontent.com/n1k0/casperjs/master/modules/clientutils.js")
splash:autoload([[
window.__utils__ = new ClientUtils({});
]])
end
function main(splash)
setup_casperjs(splash)
assert(splash:go(splash.args.url))
assert(splash:runjs("__utils__.click('#AcceptTerms')"))
splash:wait(0.5)
return splash:html()
end
请参阅https://github.com/scrapinghub/splash/issues/200#issuecomment-112552839获取更详细的说明。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
使用推荐的方法将 Lua 脚本发送到“execute”端点:
splash:go 应该加载 URL 对应的起始页面,脚本将在此执行,而不是加载 URL/index.aspx 对应的目标页面。
由于 splash:go 加载页面,所以在此之后立即进行 splash:wait 是不必要的。
但是,在 splash:runjs 之后需要进行 splash:wait。
通过检查 HTML 源代码验证按钮的 ID。
因此,你可以将要点击的按钮的 ID 通过 splash.args 传递给以下函数:
function main(splash) splash:go(splash.args.url) splash:runjs('document.getElementById["'.. splash.args.submit ..'"].click();') splash:wait(0.5) return splash:html() end