Выполнение JavaScript в href ссылок с Python - PullRequest
6 голосов
/ 16 марта 2012

Я пытаюсь автоматически загрузить некоторые PDF-файлы на сайт (http://bibliotecadigitalhispanica.bne.es) с использованием Python.

Я пытался использовать модули urllib / urllib2 / mechanize (которые я использовал для другихсайты: это включает в себя стандартные функции, такие как urlopen, urlretrieve и т. д.), но здесь ссылки имеют встроенный JavaScript в свои атрибуты href, который выполняет некоторую обработку и открывает файл PDF, который эти модули, по-видимому, не в состоянии обработатьПо крайней мере, из того, что я прочитал здесь. Например, когда я делаю следующее:

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

это просто возвращает содержащую HTML-страницу - я просто не могу извлечь PDF (естьна этой странице также нет ссылок на него).

Я знаю, просматривая заголовки в реальном браузере (используя расширение LiveHTTPHeaders в Firefox), что выполняется много HTTP-запросов и в конечном итоге возвращается PDF(и отображается в браузере.) Я хотел бы иметь возможность перехватить это и загрузить его. Конкретно, я получаю серию 302 и 304 ответаes, в конечном итоге приводит к PDF.

Вот пример атрибута ссылки, который я сканирую: href = 'javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess");'

Кажется, что если я выполнюэтот JavaScript, встроенный в атрибут href, я могу в конечном итоге получить сам документ PDF.Я пробовал с селеном, но это немного сбивает с толку - я не совсем уверен, как использовать его при чтении документации.Может кто-нибудь предложить способ (или через модуль, который я не пробовал, или через тот, который у меня есть), чтобы я мог сделать это?

Большое спасибо за любую помощь с этим.

PS: если вы хотите увидеть, что я пытаюсь воспроизвести, я пытаюсь получить доступ к ссылкам в формате PDF, упомянутым выше, на следующей странице (с пиктограммами PDF) :): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

1 Ответ

1 голос
/ 19 марта 2012

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

Этот URL ведет на страницу 302. Если вы будете следовать ему, вы окажетесь на странице фрейма, где нижний фрейм - страница контента.

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

(lib) curl может следовать за 302 страницами.

Javascript пока не проблема. Затем вы находитесь по адресу single_viewer_toolbar2.jsp, где функция setLabelMetadataStream собирает URL-адрес для файла PDF, прежде чем отправить его в свой iframe «sendRequestIFrame».

Я вижу 3 варианта:

  1. подход к выполнению javascript: высокая сложность, требуется много кода для программирования, возможно, хрупкий
  2. Нечто, основанное на браузере: Selenium, вероятно, хорош. Я знаю, что у elinks2 есть поддержка javascript, и в соответствии с его страницей в википедии это может быть написано в "Perl, Ruby, Lua и GNU Guile".
  3. Обратитесь за помощью к веб-администратору. Вы должны сделать это в любом случае, чтобы понять их политику / отношение к ботам. Возможно, они могут предоставить вам (и другим) интерфейс / API.

Я рекомендую узнать больше о Selenium, он кажется самым простым.

...