无头互联网浏览器?

时间:2009-05-02 12:13:24

标签: automation headless-browser webautomation

我想做以下事情。登录网站,单击几个特定链接,然后单击下载链接。我想将它作为Windows上的计划任务或Linux上的cron作业运行。我对我使用的语言并不挑剔,但如果可能的话,我希望这样做不会在屏幕上显示浏览器窗口。

14 个答案:

答案 0 :(得分:147)

以下是我所知道的无头浏览器列表:

  • HtmlUnit - Java。定制浏览器引擎。有限的JavaScript支持/ DOM模拟。开源。
  • Ghost - 仅限Python。基于WebKit的。完整的JavaScript支持。开源。
  • Twill - 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-webdriverheadless 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解决方案。围绕JavaFx WebKit Engine的包装库。无头模式。
  • Chromium Embedded Framework - 完整的Chromium嵌入版本,可根据需要进行屏幕外渲染。 C / C ++,包含.NET包装器(和其他语言)。由于它是Chromium,它支持所有。 BSD许可。
  • Selenium WebDriver - 通过浏览器(Firefox,IE,Chrome,Safari,Opera)全面支持JavaScript。官方支持的bindings是C#,Java,JavaScript,Haskell,Perl,Ruby,PHP,Python,Objective-C和R.非官方绑定可用于QtGo。开源。

通过模拟DOM支持JavaScript的无头浏览器通常会遇到一些使用更高级/模糊浏览器功能的网站的问题,或者具有视觉依赖性的功能(例如通过CSS位置等),所以同时使用纯JavaScript这些浏览器中的支持通常是完整的,实际支持的浏览器功能应该被视为仅部分浏览器。

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

答案 1 :(得分:5)

查看twill,这是一种非常方便的脚本语言,可以准确地找到您想要的内容。来自examples

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

答案 2 :(得分:3)

查看适用于Windows,Mac OS X,Linux和其他* ix系统的PhantomJS基于JavaScript的自动化框架

使用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' Quickstart页面中的示例。您甚至可以使用render()方法将网页呈现为PNG,JPEG或PDF

答案 3 :(得分:2)

我曾经使用Internet Explorer ActiveX控件(WebBrowser,MSHTML)做到了这一点。您可以在不使其可见的情况下实例化它。

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

除了自动下载文件(因为这是一个对话框)之外,带有嵌入式webcontrol的win表单将执行此操作。

您可以查看WatinWatin Recorder。他们可能会帮助C#代码登录到您的网站,导航到URL,甚至可能帮助自动化文件下载。

YMMV虽然。

答案 6 :(得分:1)

如果链接已知(例如,您不必在页面中搜索它们),那么您可以使用wget。我相信它会在多次提取中进行状态管理。

如果你更有进取心,那么我会在Python 3.0深入研究新的好东西。他们将接口重新编写为HTTP堆栈,并且恕我直言,有一个very nice interface容易受到此类脚本的攻击。<​​/ p>

答案 7 :(得分:1)

服务器上带有YUI的Node.js。观看此视频:http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

您可以将Watir与Ruby结合使用,或Watin使用单声道。

答案 10 :(得分:0)

你也可以使用Live Http Headers(Firefox扩展)来记录发送到网站的标题(登录 - >链接 - >下载链接),然后使用fsockopen用php复制它们。您可能需要变量的只是您从登录页面收到的cookie的值。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

你能不能只使用下载管理器?

有更好的,但FlashGet具有浏览器集成,并支持身份验证。您可以登录,单击一堆链接并将其排队并安排下载。

您可以编写一些内容,例如,充当代理,捕获特定链接并将其排队等待以后下载,或者一个Javascript书签,修改链接以转到"http://localhost:1234/download_queuer?url=" + $link.href并使该队列具有下载 - 但是您我将重新发明下载管理器轮,并通过身份验证可能会更复杂..

或者,如果你想要“登录,点击链接”位也要自动化 - 查看screen-scraping ..基本上你通过HTTP库加载页面,找到下载链接并下载它们。< / p>

稍微简化的例子,使用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”的用户名/密码进行身份验证后,将下载example.com上的每个链接。当然,您可以使用BeautifulSoup's HTML选择器找到更具体的链接(例如,您可以找到“class”类的所有链接,或者以http://cdn.example.com开头的URL。)

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

答案 13 :(得分:0)

.NET包含System.Windows.Forms.WebBrowser。您可以创建此实例,将其发送到URL,然后轻松解析该页面上的html。然后,您可以关注您找到的任何链接等。

我只使用了这个对象,所以我不是专家,但如果你已经熟悉.NET,那么它可能值得研究。