2012-03-16 12 views
6

Sto cercando di scaricare alcuni PDF automaticamente su un sito (http://bibliotecadigitalhispanica.bne.es) utilizzando Python.Esecuzione JavaScript a href dei link con Python

Ho provato a utilizzare i moduli urllib/urllib2/mechanize (che ho utilizzato per altri siti: questo include le funzioni standard come urlopen, urlretrieve, ecc.), Ma qui i link hanno JavaScript incorporato nella loro attributi href che fa un po 'di elaborazione e si apre il file PDF, che questi moduli non sembrano essere in grado di gestire, almeno da quello che ho letto qui. Per esempio, quando faccio la seguente:

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

solo tornare la pagina HTML contenente - io proprio non riesco ad estrarre il PDF (non ci sono collegamenti ad esso all'interno di quella pagina, o).

Conosco guardando le intestazioni in un vero browser (usando l'estensione LiveHTTPHeaders in Firefox) che vengono fatte molte richieste HTTP e alla fine il PDF viene restituito (e visualizzato nel browser). Mi piacerebbe essere in grado di intercettare questo e scaricarlo. Concretamente, ottengo una serie di 302 e 304 risposte, che alla fine portano al PDF.

Ecco un esempio di un attributo di collegamento che sto strisciando: href = 'javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess");'

Sembra che se eseguo questo JavaScript incorporato nel href, posso finalmente raggiungere il documento PDF stesso. Ho provato con il selenio, ma è un po 'confuso - non sono abbastanza sicuro di come usarlo leggendo la sua documentazione. Qualcuno può suggerire un modo (sia attraverso un modulo che non ho provato o attraverso uno che ho) che posso farlo?

Grazie mille per qualsiasi aiuto con questo.

PS: nel caso in cui si desidera vedere quello che sto cercando di replicare, sto cercando di accedere ai link di cui sopra in formato PDF della pagina seguente (quelli con le icone in formato PDF) :): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

si potrebbe usare un'espressione regolare per estrarre l'uri? – max

+0

Ho provato a fare anche questo, tirando fuori l'URI da dentro la chiamata di funzione JavaScript e poi cercando di accedere a quella con Mechanize e urllib2, ma senza fortuna finora - semplicemente mi restituisce la pagina html contenente: -/Da visualizzazione le intestazioni, sembra che siano state fatte molte richieste con questo URI, inclusi alcuni reindirizzamenti. C'è un modo per afferrare tutte queste risposte? Forse potrebbe anche risolvere il problema. Grazie per la risposta, a proposito. – spanport

+0

UPDATE: Alla fine ho trovato un modo per aggirarlo su questo particolare sito trovando la struttura degli URL che erano più vicini ai file PDF e quindi reindirizzandoli da quelli. Saluti! – spanport

risposta

1

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

Questo URL porta ad una pagina 302. Se lo segui, finisci in una pagina frame, dove il frame inferiore è la pagina di contenuto.

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

(llb) arricciatura possono seguire 302 pagine.

Javascript non è il problema finora. Allora sei su single_viewer_toolbar2.jsp, dove la funzione setLabelMetadataStream mette insieme l'url per il pdf, prima di inviarlo al suo iframe "sendRequestIFrame".

vedo 3 possibilità:

  1. l'approccio javascript esecuzione: alta complessità, è necessario programmare un sacco di codice, probabilmente fragili
  2. qualcosa sulla base di un browser: Il selenio è probabilmente un bene. So che elinks2 ha il supporto per javascript e, secondo la sua pagina di wikipedia, può essere copiato in "Perl, Ruby, Lua e GNU Guile".
  3. Chiedere aiuto all'amministratore Web. Dovresti farlo comunque per capire la loro politica/atteggiamento nei confronti dei robot. Forse possono fornire (e altri) un'interfaccia/API.

Raccomando di saperne di più sul selenio, sembra il più semplice.

+0

+1 per il selenio, che è probabilmente la soluzione più sana (meno lavoro). E un altro +1 per "chiedere all'amministratore". –

+0

Ho funzionato. Grazie! – spanport

Problemi correlati