无头互联网浏览器? [关闭]

Posted

技术标签:

【中文标题】无头互联网浏览器? [关闭]【英文标题】:headless internet browser? [closed] 【发布时间】:2010-10-23 07:41:09 【问题描述】:

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

【问题讨论】:

如果您不打算显示浏览器,为什么还要实例化它?大多数语言都有用于通过 URL 传输文件的库。告诉我们您的实施语言,我们可能会为您指明正确的方向。 另外告诉我们您是否需要 javascript 支持,因为这很重要。一些库没有内置 JS 解释器。 【参考方案1】:

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

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-webdriver 和 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。官方支持的 bindings 是 C#、Java、JavaScript、Haskell、Perl、Ruby、php、Python、Objective-C 和 R。非官方绑定可用于 Qt 和 Go。开源。

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

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

【讨论】:

+1,HTMLUnit 的 JS 支持是一大优势 JS 对 HTMLUnit 的支持很糟糕。恐怕这不是答案。 HtmlUnit 的 javascript 存在问题。将其视为无 JS 浏览器。 不幸的是,HtmlUnit 和 HttpUnit 都是 Ajax 之前的版本。它们是为一个 Javascript 仅用于表单验证的时代编写的(你可以完全忘记像 JQuery 这样的东西曾经在任何一个下工作),而且从我读过的内容来看,没有一个可能永远支持“现代" Javascript 只是因为它需要完全重写他们的 Javascript 引擎,或者用另一个绑定可能与原始引擎如此不同的引擎替换它,它实际上需要重写容纳它的整个框架。 我最近在developers.google.com/web/updates/2017/04/headless-chrome 描述的无头模式下使用了谷歌浏览器,很容易与 chrome 版本 60 一起使用【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

这个答案帮助我在 javascript 运行后保存了源代码。:***.com/a/32019723/511438 一个相当愚蠢的问题,但也许你已经测试过了:PhantomJS 是否可以在需要用户名/密码的网站上工作?【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

YMMV。

【讨论】:

【参考方案7】:

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

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

libCURL 可以用来创建类似的东西。

【讨论】:

【参考方案13】:

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

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

您可以编写一些东西,例如,充当代理,捕获特定链接并将它们排队以供以后下载,或者修改链接以转到 "http://localhost:1234/download_queuer?url=" + $link.href 并让下载排队的 Javascript 小书签 - 但您会正在重新发明下载管理器***,并且通过身份验证可能会更复杂..

或者,如果您希望“登录,单击链接”位也自动化 - 查看 screen-scraping.. 基本上您通过 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's HTML 选择器找到更具体的链接(例如,您可以找到所有具有“下载”类的链接,或以http://cdn.example.com 开头的 URL)。

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

【讨论】:

【参考方案14】:

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

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

【讨论】:

以上是关于无头互联网浏览器? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

无头浏览器和抓取 - 解决方案 [关闭]

C# (.NET) 的无头浏览器? [关闭]

适用于 Python 的无头浏览器(需要 Javascript 支持!)[关闭]

使用无头浏览器进行 Android Web Scraping [关闭]

互联网浏览器如何触发带有 .jpg 扩展名的 Flash 应用程序? [关闭]

Android 模拟器上没有互联网 - 为啥以及如何修复? [关闭]