执行javascript代码以接受条款并打开下一页

时间:2015-05-11 22:08:23

标签: javascript jquery lua scrapy splash

我想抓取一个javacode渲染的网站,需要点击“接受条款”#39;按钮进入。我正在使用Scrapy和Splash并尝试使用两个splash端点' render.html'来执行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}}})

或使用execute和lua:

lua_source_string = 'function main(splash)
splash:go("url/index.aspx")
splash:wait(0.5)
splash:runjs("document.getElementById(\'AcceptTerms\').click();")
return 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();")
return 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\');")
return splash:html() end'

我得到了相同的结果。呈现的页面是' url'。

2 个答案:

答案 0 :(得分:2)

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

function setup_casperjs(splash)  
  -- preload CasperJS client utils.  
  -- __utils__ object is compatible with 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

答案 1 :(得分:0)

使用推荐的方法将lua脚本发送到执行端点

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

  2. 因为启动:go加载页面,没有必要启动:之后立即等待

  3. 但是,有必要启动:等待以下启动:runjs

  4. 通过检查html源来验证按钮的ID。

  5. 因此,您可以将要在splash.args中单击的按钮的ID传递给

    // shadow DOM example with <template> and template string // var nameTag = function(selector, newName) { var name = newName || document.querySelector(selector).innerHTML; var shadow = document.querySelector(selector).createShadowRoot(); var templateNode = createNameTagTemplate(name); var clone = document.importNode(templateNode, true); shadow.appendChild(clone.content); }; function createNameTagTemplate(name) { var templateNode = document.createElement("template"); templateNode.innerHTML = ` <style> .outer { border: 2px solid brown; border-radius: 1em; background: red; font-size: 20pt; width: 12em; height: 7em; text-align: center; } .boilerplate { color: white; font-family: sans-serif; padding: 0.5em; } .name { color: black; background: white; font-family: "Marker Felt", cursive; font-size: 45pt; padding-top: 0.2em; } </style> <div class="outer"> <div class="boilerplate"> Hi! My name is </div> <div class="name"> ${name} </div> </div>`; return templateNode; }