2009-05-02 9 views
65

Me gustaría hacer lo siguiente. Inicie sesión en un sitio web, haga clic en un par de enlaces específicos, luego haga clic en un enlace de descarga. Me gustaría ejecutar esto como una tarea programada en Windows o trabajo cron en Linux. No soy exigente con el idioma que uso, pero me gustaría que esto se ejecute sin poner una ventana del navegador en la pantalla si es posible.navegador de internet sin cabeza?

+1

¿Por qué crear una instancia de un navegador si no va a mostrarlo? Hay bibliotecas en la mayoría de los idiomas para transferir archivos a través de URL. Cuéntanos tu lenguaje de implementación y podemos señalarte la dirección correcta. –

+3

También díganos si va a necesitar soporte de JavaScript, porque esto es importante. Algunas bibliotecas no tienen intérpretes JS incorporados. – Anonymous

Respuesta

2

Lo hice una vez usando el control ActiveX de Internet Explorer (WebBrowser, MSHTML). Puedes instanciarlo sin hacerlo visible.

Esto se puede hacer con cualquier lenguaje que soporte COM (Delphi, VB6, VB.net, C#, C++, ...)

Por supuesto, esto es una solución rápida y sucia, y podría no ser apropiado en su situación.

1

Excepto por la descarga automática del archivo (ya que es un cuadro de diálogo), un formulario de victoria con el webcontrol incorporado lo hará.

Puede consultar Watin y Watin Recorder. Pueden ayudar con el código C# que puede iniciar sesión en su sitio web, navegar a una URL y posiblemente incluso ayudar a automatizar la descarga del archivo.

YMMV though.

1

Si los enlaces son conocidos (por ejemplo, no tiene que buscarlos en la página), entonces probablemente pueda usar wget. Creo que hará la gestión del estado en múltiples recuperaciones.

Si eres un poco más emprendedor, entonces profundizaría en los nuevos objetos en Python 3.0. Redirigieron la interfaz a su pila HTTP y, en mi humilde opinión, tienen un very nice interface que es susceptible a este tipo de secuencias de comandos.

0

También puede usar Live Http Headers (extensión de Firefox) para registrar encabezados que se envían al sitio (Inicio de sesión -> Enlaces -> Enlace de descarga) y luego repítalos con php usando fsockopen. Lo único que probablemente necesite variar es el valor de la cookie que recibe de la página de inicio de sesión.

0

libCURL podría utilizarse para crear algo como esto.

0

¿No puede simplemente usar un administrador de descargas?

Hay mejores, pero FlashGet tiene integración de navegador y admite autenticación. Puede iniciar sesión, hacer clic en un grupo de enlaces, ponerlos en cola y programar la descarga.

Podría escribir algo que, digamos, actúe como un proxy que capture enlaces específicos y los ponga en cola para su posterior descarga, o un bookmarklet de Javascript que modifique los enlaces para ir a "http://localhost:1234/download_queuer?url=" + $link.href y tenga las descargas en cola, pero estaría reinventar la rueda de administrador de descargas, y con autenticación puede ser más complicado ...

O, si desea que el bit de "inicio de sesión, haga clic en enlaces" también se automatice - consulte screen-scraping ... Básicamente carga la página a través de una biblioteca HTTP, encuentre los enlaces de descarga y descárguelos ...

ejemplo un poco simplificada, usando 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) 

Eso sería descargar todos los vínculos de example.com, después de la autenticación con el nombre de usuario/contraseña de "nombre de usuario" y "contraseña". Podría, por supuesto, encontrar enlaces más específicos usando BeautifulSoup's selector de HTML (por ejemplo, puede encontrar todos los enlaces con la clase "descargar", o URL que comienzan con http://cdn.example.com).

Usted podría hacer lo mismo en casi cualquier idioma ..

0

.NET contiene System.Windows.Forms.WebBrowser. Puede crear una instancia de esto, enviarla a una URL y luego analizar fácilmente el html en esa página. A continuación, puede seguir todos los enlaces que encuentre, etc.

He trabajado con este objeto solo mínimamente, así que no soy un experto, pero si ya está familiarizado con .NET, entonces probablemente valga la pena investigarlo.

143

