kopfloser Internetbrowser? [geschlossen]

70

Ich möchte Folgendes tun. Melden Sie sich bei einer Website an, klicken Sie auf einige bestimmte Links und dann auf einen Download-Link. Ich möchte dies entweder als geplante Aufgabe unter Windows oder als Cron-Job unter Linux ausführen. Ich bin nicht wählerisch in Bezug auf die Sprache, die ich verwende, aber ich möchte, dass dies ausgeführt wird, ohne dass ein Browserfenster auf dem Bildschirm angezeigt wird, wenn dies möglich ist.

Jared
quelle
1
Warum einen Browser instanziieren, wenn Sie ihn nicht anzeigen möchten? In den meisten Sprachen gibt es Bibliotheken zum Übertragen von Dateien über URLs. Teilen Sie uns Ihre Implementierungssprache mit und wir weisen Sie möglicherweise in die richtige Richtung.
Ozgur Ozcitak
3
Sagen Sie uns auch, ob Sie JavaScript-Unterstützung benötigen, da dies wichtig ist. Einige Bibliotheken verfügen nicht über integrierte JS-Interpreter.
Anonym

Antworten:

153

Hier ist eine Liste von Headless-Browsern, die ich kenne:

  • HtmlUnit - Java. Benutzerdefinierte Browser-Engine. Eingeschränkte JavaScript-Unterstützung / DOM emuliert. Open Source.
  • Geist - Nur Python. WebKit-basiert. Volle JavaScript-Unterstützung. Open Source.
  • Köper - Python / Kommandozeile. Benutzerdefinierte Browser-Engine. Kein JavaScript. Open Source.
  • PhantomJS - Befehlszeile / alle Plattformen. WebKit-basiert. Volle JavaScript-Unterstützung. Open Source.
  • Awesomium - C ++ /. NET / alle Plattformen. Chrom-basiert. Volle JavaScript-Unterstützung. Kommerziell / kostenlos.
  • SimpleBrowser - .NET 4 / C #. Benutzerdefinierte Browser-Engine. Keine JavaScript-Unterstützung. Open Source.
  • ZombieJS - Node.js. Benutzerdefinierte Browser-Engine. JavaScript-Unterstützung / emuliertes DOM. Open Source. Basierend auf jsdom .
  • EnvJS - JavaScript über Java / Rhino. Benutzerdefinierte Browser-Engine. JavaScript-Unterstützung / emuliertes DOM. Open Source.
  • Watir-Webdriver mit kopflosem Edelstein - Ruby via WebDriver. Volle JS-Unterstützung über Browser (Firefox / Chrome / Safari / IE).
  • Spynner - Nur Python. PyQT und WebKit.
  • jsdom - Node.js. Benutzerdefinierte Browser-Engine. Unterstützt JS über emuliertes DOM. Open Source.
  • TrifleJS - Port von PhantomJS mit MSIE (Trident) und V8. Open Source.
  • ui4j - Reine Java 8-Lösung. Eine Wrapper-Bibliothek um die JavaFx WebKit Engine inkl. kopflose Modi.
  • Chromium Embedded Framework - Vollständige, aktuelle eingebettete Version von Chromium mit Rendering außerhalb des Bildschirms nach Bedarf. C / C ++ mit .NET-Wrappern (und anderen Sprachen). Da es sich um Chrom handelt, unterstützt es alles . BSD lizenziert.
  • Selenium WebDriver - Volle Unterstützung für JavaScript über Browser (Firefox, IE, Chrome, Safari, Opera). Offiziell unterstützte Bindungen sind C #, Java, JavaScript, Haskell, Perl, Ruby, PHP, Python, Objective-C und R. Inoffizielle Bindungen sind für Qt und Go verfügbar . Open Source.

Headless-Browser, die JavaScript über ein emuliertes DOM unterstützen, haben im Allgemeinen Probleme mit einigen Websites, die erweiterte / undurchsichtige Browserfunktionen verwenden, oder Funktionen mit visuellen Abhängigkeiten (z. B. über CSS-Positionen usw.), während die reine JavaScript-Unterstützung in diesen Browser sind in der Regel vollständig, die tatsächlich unterstützten Browserfunktionen sollten nur teilweise betrachtet werden.

