webentwicklung-frage-antwort-db.com.de

kopfloser Internetbrowser?

Ich würde gerne folgendes machen. 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.

68
Jared

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

  • HtmlUnit - Java. Benutzerdefinierte Browser-Engine. Eingeschränkte JavaScript-Unterstützung/DOM-Emulation. Open Source.
  • Ghost - Python. WebKit-basiert. Volle JavaScript-Unterstützung. Open Source.
  • Twill - Python/Befehlszeile. 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 headless gem - Ruby über WebDriver. Volle JS-Unterstützung über Browser (Firefox/Chrome/Safari/IE).
  • Spynner - Python. PyQT und WebKit.
  • jsdom - Node.js. Benutzerdefinierte Browser-Engine. Unterstützt JS über emuliertes DOM. Open Source.
  • TrifleJS - Portierung von PhantomJS mit MSIE (Trident) und V8. Open Source.
  • i4j - Pure Java 8 solution. Eine Wrapper-Bibliothek rund um die JavaFx WebKit Engine inkl. Headless-Modi.
  • Chromium Embedded Framework - Vollständige, aktuelle, eingebettete Version von Chromium mit Off-Screen-Rendering 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 verfügbar für Qt und - Go . Open Source.

Headless-Browser, die JavaScript über ein emuliertes DOM unterstützen, haben in der Regel Probleme mit einigen Websites, die erweiterte/undurchsichtige Browserfunktionen verwenden, oder mit Funktionen, die visuelle Abhängigkeiten aufweisen (z. B. über CSS-Positionen usw.) Browser ist in der Regel vollständig, die tatsächlich unterstützten Browserfunktionen sollten nur teilweise berücksichtigt werden.

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

148
Nathan Ridley

Schauen Sie sich twill an, eine sehr praktische Skriptsprache für genau das, wonach Sie suchen. Aus dem Beispiele :

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 ein Python API , wenn Sie mehr Flexibilität wünschen.

5
orip

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 PhantomJS 'Quickstart Seite. Sie können sogar eine Seite in ein PNG, JPEG oder PDF rendern , indem Sie die render () -Methode verwenden.

3
SteAp

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++, ...)

Natürlich ist dies eine schnelle und schmutzige Lösung, die in Ihrer Situation möglicherweise nicht angemessen ist.

2
Daniel Rikowski

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

2
xn.

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, wie er mit node eine Seite aus Digg abruft. Anschließend befestigte er YUI an dem von ihm ergriffenen DOM und kann es vollständig manipulieren.

1
j03m

Wenn Sie PHP - versuchen http://mink.behat.org/

1
everzet

Mit Ausnahme des automatischen Herunterladens der Datei (da dies ein Dialogfeld ist) wird dies in einem Win-Formular mit dem eingebetteten Webcontrol durchgeführt.

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

YMMV obwohl.

1
Wayne

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

Wenn Sie etwas unternehmerischer sind, würde ich in Python 3. auf die neuen Extras eingehen. Sie haben die Schnittstelle zu ihrem HTTP-Stack umgestaltet und haben, IMHO, eine sehr nette Schnittstelle , die für diese Art von Skripten anfällig ist.

1
D.Shawley

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

0
Adam Pierce

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 sie zum späteren Herunterladen in die Warteschlange stellt, oder ein Javascript-Lesezeichen, das die Links so ändert, dass sie zu "http://localhost:1234/download_queuer?url=" + $link.href Wechseln und die Downloads in die Warteschlange stellen erfinde das Download-Manager-Rad neu und mit der Authentifizierung kann es komplizierter werden.

Oder, wenn Sie möchten, dass das Bit "Login, Click-Links" auch automatisiert wird - schauen Sie in Screen-Scraping .. Grundsätzlich laden Sie die Seite über eine HTTP-Bibliothek, suchen die Download-Links und laden sie herunter. .

Ein etwas 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 Sie sich mit dem Benutzernamen/Passwort von "Benutzername" und "Passwort" authentifiziert haben. Sie könnten natürlich mit BeautifulSoup's HTML-Selector's nach spezifischeren Links suchen (zum Beispiel könnten Sie alle Links mit der Klasse "download" oder URLs finden, die mit http://cdn.example.com Beginnen).

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

0
dbr

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

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 sich anzusehen.

0
goric

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

0
Paco

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.

0
Alekc