2012-03-16 14 views
6

Estoy tratando de descargar algunos PDF automáticamente en un sitio (http://bibliotecadigitalhispanica.bne.es) usando Python.Ejecutando JavaScript en href de enlaces con Python

He intentado utilizar los módulos urllib/urllib2/mechanize (que he estado usando para otros sitios: esto incluye las funciones estándar como urlopen, urlretrieve, etc.), pero aquí, los enlaces tienen JavaScript incrustado en su atributos href que procesan y abren el PDF, que estos módulos parecen no poder manejar, al menos según lo que he leído aquí. Por ejemplo, cuando lo haga lo siguiente:

request = mechanize.Request('the example url below') 
response = mechanize.urlopen(request) 

que acaba de volver a la página HTML que contiene - Yo sólo parece que no puede extraer el archivo PDF (no hay enlaces a la misma dentro de esa página, tampoco).

Sé mirando los encabezados en un navegador real (usando la extensión LiveHTTPHeaders en Firefox) que se realizan muchas solicitudes HTTP y, finalmente, se devuelve el PDF (y se muestra en el navegador). Me gustaría poder interceptar esto y descargarlo. Concretamente, recibo una serie de 302 y 304 respuestas, que finalmente conducen al PDF.

Aquí hay un ejemplo de un atributo de enlace que estoy rastreando: href = 'javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess");'

Parece que si ejecuto este JavaScript incrustado en el atributo href, eventualmente puedo llegar al documento PDF en sí. Lo he intentado con selenio, pero es un poco confuso; no estoy seguro de cómo usarlo al leer su documentación. ¿Alguien puede sugerir una forma (ya sea a través de un módulo que no he probado o por medio de uno que tengo) de que pueda hacer esto?

Muchas gracias por cualquier ayuda con esto.

PD: en caso de que le gustaría ver lo que estoy tratando de replicar, estoy tratando de acceder a los enlaces mencionados anteriormente PDF en la página siguiente (los que tienen los iconos PDF) :): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

podría usar una expresión regular para extraer el uri? – max

+0

He intentado hacer esto también, sacando el URI desde dentro de la llamada a la función de JavaScript y luego tratando de acceder a eso con mechanize y urllib2, pero hasta ahora no tuve suerte - me devolvió la página html que contiene: -/From viewing viewing los encabezados, parece que se realizan muchas solicitudes con este URI, incluidos algunos redireccionamientos. ¿Hay alguna forma de obtener todas estas respuestas? Tal vez eso también podría resolver el problema. Gracias por la respuesta, por cierto. – spanport

+0

ACTUALIZACIÓN: terminé encontrando una forma de evitarlo en este sitio en particular al encontrar la estructura de las URL que estaban más cerca de los archivos PDF y luego redireccionar desde esos. ¡Aclamaciones! – spanport

Respuesta

1

javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 & propietario = resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 = & usuario INVITADO & pds_handle = & pid = 1673416 & con_lng = SPA & rd_session = ht tp: //bibliotecadigitalhispanica.bne.es: 80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416 ");

Esa URL lleva a una página de 302. Si lo sigues, terminas en una página de marco, donde el marco inferior es la página de contenido.

http://bibliotecadigitalhispanica.bne.es///exlibris/dtl/d3_1/apache_media/L2V4bGlicmlzL2R0bC9kM18xL2FwYWNoZV9tZWRpYS8xNjczNDE2.pdf

(lib) enrollamiento puede seguir 302 páginas.

Javascript no es el problema hasta el momento. Luego está en single_viewer_toolbar2.jsp, donde la función setLabelMetadataStream reúne la url para el pdf, antes de enviarla a su iframe "sendRequestIFrame".

veo 3 posibilidades:

  1. el enfoque Javascript ejecución: de alta complejidad, que tenga que programar un montón de código, probablemente frágiles
  2. algo basado en un navegador: El selenio es probablemente bueno. Sé que elinks2 tiene soporte para JavaScript, y de acuerdo con su página wikipedia puede ser guionizado en "Perl, Ruby, Lua y GNU Guile".
  3. Solicite ayuda al administrador de la web. Deberías hacer esto de todos modos para entender su política/actitud hacia los bots. Quizás puedan proporcionarle a usted (y a otros) una interfaz/API.

Recomiendo aprender más sobre Selenium, parece ser el más fácil.

+0

+1 para Selenium, que es probablemente la solución más sana (menos trabajo). Y otro +1 para "preguntar al administrador". –

+0

Lo tengo trabajando. ¡Gracias! – spanport

Cuestiones relacionadas