(Hinweis: In der Originalversion dieses Beitrags wurde nur HtmlUnit erwähnt, daher die Kommentare. Wenn Sie andere kopflose Browser-Implementierungen kennen und über Bearbeitungsrechte verfügen, können Sie diesen Beitrag bearbeiten und hinzufügen.)

Nathan Ridley
quelle
+1, die JS-Unterstützung von HTMLUnit ist ein großes Plus
orip
12
Die JS-Unterstützung für HTMLUnit ist schrecklich. Es ist nicht die Antwort, fürchte ich.
KJW
2
Nichts als Probleme mit dem Javascript von HtmlUnit. Betrachten Sie es als einen JS-freien Browser.
Michael
2
HtmlUnit und HttpUnit sind leider beide vor Ajax. Sie wurden für eine Zeit geschrieben, in der Javascript nur für die Formularvalidierung verwendet wurde (Sie können völlig vergessen, dass JQuery EVER unter beiden arbeitet), und nach dem, was ich gelesen habe, wird wahrscheinlich keiner von beiden jemals "modern" unterstützen "Javascript, nur weil es entweder ein vollständiges Umschreiben der Javascript-Engine oder das Ersetzen durch eine andere erfordern würde, deren Bindungen sich wahrscheinlich so stark von der ursprünglichen unterscheiden würden, würde es eine de-facto-Umschreibung des gesamten Frameworks erfordern, um es aufzunehmen."
Bitbang3r
1
Ich habe kürzlich Google Chrome im Headless-Modus verwendet, der unter developer.google.com/web/updates/2017/04/headless-chrome beschrieben wurde. War mit Chrome Version 60 einfach zu verwenden
Samuel Garratt
5

Schauen Sie sich Twill an , eine sehr praktische Skriptsprache für genau das, was Sie suchen. Aus den Beispielen :

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!

Es gibt auch eine Python-API, wenn Sie mehr Flexibilität suchen.

orip
quelle
3

Schauen Sie sich PhantomJS an , ein JavaScript-basiertes Automatisierungsframework, das für Windows, Mac OS X, Linux und andere * ix-Systeme verfügbar ist.

Mit PhantomJS können Sie Folgendes tun:

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();
});

Oder bewerten Sie den Titel einer Seite :

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

Beispiele von der PhantomJS-Schnellstartseite . Mit der render () -Methode können Sie eine Seite sogar in PNG, JPEG oder PDF rendern .

SteAp
quelle
Diese Antwort hat mir geholfen, die Quelle zu speichern, nachdem Javascript ausgeführt wurde: stackoverflow.com/a/32019723/511438
Valamas
1
Eine ziemlich dumme Frage, aber vielleicht haben Sie sie getestet: Wird erwartet, dass PhantomJS auf Websites funktioniert, für die Benutzername / Passwort erforderlich sind?
Sopalajo de Arrierez
2

Ich habe das einmal mit dem Internet Explorer ActiveX-Steuerelement (WebBrowser, MSHTML) gemacht. Sie können es instanziieren, ohne es sichtbar zu machen.

