2012-03-16 42 views
6

Tôi đang cố tải xuống một số tệp PDF tự động trên trang web (http://bibliotecadigitalhispanica.bne.es) bằng cách sử dụng Python.Thực thi JavaScript trong href liên kết với Python

Tôi đã thử sử dụng các mô-đun urllib/urllib2/mechanize (mà tôi đã sử dụng cho các trang web khác: điều này bao gồm các hàm chuẩn như urlopen, urlretrieve, v.v.), nhưng ở đây, các liên kết có JavaScript được nhúng trong href thuộc tính mà làm một số chế biến và mở ra các PDF, mà các mô-đun này dường như không thể xử lý, ít nhất là từ những gì tôi đã đọc ở đây. Ví dụ: khi tôi làm như sau:

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

nó chỉ lấy lại trang HTML có chứa - Tôi dường như không thể trích xuất PDF (không có liên kết nào bên trong trang đó).

Tôi biết bằng cách xem qua các tiêu đề trong trình duyệt thực (sử dụng phần mở rộng LiveHTTPHeaders trong Firefox) có rất nhiều yêu cầu HTTP được thực hiện và cuối cùng là PDF được trả lại (và được hiển thị trong trình duyệt). Tôi muốn có khả năng ngăn chặn điều này và tải xuống. Cụ thể, tôi nhận được một loạt các câu trả lời 302 và 304, cuối cùng dẫn đến tệp PDF.

Dưới đây là ví dụ về thuộc tính liên kết mà tôi đang thu thập dữ liệu: href = 'javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess");'

Dường như nếu tôi thực thi JavaScript này được nhúng trong thuộc tính href, cuối cùng tôi có thể tiếp cận tài liệu PDF. Tôi đã thử với selen, nhưng nó là một chút khó hiểu - Tôi không hoàn toàn chắc chắn làm thế nào để sử dụng nó khi đọc tài liệu của nó. Ai đó có thể đề nghị một cách (hoặc thông qua một mô-đun tôi đã không cố gắng hoặc thông qua một mà tôi có) mà tôi có thể làm điều này?

Cảm ơn bạn rất nhiều vì đã giúp đỡ về điều này.

PS: trong trường hợp bạn muốn nhìn thấy những gì tôi đang cố gắng để tái tạo, tôi đang cố gắng để truy cập vào liên kết PDF nêu trên ở trang sau (những người với các biểu tượng PDF) :): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

bạn có thể sử dụng cụm từ thông dụng để trích xuất uri không? – max

+0

Tôi cũng đã thử làm điều này, kéo URI từ bên trong lời gọi hàm JavaScript và sau đó cố gắng truy cập với cơ chế hóa và urllib2, nhưng không may mắn cho đến nay - nó chỉ cho tôi trở lại trang chứa html: -/Từ xem các tiêu đề, có vẻ như rất nhiều yêu cầu được thực hiện với URI này, bao gồm một số chuyển hướng. Có cách nào để lấy tất cả các phản ứng này không? Có lẽ điều đó cũng có thể giải quyết vấn đề. Cảm ơn bạn đã phản ứng, bằng cách này. – spanport

+0

CẬP NHẬT: Tôi đã kết thúc tìm một cách xung quanh nó trên trang web cụ thể này bằng cách tìm cấu trúc của URL gần nhất với tệp PDF và sau đó chuyển hướng từ những tệp đó. Chúc mừng! – spanport

Trả lời

1

javascript: open_window_delivery ("http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 & chủ sở hữu = resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 & user = KHÁCH & pds_handle = & pid = 1.673.416 & con_lng = SPA & rd_session = ht tp: //bibliotecadigitalhispanica.bne.es: 80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416 ");

URL đó dẫn đến trang 302. Nếu bạn làm theo nó, bạn kết thúc ở một trang khung, nơi khung dưới cùng là trang nội dung.

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

(lib) curl có thể làm theo 302 trang.

Javascript không phải là vấn đề cho đến nay. Sau đó, bạn đang ở single_viewer_toolbar2.jsp, trong đó hàm setLabelMetadataStream đặt cùng url cho pdf, trước khi gửi cho iframe "sendRequestIFrame" của nó.

Tôi thấy 3 khả năng:

  1. cách tiếp cận javascript thực hiện: độ phức tạp cao, cần phải lập trình rất nhiều mã, có lẽ giòn
  2. Something dựa trên trình duyệt: Selenium có lẽ là tốt. Tôi biết elinks2 có hỗ trợ javascript, và theo trang wikipedia của nó nó có thể được kịch bản trong "Perl, Ruby, Lua và GNU Guile".
  3. Yêu cầu quản trị viên web trợ giúp. Bạn nên làm điều này dù sao để hiểu chính sách/thái độ của họ đối với bot. Có lẽ họ có thể cung cấp cho bạn (và những người khác) với một giao diện/API.

Tôi khuyên bạn nên tìm hiểu thêm về Selenium, có vẻ như dễ nhất.

+0

+1 cho Selenium, có lẽ là giải pháp lành mạnh nhất (ít nhất là công việc). Và +1 khác cho "hỏi quản trị viên". –

+0

Có hoạt động. Cảm ơn! – spanport

Các vấn đề liên quan