automation - tipos - ¿buscador de internet sin cabeza?
tipos de buscadores (14)
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.
¿No puedes 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 tiene esa cola de las descargas, pero estarías reinventando la rueda del gestor de descargas, y con la autenticación puede ser más complicado ...
O bien, si desea que el bit de "inicio de sesión, haga clic en enlaces" también se automatice. Mire en screen-scraping . Básicamente, cargue la página a través de una biblioteca HTTP, encuentre los enlaces de descarga y descárguelos.
Ejemplo ligeramente simplificado, 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 descargaría cada enlace en example.com, luego de autenticar con el nombre de usuario / contraseña de "nombre de usuario" y "contraseña". Podría, por supuesto, encontrar enlaces más específicos utilizando BeautifulSoup''s selectores de HTML BeautifulSoup''s (por ejemplo, podría encontrar todos los enlaces con la clase "descargar" o las URL que comienzan con http://cdn.example.com
).
Podrías hacer lo mismo en casi cualquier idioma ...
.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 los enlaces que encuentre, etc.
He trabajado con este objeto solo mínimamente, así que no soy un experto, pero si ya estás familiarizado con .NET, probablemente valga la pena investigarlo.
Aquí hay una lista de navegadores sin cabeza que conozco:
- 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 comando / 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 gema sin cabeza - 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 usando MSIE (Trident) y V8. Fuente abierta.
- ui4j - ui4j Pure Java 8. Una biblioteca de envoltura alrededor del Motor JavaFx WebKit incl. modos sin cabeza.
- Chromium Embedded Framework : versión incrustada completa actualizada de Chromium con representación fuera de la 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). Las bindings oficialmente compatibles son C #, Java, JavaScript, Haskell, Perl, Ruby, PHP, Python, Objective-C y R. Las uniones no oficiales están disponibles para Qt y Go . Fuente abierta.
Los navegadores sin cabeza que tienen soporte de JavaScript a través de un DOM emulado generalmente tienen problemas con algunos sitios que usan características del navegador más avanzadas / oscuras, o tienen funcionalidades que tienen dependencias visuales (por ejemplo, a través de posiciones de CSS, etc.), mientras que el soporte de JavaScript puro en estos los navegadores generalmente están completos, la funcionalidad real del navegador soportado debe considerarse solo como parcial.
(Nota: la versión original de esta publicación solo menciona HtmlUnit, de ahí los comentarios. Si conoce otras implementaciones de navegadores sin cabeza y tiene derechos de edición, puede editar esta publicación y agregarla).
Echa un vistazo a Twill , un lenguaje de scripting muy conveniente para precisamente lo que estás buscando. De los 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 una examples si buscas más flexibilidad.
Eche un vistazo a PhantomJS , un marco de automatización basado en JavaScript disponible para Windows, Mac OS X, Linux, otros sistemas * ix.
Usando PhantomJS, puedes 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 evalúa el 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 la página de inicio rápido de PhantomJS . Incluso puede representar una página en PNG, JPEG o PDF utilizando el método de render() .
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á.
Podrías mirar 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 sin embargo.
Node.js con YUI en el servidor. Mira este video: http://www.yuiblog.com/blog/2010/09/29/video-glass-node/
El tipo 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.
PhantomJS es un navegador sin cabeza basado en WebKit que puede crear secuencias de comandos con JavaScript.
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 . Rehicieron la interfaz a su pila HTTP y, en mi humilde opinión, tienen una interfaz muy agradable que es susceptible a este tipo de secuencias de comandos.
Si usas PHP, prueba http://mink.behat.org/
También puede usar Live Http Headers (extensión de Firefox) para registrar los encabezados que se envían al sitio (Inicio de sesión -> Enlaces -> Enlace de descarga) y luego reproducirlos 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.
Una vez lo hice usando el control ActiveX de Internet Explorer (WebBrowser, MSHTML). Puedes instanciarlo sin hacerlo visible.
Esto se puede hacer con cualquier lenguaje que admita COM (Delphi, VB6, VB.net, C #, C ++, ...)
Por supuesto, esta es una solución rápida y sucia, y podría no ser apropiada en su situación.
libCURL podría usarse para crear algo como esto.