Hoy, el rastreo web es una tecnología bien conocida, pero todavía hay muchas complejidades. Los rastreadores web simples siguen siendo difíciles de competir con los sitios web modernos desarrollados por varias tecnologías complejas como la capacitación AJAX, XMLHTTPREQUEST, WebSockets, Flash Sockets, etc.
Tomemos nuestras necesidades básicas en el proyecto HubDoc como ejemplo, en el que rastreamos el monto de la factura, la fecha de vencimiento, el número de cuenta y lo más importante: PDF de facturas recientes de los sitios web de bancos, servicios públicos y compañías de tarjetas de crédito. Para este proyecto, comencé con una solución muy simple (no utilizar el costoso producto comercial que estamos evaluando por el momento), un proyecto simple de rastreadores que solía hacer con Perl en Messagelab/Symantec. Pero los resultados no iban bien, y los spammers hicieron un sitio web mucho más simple que los de los bancos y los servicios públicos.
Entonces, ¿cómo resolver este problema? Comenzamos principalmente con la excelente biblioteca de solicitudes desarrollada con Mikea. Haga una solicitud en el navegador y verifique qué encabezados de solicitud se enviaron en la ventana de la red, y luego copie estos encabezados de solicitud en el código. Este proceso es muy simple. Es solo para rastrear todas las solicitudes desde el inicio de sesión hasta la descarga del archivo PDF y luego simular todas las solicitudes de este proceso. Para facilitar las cosas similares y hacer que los desarrolladores web sean más racionales en los programas de rastreadores de escritura, exporté los resultados de HTML a jQuery (usando la biblioteca de trucos ligeros), lo que hizo que un trabajo similar fuera simple y fuera más fácil usar el selector CSS para seleccionar elementos en una página. Todo el proceso está envuelto en un marco, que también puede hacer un trabajo adicional, como recoger certificados de la base de datos, cargar robots individuales y comunicarse con la interfaz de usuario a través de Socket.io.
Esto funciona para algunos sitios web, pero es solo un script JS, no mi código Node.js que estas compañías colocan en su sitio. Pueden colocar los problemas sobrantes para abordar la complejidad, lo que le dificulta mucho saber qué hacer para obtener el punto de información de inicio de sesión. Para algunos sitios intenté obtenerlo combinándolo con la biblioteca request () durante unos días, pero todavía era en vano.
Después de casi bloquear, descubrí Node-PhantomJS, una biblioteca que me permite controlar el navegador WebKit sin cabeza de PhantomJS desde el nodo (nota del traductor: no esperaba un sustantivo correspondiente. Significa que la página de renderizado se completa en segundo plano sin mostrar el dispositivo). Esto parece una solución simple, pero hay algunos problemas que PhantomJs no puede evitar:
1.phantomJS solo puede decirle si la página ha sido cargada, pero no puede determinar si hay redirección (redirección) implementada a través de JavaScript o metaets en este proceso. Especialmente cuando JavaScript usa setTimout () para retrasar las llamadas.
2.PhantomJS le proporciona un gancho de pageloadstoaded que le permite lidiar con los problemas mencionados anteriormente, pero esta función solo puede reducir este número cuando determina el número de páginas para cargar, reducir este número cuando cada página está cargada y proporcionar procesamiento para posibles tiempos de espera (porque esto no siempre sucede), de modo que cuando su número se reduce a 0, se puede llamar a su función de devolución. Este método puede funcionar, pero siempre hace que las personas se sientan un poco como un hacker.
3.PhantomJS requiere un proceso completo e independiente para que cada página se rastree, porque si este no es el caso, es imposible separar las cookies entre cada página. Si está utilizando el mismo proceso PhantomJS, la sesión en la página que se ha registrado se enviará a otra página.
4. No se puede usar PhantomJS para descargar recursos: solo puede guardar la página como PNG o PDF. Esto es útil, pero significa que debemos recurrir a solicitar () para descargar el PDF.
5. Debido a las razones anteriores, tengo que encontrar una manera de distribuir cookies de la sesión de PhantomJS a la biblioteca de Session of Solic (). Simplemente distribuya la cadena de documentos.
6. Inyectar variables en la sesión del navegador no es fácil. Para hacer esto, necesito crear una cadena para crear una función JavaScript.
La copia del código es la siguiente:
Robot.prototype.add_page_data = function (página, nombre, datos) {
Page.Evaluate (
"function () {var" + nombre + "= ventana". + name + "=" + json.stringify (data) + "}"
);
}
7. Algunos sitios web siempre están llenos de código como Console.log (), y deben redefinirse y emitir la ubicación que queremos. Para lograr esto, hice esto:
La copia del código es la siguiente:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendChild (iframe);
console = window.frames [0] .console;
}
8. Algunos sitios web siempre están llenos de código como console.log (), y deben redefinirse y emitir la ubicación que queremos. Para lograr esto, hice esto:
La copia del código es la siguiente:
if (! console.log) {
var iframe = document.createElement ("iframe");
document.body.appendChild (iframe);
console = window.frames [0] .console;
}
9. No es fácil decirle al navegador que hice clic en la etiqueta A. Para lograr estas cosas, agregué el siguiente código:
La copia del código es la siguiente:
var clickElement = window.clickelement = function (id) {
var a = document.getElementById (id);
var e = document.createEvent ("MouseEvents");
E.InitMouseEvent ("Haga clic", Verdadero, Verdadero, Ventana, 0, 0, 0, 0, Falso, Falso, Falso, Falso, 0, NULL);
a.dispatchevent (e);
};
10. También necesito limitar la concurrencia máxima de la sesión del navegador para garantizar que no explotaremos el servidor. Aun así, esta limitación es mucho más alta que las costosas soluciones comerciales que pueden ofrecer. (Nota del traductor: es decir, la concurrencia de una solución comercial es mayor que la de esta solución)
Después de todo el trabajo, tengo una solución de rastreador relativamente decente para la solicitud PhantomJS +. Debe iniciar sesión con PhantomJS antes de poder volver a la solicitud de solicitud (). Utilizará cookies establecidas en PhantomJS para verificar la sesión iniciada. Esta es una gran victoria porque podemos usar la transmisión de solicitud () para descargar el archivo PDF.
Todo el plan es hacer que sea relativamente fácil para los desarrolladores web comprender cómo usar selectores JQuery y CSS para crear rastreadores para diferentes sitios web. No he demostrado con éxito que esta idea sea factible, pero creo que sucederá pronto.