执行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'。

点赞
用户2991783
用户2991783

使用推荐的方法将 Lua 脚本发送到“execute”端点:

  1. splash:go 应该加载 URL 对应的起始页面,脚本将在此执行,而不是加载 URL/index.aspx 对应的目标页面。

  2. 由于 splash:go 加载页面,所以在此之后立即进行 splash:wait 是不必要的。

  3. 但是,在 splash:runjs 之后需要进行 splash:wait。

  4. 通过检查 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
2015-05-28 18:27:11
用户5036611
用户5036611

我也遇到了同样的问题。我建议使用以下解决方法:

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获取更详细的说明。

2015-08-06 11:52:46