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

执行javascript代码以接受条款并打开下一页,javascript,jquery,lua,scrapy,splash-screen,Javascript,Jquery,Lua,Scrapy,Splash Screen,我想抓取一个javacode呈现的网站,它需要点击“接受条款”按钮才能进入。我正在使用Scrapy和Splash,并尝试使用Splash端点“render.html”和“execute”来执行javascript代码。在这两种情况下,输出都是起始页。为什么要按预期完成这项工作 url=带有“接受条款”按钮的起始页 url/index.aspx=我要呈现的页面 使用render.html: yield scrapy.Request('url', self.parse, meta={ 'splash

我想抓取一个javacode呈现的网站,它需要点击“接受条款”按钮才能进入。我正在使用Scrapy和Splash,并尝试使用Splash端点“render.html”和“execute”来执行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”是呈现的页面

如果我遵循中的示例并将以下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”。

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

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

  • 由于splash:go加载页面,因此没有必要在加载后立即执行splash:wait

  • 但是,有必要在splash:runjs之后使用splash:wait

  • 通过检查html源代码来验证按钮的id

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

    
    主功能(飞溅)
    splash:go(splash.args.url)
    splash:runjs('document.getElementById[“…splash.args.submit…”)。单击();')
    飞溅:等待(0.5)
    返回splash:html()
    结束
    

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

    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
    

    请参阅以获得更详细的解释。

    我认为这取决于页面,也许您应该共享它。URL为:
    http://foreclosuresearch.arapahoegov.com/foreclosure
    http://foreclosuresearch.arapahoegov.com/foreclosure/index.aspx
    @dave为什么它取决于页面?我没有这样评论,我只编辑了代码格式的问题。对不起,我对lua一无所知。@eLRuLL为什么这取决于页面?谢谢!为我工作。