使用javascript链接下载PhantomJS

使用javascript链接下载PhantomJS,javascript,screen-scraping,phantomjs,Javascript,Screen Scraping,Phantomjs,我正在尝试浏览以下网站: 如果单击表格右上角标题为“导出数据”的小按钮,将运行javascript脚本,我的浏览器将以.csv格式下载该文件。我希望能够编写一个PhantomJS脚本来自动完成这项工作。有什么想法吗 上述按钮编码为HTML,如下所示: <a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div> 你就不能运行代码,\u doPos

我正在尝试浏览以下网站:

如果单击表格右上角标题为“导出数据”的小按钮,将运行javascript脚本,我的浏览器将以.csv格式下载该文件。我希望能够编写一个PhantomJS脚本来自动完成这项工作。有什么想法吗

上述按钮编码为HTML,如下所示:

<a id="LB_cmdCSV" href="javascript:__doPostBack('LB$cmdCSV','')">Export Data</a></div>

你就不能运行代码,
\u doPostBack('leadboard1$cmdCSV',''),在网页的上下文中

大概是这样的:

page.evaluate(function() {
  __doPostBack('LeaderBoard1$cmdCSV','');
});

我还没有在PhantomJS中测试过这段代码,但理论上它应该可以工作,因为从Google Chrome的开发者控制台运行_doPostBack方法是可行的。如果对在PhantomJS中运行JavaScript代码有疑问,Google Chrome的开发人员控制台是测试代码的好方法,因为它在类似PhantomJS的WebKit上运行。我希望这会有所帮助。

这是一个ASP支持的网站,因此这比大多数网站都要复杂一些,您必须使用cURL命令模拟将整个表单viewstate和eventvalidation字符串发布回服务器。如果直接从页面中取出数据,可能会更容易。

我正在使用Ruby on Rails和Watir Webdriver()

我已经确定,在使用“doPostBack”时使用ASP.NET的工具与客户定义的用户代理使用的浏览器相同。使用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

对我来说效果很好的是模拟鼠标点击所需的元素

page.evaluate(function () {
  var btn = document.getElementById('LB_cmdCSV')
  var ev = document.createEvent('MouseEvent')
  ev.initEvent('click', true, true)
  btn.dispatchEvent(ev)
})

谢谢你的提示。我开始在Chrome的开发者控制台中进行测试,我已经让javascript正常工作,并且文件下载正确。但是,当使用phantomJS从命令行运行相同的代码时,什么也不会发生。这可能是因为我需要指定下载文件的位置(而Chrome设置总是将其放置在/home/downloads/)中吗?还将我当前的脚本添加到了OPJS中。该方法在casperJS中对我不起作用。虽然我是在另一个ASPX网站上做的。我还没有使用CasperJS,所以我不能确定这个方法在那种环境下是否有效。你知道如何指定下载文件的位置吗?谢谢你的回复(尽管我有点困惑)。以前,我只是在表格只有一个页面时,使用BeautifulSoup和Python直接从网页中获取数据。然而,该网站改变了他们的表格,使其具有多个可通过javascript函数访问的页面。此函数再次被称为u doPostBack,其调用方式如下:javascript:u doPostBack('LB$dg1$ctl00$ctl02$ctl00$ctl05','')。有没有一种方法,我可以从表中刮取信息,然后使用此功能更改页面?然后我可以递归,直到我刮掉每一页。
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
page.evaluate(function () {
  var btn = document.getElementById('LB_cmdCSV')
  var ev = document.createEvent('MouseEvent')
  ev.initEvent('click', true, true)
  btn.dispatchEvent(ev)
})