Dies kann mit jeder Sprache erfolgen, die COM unterstützt (Delphi, VB6, VB.net, C #, C ++, ...).

Dies ist natürlich eine schnelle und schmutzige Lösung und möglicherweise in Ihrer Situation nicht angemessen.

Daniel Rikowski
quelle
2

PhantomJS ist ein kopfloser WebKit-basierter Browser, den Sie mit JavaScript skripten können.

xn.
quelle
1

Mit Ausnahme des automatischen Downloads der Datei (da dies ein Dialogfeld ist) wird dies in einem Gewinnformular mit der eingebetteten Websteuerung ausgeführt.

Sie könnten sich Watin und Watin Recorder ansehen . Sie können mit C # -Code helfen, der sich auf Ihrer Website anmelden, zu einer URL navigieren und möglicherweise sogar den Dateidownload automatisieren kann.

YMMV allerdings.

Wayne
quelle
1

Wenn die Links bekannt sind (z. B. müssen Sie die Seite nicht nach ihnen durchsuchen), können Sie sie wahrscheinlich verwenden wget. Ich glaube, dass es das Staatsmanagement über mehrere Abrufe hinweg erledigen wird.

Wenn Sie etwas unternehmerischer sind, würde ich mich mit den neuen Extras in Python 3.0 befassen . Sie haben die Schnittstelle zu ihrem HTTP-Stack überarbeitet und meiner Meinung nach eine sehr schöne Schnittstelle , die für diese Art von Skripten anfällig ist.

D. Shawley
quelle
1

Node.js mit YUI auf dem Server. Schauen Sie sich dieses Video an: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

Der Typ in diesem Video, Dav Glass, zeigt ein Beispiel dafür, wie er mit Node eine Seite von Digg abruft. Dann befestigte er YUI an dem DOM, das er sich schnappte, und kann es vollständig manipulieren.

j03m
quelle
0

Sie können Watir mit Ruby oder Watin mit Mono verwenden.

Paco
quelle
0

Sie können auch Live-HTTP-Header (Firefox-Erweiterung) verwenden, um Header aufzuzeichnen, die an die Site gesendet werden (Login -> Links -> Download Link) und diese dann mit fsockopen mit PHP zu replizieren. Das einzige, was Sie wahrscheinlich ändern müssen, ist der Wert des Cookies, den Sie von der Anmeldeseite erhalten.

Alekc
quelle
0

libCURL könnte verwendet werden, um so etwas zu erstellen.

Adam Pierce
quelle
0

Können Sie nicht einfach einen Download-Manager verwenden?

Es gibt bessere, aber FlashGet verfügt über eine Browser-Integration und unterstützt die Authentifizierung. Sie können sich anmelden, auf eine Reihe von Links klicken, diese in die Warteschlange stellen und den Download planen.

Sie könnten etwas schreiben, das beispielsweise als Proxy fungiert, der bestimmte Links abfängt und für den späteren Download in die Warteschlange stellt, oder ein Javascript-Lesezeichen, das die zu ändernden Links ändert "http://localhost:1234/download_queuer?url=" + $link.href dass die Downloads in diese Warteschlange gestellt werden - aber Sie würden den Download-Manager neu erfinden -Rad, und mit Authentifizierung kann es komplizierter sein ..

Wenn Sie möchten, dass das Bit "Anmelden, Klicken auf Links" auch automatisiert wird, schauen Sie sich das Scraping von Bildschirmen an Sie sich das . Grundsätzlich laden Sie die Seite über eine HTTP-Bibliothek, suchen die Download-Links und laden sie herunter.

Leicht vereinfachtes Beispiel mit Python:

import urllib
from BeautifulSoup import BeautifulSoup
src = urllib.urlopen("http://%s:%[email protected]" % ("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)

Das würde jeden Link auf example.com herunterladen, nachdem er sich mit dem Benutzernamen / Passwort von "Benutzername" und "Passwort" authentifiziert hat. Sie können natürlich mithilfe der HTML-Auswahl von BeautifulSoup spezifischere Links finden (z. B. können Sie alle Links mit der Klasse "Download" oder URLs finden, die mit beginnen http://cdn.example.com).

Sie können das gleiche in so ziemlich jeder Sprache tun.

dbr
quelle
0

.NET enthält System.Windows.Forms.WebBrowser . Sie können eine Instanz davon erstellen, sie an eine URL senden und dann den HTML-Code auf dieser Seite einfach analysieren. Sie können dann allen gefundenen Links usw. folgen.

Ich habe mit diesem Objekt nur minimal gearbeitet, daher bin ich kein Experte, aber wenn Sie bereits mit .NET vertraut sind, lohnt es sich wahrscheinlich, es zu untersuchen.

goric
quelle