我试图抓住以下网站:
如果单击标题为“导出数据”的表右上角的小按钮,则会运行javascript脚本,我的浏览器会以.csv格式下载该文件。我希望能够编写一个可以自动执行此操作的PhantomJS脚本。有什么想法吗?
上面的按钮被编码为HTML:
<a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div>
我还在HTML源代码中找到了这个函数:
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
我是PhantomJS / Javascript的新手,可以在这里使用一些指针。我想我已经找到了我需要自动完成的所有信息(如果我错了,请纠正我),但不知道从哪里开始编码。谢谢你的帮助。
编辑 - 这就是我的剧本现在的样子:
var page = new WebPage();
url = 'http://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=8&season=2011&month=0&season1=2011&ind=0&team=0&rost=0& players=0';
page.open(encodeURI(url), function (status){
if (status !== "success") {
console.log("Unable to access website");
} else {
page.evaluate(function() {
__doPostBack('LB$cmdCSV', '');
});
}
phantom.exit(0);
});
答案 0 :(得分:1)
对我来说效果很好的是模拟鼠标点击所需的元素。
page.evaluate(function () {
var btn = document.getElementById('LB_cmdCSV')
var ev = document.createEvent('MouseEvent')
ev.initEvent('click', true, true)
btn.dispatchEvent(ev)
})
答案 1 :(得分:0)
难道你不能在网页的上下文中运行代码__doPostBack('LeaderBoard1$cmdCSV','');
吗?
这样的事情:
page.evaluate(function() {
__doPostBack('LeaderBoard1$cmdCSV','');
});
我没有在PhantomJS中测试过这段代码,但理论上它应该可行,因为从谷歌Chrome的开发者控制台运行__doPostBack方法起了作用。如果对在PhantomJS中运行JavaScript代码存在疑问,Google Chrome的开发者控制台是测试代码的好方法,因为它在像PhantomJS这样的WebKit上运行。我希望这会有所帮助。
答案 2 :(得分:-1)
这是一个ASP驱动的网站,所以这将比大多数人更棘手,你将不得不使用cURL命令模仿POST整个表格viewstate&amp; eventvalidation字符串返回服务器。可能只是简单地将数据直接从您拥有的页面中提取出来。
答案 3 :(得分:-1)
我正在使用Ruby on Rails和Watir Webdriver(https://github.com/watir/watir-webdriver)。
我已经确定使用ASP.NET的工具在使用客户定义的用户代理使用的“doPostBack”相同的浏览器时。使用PhantomJS时,用户代理被识别为“Mozilla / 5.0(未知; Linux i686)AppleWebKit / 534.34(KHTML,如Gecko)Safari / 534.34 PhantomJS / 1.9.1”。
因此,有必要在访问页面之前更改用户代理客户端。 Rails并做了类似的事情:
HTTP_USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:22.0) Gecko/20100101 Firefox/22.0"
HTTP_DRIVER = Selenium::WebDriver.for :phantomjs, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.phantomjs(
"phantomjs.page.settings.userAgent" => HTTP_USER_AGENT
)
...
browser = Watir::Browser.new HTTP_DRIVER, :http_client => client