Aquí hay una lista de los navegadores sin cabeza, que yo sepa:

  • HtmlUnit - Java. Motor de navegador personalizado. Soporte limitado de JavaScript/DOM emulado. Fuente abierta.
  • Ghost - Python solamente. Basado en WebKit. Soporte completo de JavaScript. Fuente abierta.
  • Twill - Python/línea de comando. Motor de navegador personalizado. Sin JavaScript Fuente abierta.
  • PhantomJS - Línea de comandos/todas las plataformas. Basado en WebKit. Soporte completo de JavaScript. Fuente abierta.
  • Awesomium - C++/.NET/todas las plataformas. A base de cromo. Soporte completo de JavaScript. Comercial/gratis.
  • SimpleBrowser - .NET 4/C#. Motor de navegador personalizado. Sin soporte de JavaScript Fuente abierta.
  • ZombieJS - Node.js. Motor de navegador personalizado. Soporte de JavaScript/DOM emulado. Fuente abierta. Basado en jsdom.
  • EnvJS - JavaScript a través de Java/Rhino. Motor de navegador personalizado. Soporte de JavaScript/DOM emulado. Fuente abierta.
  • Watir-webdriver con headless gem - Ruby a través de WebDriver. Soporte completo de JS a través de navegadores (Firefox/Chrome/Safari/IE).
  • Spynner - Python solamente. PyQT y WebKit.
  • jsdom - Node.js. Motor de navegador personalizado. Admite JS a través de DOM emulado. Fuente abierta.
  • TrifleJS - puerto de PhantomJS utilizando MSIE (Trident) y V8. Fuente abierta.
  • ui4j - Solución Pure Java 8. Una biblioteca de envoltura alrededor del Motor JavaFx WebKit incl. modos sin cabeza.
  • Chromium Embedded Framework - Versión incrustada totalmente actualizada de Chromium con representación fuera de pantalla según sea necesario. C/C++, con .NET wrappers (y otros lenguajes). Como es Chromium, tiene soporte para todo. BSD con licencia.
  • Selenium WebDriver - Soporte completo para JavaScript a través de navegadores (Firefox, IE, Chrome, Safari, Opera).Oficialmente compatibles con bindings son C#, Java, JavaScript, Haskell, Perl, Ruby, PHP, Python, Objective-C y R. Los enlaces no oficiales están disponibles para Qt y Go. Fuente abierta.
  • navegadores

sin cabeza que tienen el soporte de JavaScript a través de un DOM emulado por lo general tienen problemas con algunos sitios que utilizan funciones del navegador más avanzados/oscuros, o que tienen una funcionalidad que tiene dependencias visuales (por ejemplo, a través de posiciones CSS, etc.), así que mientras el soporte de JavaScript puro en estos navegadores generalmente está completo, la funcionalidad real del navegador admitido se debe considerar solo como parcial.

(Nota: La versión original de este post sólo se menciona HtmlUnit, por lo tanto, los comentarios si usted sabe de otras implementaciones de navegador sin cabeza y tienen derechos de edición, se sienten libres para editar este post y añadirlos..)

+0

+1, el soporte JS HTMLUnit es una gran ventaja – orip

+0

Esta parece ser la mejor apuesta que he encontrado hasta ahora en mi búsqueda de un navegador sin cabeza con soporte JS. –

+9

El soporte de JS para HTMLUnit es terrible. no es la respuesta, tengo miedo. – KJW

5

Salida twill, un lenguaje de scripting muy conveniente para precisamente lo que estás buscando. Desde el 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! 

También hay un Python API si usted está buscando una mayor flexibilidad.

1

Node.js con YUI en el servidor. Mira este video: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/

El chico en este video Dav Glass muestra un ejemplo de cómo usa el nodo para buscar una página de Digg. A continuación, conectó YUI al DOM que agarró y puede manipularlo por completo.

2

PhantomJS es un navegador basado en WebKit sin cabeza que pueda guión con JavaScript.

3

Echa un vistazo a PhantomJS, marco de automatización basado en JavaScript disponible para Windows, Mac OS X, Linux, otros sistemas * ix.

Uso PhantomJS, se pueden hacer cosas como esta:

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

o evaluar título de una página :

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

Ejemplos de PhantomJS' Quickstart página. Incluso puede renderizar una página en formato PNG, JPEG o PDF utilizando el método render().

+0

esta respuesta me ayudó a guardar la fuente después de ejecutar javascript .: http://stackoverflow.com/a/32019723/511438 –

+0

Una pregunta bastante tonta, pero tal vez la has probado: ¿Se espera que ** PhantomJS ** trabaje en sitios que requieren nombre de usuario/contraseña? –

Cuestiones relacionadas