72

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

4

14 回答 14

159

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

  • HtmlUnit - Java。自定义浏览器引擎。有限的 JavaScript 支持/DOM 模拟。开源。
  • Ghost - 仅限 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 with headless 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 引擎的包装库,包括。无头模式。
  • Chromium Embedded Framework - Chromium 的完整最新嵌入式版本,可根据需要进行离屏渲染。C/C++,带有 .NET 包装器(和其他语言)。因为它是 Chromium,所以它支持一切。BSD 许可。
  • Selenium WebDriver - 通过浏览器(Firefox、IE、Chrome、Safari、Opera)完全支持 JavaScript。官方支持的绑定是 C#、Java、JavaScript、Haskell、Perl、Ruby、PHP、Python、Objective-C 和 R。非官方绑定可用于QtGo。开源。

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

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

于 2009-05-02T14:15:26.960 回答
5

查看twill,一种非常方便的脚本语言,正是您正在寻找的。从例子

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 。

于 2009-05-11T09:08:04.720 回答
4

看看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 。

于 2012-04-19T22:42:10.360 回答
2

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

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

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

于 2009-05-02T12:18:00.440 回答
2

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

于 2011-11-08T17:21:39.260 回答
1

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

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

虽然是 YMMV。

于 2009-05-02T12:19:46.253 回答
1

如果链接是已知的(例如,您不必在页面上搜索它们),那么您可能可以使用wget. 我相信它将跨多个提取进行状态管理。

如果你更有进取心,那么我会深入研究Python 3.0中的新东西。他们重新编写了 HTTP 堆栈的接口,恕我直言,有一个非常好的接口,容易受到这种类型的脚本的影响。

于 2009-05-02T12:27:42.303 回答
1

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

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

于 2011-03-18T13:57:19.167 回答
1

如果你使用 PHP - 试试http://mink.behat.org/

于 2011-10-23T17:15:10.367 回答
0

您可以将Watir与 Ruby 一起使用,或者将Watin与单声道一起使用。

于 2009-05-02T12:28:26.933 回答
0

您还可以使用 Live Http Headers(Firefox 扩展)来记录发送到站点(登录 -> 链接 -> 下载链接)的标题,然后使用 fsockopen 将它们复制到 php 中。您可能需要更改的唯一内容是您从登录页面收到的 cookie 值。

于 2009-05-02T12:29:50.020 回答
0

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

我只对这个对象进行了最低限度的工作,所以我不是专家,但如果您已经熟悉 .NET,那么它可能值得研究。

于 2009-05-02T14:09:51.903 回答
0

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

于 2009-05-02T13:15:01.050 回答
0

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

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

你可以写一些东西,比如说,作为一个代理来捕获特定的链接并将它们排队以供以后下载,或者一个 Javascript 小书签,它修改链接去"http://localhost:1234/download_queuer?url=" + $link.href并让下载排队 - 但你会重新发明下载管理器-wheel,并且通过身份验证可能会更复杂..

或者,如果您希望“登录,单击链接”位也自动化 - 查看屏幕抓取.. 基本上您通过 HTTP 库加载页面,找到下载链接并下载它们..

稍微简化的示例,使用 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)

在使用“用户名”和“密码”的用户名/密码进行身份验证后,这将下载 example.com 上的每个链接。当然,您可以使用BeautifulSoup 的HTML 选择器找到更具体的链接(例如,您可以找到所有带有“下载”类的链接,或以 开头的 URL http://cdn.example.com)。

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

于 2009-05-02T13:26:53.487 回答