无头的互联网浏览器?

我想做以下事情。 login到一个网站,点击几个特定的​​链接,然后点击下载链接。 我想运行这个作为Windows或cron工作在Linux上的计划任务。 我对我使用的语言并不挑剔,但是如果可能的话,我希望这样做可以把浏览器窗口放在屏幕上。

以下是我所了解的无头浏览器列表:

  • HtmlUnit – Java。 自定义浏览器引擎 有限的JavaScript支持/ DOM模拟。 开源。
  • 鬼 – 只有Python。 基于WebKit的。 完整的JavaScript支持。 开源。
  • 斜纹 – Python /命令行。 自定义浏览器引擎 没有JavaScript。 开源。
  • PhantomJS – 命令行/所有平台。 基于WebKit的。 完整的JavaScript支持。 开源。
  • Awesomium – C ++ /。NET /所有平台。 铬为主。 完整的JavaScript支持。 商业/免费。
  • SimpleBrowser – .NET 4 / C#。 自定义浏览器引擎 没有JavaScript支持。 开源。
  • ZombieJS – Node.js. 自定义浏览器引擎 JavaScript支持/模拟的DOM。 开源。 基于jsdom 。
  • EnvJS – 通过Java / Rhino的JavaScript。 自定义浏览器引擎 JavaScript支持/模拟的DOM。 开源。
  • Watir-webdriver与无头gem – Ruby通过WebDriver。 通过浏览器(Firefox / Chrome / Safari / IE)提供完整的JS支持。
  • Spynner – 仅限Python。 PyQT和WebKit。
  • jsdom – Node.js 自定义浏览器引擎 通过模拟DOM支持JS。 开源。
  • TrifleJS – 使用MSIE(Trident)和V8的PhantomJS的端口。 开源。
  • ui4j – 纯Java 8解决scheme。 JavaFx WebKit引擎周围的包装库。 无头模式。
  • Chromiumembedded式框架 – 完整的最新embedded式版本的Chromium,根据需要进行离屏渲染。 C / C ++,.NET包装(和其他语言)。 因为它是铬,它支持一切 。 BSD许可。
  • Selenium WebDriver – 通过浏览器(Firefox,IE,Chrome,Safari,Opera)全面支持JavaScript。 官方支持的绑定是C#,Java,JavaScript,Haskell,Perl,Ruby,PHP,Python,Objective-C和R.非官方绑定可用于Qt和Go 。 开源。

通过模拟DOM支持JavaScript的无头浏览器通常会遇到一些使用更高级/模糊浏览器function的站点的问题,或者具有可视化依赖的function(例如通过CSS位置等),所以虽然这些纯JavaScript支持浏览器通常是完整的,实际支持的浏览器function应该只被视为部分。

(注意:这篇文章的原始版本只提到了HtmlUnit,因此是注释。如果你知道其他无头浏览器的实现并且有编辑权限,请随意编辑这个文章并添加它们。)

检查斜纹 ,一个非常方便的脚本语言正是你在找什么。 从例子 :

setlocal username <your username> setlocal password <your password> go http://www.slashdot.org/ formvalue 1 unickname $username formvalue 1 upasswd $password submit code 200 # make sure form submission is correct! 

如果你正在寻找更多的灵活性,还有一个Python API 。

看看PhantomJS ,一个基于JavaScript的自动化框架,可用于Windows,Mac OS X,Linux,其他* ix系统。

使用PhantomJS,你可以做这样的事情:

 console.log('Loading a web page'); var page = new WebPage(); var url = "http://www.phantomjs.org/"; page.open(url, function (status) { // perform your task once the page is ready ... phantom.exit(); }); 

或评估一个页面的标题

 var page = require('webpage').create(); page.open(url, function (status) { var title = page.evaluate(function () { return document.title; }); console.log('Page title is ' + title); }); 

PhantomJS快速入门页面的示例。 您甚至可以使用render()方法将页面呈现为PNG,JPEG或PDF

我曾经使用Internet Explorer ActiveX控件(WebBrowser,MSHTML)。 您可以实例化它,而不使其可见。

这可以用任何支持COM的语言来完成(Delphi,VB6,VB.net,C#,C ++,…)

当然,这是一个快速而肮脏的解决scheme,可能不适合您的情况。

PhantomJS是一个基于WebKit的无头浏览器,您可以使用JavaScript进行脚本编写。

除了自动下载文件(因为这是一个对话框),embedded式web控制的胜利forms将做到这一点。

你可以看看Watin和Watin录音机 。 他们可能会帮助C#代码login到您的网站,导航到一个URL,甚至可能有助于自动化文件下载。

YMMV虽然。

如果链接是已知的(例如,你不必search他们的页面),那么你可以使用wget 。 我相信它会跨越多次取得国家pipe理。

如果你有点进取,那么我将深入研究Python 3.0中的新function。 他们redid的接口到他们的HTTP堆栈,恕我直言,有一个非常好的接口 ,这种types的脚本容易受到影响。

在服务器上使用YUI的Node.js。 看看这个video: http : //www.yuiblog.com/blog/2010/09/29/video-glass-node/

这个video中的家伙Dav Glass展示了他如何使用节点从Digg获取页面的例子。 然后,他将YUI附加到他抓取的DOM上,并可以完全操纵它。

如果您使用PHP – 请尝试http://mink.behat.org/

您可以将Watir与Ruby或Watin一起使用。

您也可以使用Live Http Headers(Firefox扩展)来logging发送到站点的标题(login – >链接 – >下载链接),然后使用fsockopen通过php复制它们。 只有你可能需要改变的是你从login页面接收到的cookie值。

libCURL可以用来创build这样的东西。

你不能只使用一个下载pipe理器?

有更好的,但FlashGet具有浏览器集成,并支持身份validation。 你可以login,点击一堆链接,排队和安排下载。

你可以写一些东西,比如捕获特定的链接,排队等待下载,或者是一个修改链接的Javascript小书签,转到"http://localhost:1234/download_queuer?url=" + $link.href并让队列下载 – 但是你会重新发明下载pipe理器轮,并与身份validation,可以更复杂..

或者,如果你想“login,点击链接”位也自动化 – 看屏幕抓取 ..基本上你通过HTTP库加载页面,find下载链接,并下载它们..

稍微简化的例子,使用Python:

 import urllib from BeautifulSoup import BeautifulSoup src = urllib.urlopen("http://%s:%s@example.com" % ("username", "password")) soup = BeautifulSoup(src) for link_tag in soup.findAll("a"): link = link_tag["href"] filename = link.split("/")[-1] # get everything after last / urllib.urlretrieve(link, filename) 

在用户名/密码“username”和“password”进行validation之后,会下载example.com上的每个链接。 当然,您可以使用BeautifulSoup的 HTMLselect器来查找更具体的链接(例如,您可以find类“下载”的所有链接,或以http://cdn.example.com开头的URL)。

你几乎可以用任何语言来做同样的事情

.NET包含System.Windows.Forms.WebBrowser 。 您可以创build一个实例,将其发送到一个URL,然后轻松parsing该页面上的HTML。 然后,您可以按照您find的任何链接

我只用最低限度的工作,所以我不是专家,但如果你已经熟悉.NET,那么它可能是值得研究的。