我想抓取一个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'。
答案 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脚本发送到执行端点
splash:go应该在url处加载起始页面,此脚本将在此处执行,而不是url / index.aspx上的目标
因为启动:go加载页面,没有必要启动:之后立即等待
但是,有必要启动:等待以下启动:runjs
通过检查html源来验证按钮的ID。
因此,您可以将要在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;
}