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


70

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


1
如果不显示浏览器,为什么要实例化它?大多数语言都有用于通过URL传输文件的库。告诉我们您的实现语言,我们可能会为您指明正确的方向。
Ozgur Ozcitak,2009年

3
另外,请告诉我们您是否需要JavaScript支持,因为这很重要。一些库没有内置的JS解释器。
匿名

Answers:


153

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

  • 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-通过WebDriver的Ruby。通过浏览器(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 incl的包装器库。无头模式。
  • Chromium嵌入式框架-完整的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支持浏览器通常是完整的,实际支持的浏览器功能应仅视为部分功能。

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


+ 1,HTMLUnit的JS支持是一大优势
orip 2010年

12
JS对HTMLUnit的支持非常糟糕。我不是害怕的答案。
2011年

2
HtmlUnit的javascript没什么问题。考虑它是一个无JS的浏览器。
迈克尔

2
不幸的是,HtmlUnit和HttpUnit都在Ajax之前。他们是在一个时代里使用Javascript的,而Java仅仅用于形式验证(您完全可以忘记像JQuery EVER这样的东西可以在其中任何一个条件下工作),而且据我所读,没有一个人可能会支持“现代”。 “ Javascript仅仅因为它要么需要完全重写其Javascript引擎,要么被其绑定可能与原始Java绑定有很大不同的另一Javascript引擎替代,因此它需要对整个框架进行实际重写以适应它。
Bitbang3r 2013年

1
我最近在developer.google.com/web/updates/2017/04/headless-chrome中描述了在无头模式下使用google chrome的方法chrome版本60易于使用
Samuel Garratt

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


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


此答案帮助我在javascript运行后保存了源代码:stackoverflow.com/a/32019723/511438
Valamas 2015年

1
一个相当愚蠢的问题,但也许您已经测试过:PhantomJS是否可以在需要用户名/密码的网站上运行?
Sopalajo de Arrierez

2

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

可以使用任何支持COM的语言(Delphi,VB6,VB.net,C#,C ++等)来完成此操作

当然,这是一个快捷的解决方案,可能不适用于您的情况。


2

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


1

除了自动下载文件(即是一个对话框)外,带有嵌入式Web控件的Win窗体都可以执行此操作。

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

YMMV虽然。


1

如果链接是已知的(例如,您不必在页面上搜索它们),则可以使用wget。我相信它将对多个访存进行状态管理。

如果您比较进取,那么我将深入研究Python 3.0中的新功能。他们将接口重命名为HTTP堆栈,恕我直言,它的接口非常好,容易受到此类脚本的影响。





0

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



0

您不仅可以使用下载管理器吗?

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

您可以编写一些内容,例如充当代理,以捕获特定的链接并将它们排入队列以供以后下载,或者编写Javascript书签来修改链接以"http://localhost:1234/download_queuer?url=" + $link.href使下载进入并排入下载队列-但您将重新设计下载管理器轮,并带有身份验证,可能会更加复杂。

或者,如果您也想使“登录,单击链接”位也自动化-查看屏幕抓取..基本上,您通过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)。

您几乎可以使用任何一种语言来做同样的事情。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.