2012-03-16 22 views
6

Próbuję pobrać niektóre pliki PDF automatycznie na stronę (http://bibliotecadigitalhispanica.bne.es) za pomocą Pythona.Wykonywanie JavaScript w hrefach łączy z Pythonem

Próbowałem używać modułów urllib/urllib2/mechanize (których używałem w innych serwisach: obejmuje to standardowe funkcje, takie jak urlopen, urlretrieve, itp.), Ale tutaj linki mają wbudowane JavaScript w ich atrybuty href, które przetwarzają niektóre pliki i otwierają plik PDF, który wydaje się nie być w stanie obsłużyć tych modułów, przynajmniej z tego, co przeczytałem tutaj. Na przykład, kiedy należy wykonać następujące czynności:

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

po prostu odzyskać zawierającego stronę HTML - Ja po prostu nie może wydawać się, aby wyodrębnić plik PDF (nie ma linki do niego wewnątrz tej stronie, albo).

Wiem, przeglądając nagłówki w prawdziwej przeglądarce (używając rozszerzenia LiveHTTPHeaders w przeglądarce Firefox), że wiele żądań HTTP jest wykonywanych, a ostatecznie plik PDF jest zwracany (i wyświetlany w przeglądarce). Chciałbym móc to przechwycić i pobrać. Konkretnie, otrzymuję serię 302 i 304 odpowiedzi, prowadzących ostatecznie do pliku PDF.

Oto przykład atrybutu linku, który indeksuję: href = 'javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess");'

Wygląda na to, że jeśli wykonam ten JavaScript osadzony w atrybucie href, w końcu uda mi się dotrzeć do samego dokumentu PDF. Próbowałem z selenem, ale jest to trochę mylące - nie jestem pewien, jak go użyć po przeczytaniu jego dokumentacji. Czy ktoś może zaproponować sposób (albo przez moduł, którego nie próbowałem, albo przez taki, który mam), że mogę to zrobić?

Dziękuję bardzo za pomoc w tej sprawie.

PS: w przypadku chcesz zobaczyć, co staram się replikować, Próbuję uzyskać dostęp do linków PDF wyżej wymienionych na następnej stronie (te z ikonami PDF) :): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

możesz użyć wyrażenia regularnego, aby wyodrębnić uri? – max

+0

Próbowałem również zrobić to, wyciągając URI z wewnątrz wywołania funkcji JavaScript, a następnie próbując uzyskać do niego dostęp za pomocą mechanizmu i urllib2, ale bez powodzenia - po prostu daje mi z powrotem stronę zawierającą html: -/From viewing w nagłówkach wygląda na to, że za pomocą tego identyfikatora URI wykonuje się wiele żądań, w tym niektóre przekierowania. Czy istnieje sposób na uzyskanie tych wszystkich odpowiedzi? Być może to może rozwiązać problem. Dziękuję za odpowiedź. – spanport

+0

AKTUALIZACJA: W końcu znalazłem sposób obejścia tego w tej witrynie, znajdując strukturę adresów URL, które znajdowały się najbliżej plików PDF, a następnie przekierowując z nich. Twoje zdrowie! – spanport

Odpowiedz

1

javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 & właściciel = resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 & user = GOŚĆ & pds_handle = & pid = 1673416 & con_lng = SPA & rd_session = ht tp: //bibliotecadigitalhispanica.bne.es: 80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416 ");

Ten adres URL prowadzi do strony 302. Jeśli pójdziesz za nim, skończysz na stronie ramki, gdzie dolna ramka jest stroną treści.

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

(Ilb) zwijają może obserwować 302 stron.

Javascript nie jest problemem do tej pory. Następnie jesteś na single_viewer_toolbar2.jsp, gdzie funkcja setLabelMetadataStream łączy adres URL pliku pdf, przed przesłaniem go do elementu iframe "sendRequestIFrame".

widzę 3 możliwości:

  1. podejścia javascript wykonanie: wysokiej złożoności, należy zaprogramować dużo kodu, prawdopodobnie kruchych
  2. Coś oparty na przeglądarce: Selen jest prawdopodobnie dobry. Wiem, że elinks2 ma wsparcie dla javascript i zgodnie ze stroną wikipedii może być napisany w "Perlu, Ruby, Lua i GNU Guile".
  3. Poproś administratora sieci o pomoc. Powinieneś to zrobić w każdym razie, aby zrozumieć swoją politykę/podejście do botów. Być może mogą dostarczyć ci (i innym) interfejs/API.

Polecam, aby dowiedzieć się więcej o Selenie, wydaje się najłatwiejszy.

+0

+1 dla Selenium, który jest prawdopodobnie najbardziej rozsądnym (najmniej pracującym) rozwiązaniem. I jeszcze +1 za "zapytaj administratora". –

+0

Gotowy do pracy. Dzięki! – spanport