2012-03-16 93 views
6

我想使用Python在網站上自動下載一些PDF(http://bibliotecadigitalhispanica.bne.es)。我試過使用urllib/urllib2 /機械化模塊(我一直在使用其他網站:這包括像urlopen,urlretrieve等標準功能),但在這裏,鏈接的JavaScript嵌入其中href屬性進行一些處理並打開PDF,這些模塊似乎無法處理,至少從我在這裏閱讀的內容中可以看出。例如,當我做到以下幾點:使用Python執行JavaScript鏈接href中的鏈接

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

它拿回包含HTML頁面只是 - 我似乎無法提取PDF(有一些頁面中沒有它的鏈接,要麼)。

我通過查看真實瀏覽器中的標題(使用Firefox中的LiveHTTPHeaders擴展)知道發出了很多HTTP請求並最終返回PDF(並顯示在瀏覽器中)。我希望能夠攔截並下載它。具體而言,我得到了一系列302和304響應,最終導致PDF。

以下是我正在抓取的鏈接屬性示例: href ='javascript:open_window_delivery(「http://bibliotecadigitalhispanica.bne.es:80/verylonglinktoaccess」);'

看來,如果我執行嵌入到href屬性中的JavaScript,我最終可以到達PDF文檔本身。我嘗試過使用硒,但它有點混亂 - 我不太清楚在閱讀文檔時如何使用它。有人可以提出一種方法(通過我沒有嘗試過的模塊或通過我擁有的模塊),我可以做到這一點嗎?

非常感謝您對此有任何幫助。

PS:如果你想看到什麼,我試圖複製,我試圖訪問以下網頁上面提到的PDF鏈接(與PDF圖標的):): http://bibliotecadigitalhispanica.bne.es/R/9424CFL1MDQGLGBB98QSV1HFAD2APYDME4GQKCBSLXFX154L4G-01075?func=collections-result&collection_id=1356

+0

你能用正則表達式來提取uri嗎? – max 2012-03-16 13:25:10

+0

我也試過這樣做,從JavaScript函數調用中提取URI,然後嘗試訪問機械和urllib2,但目前爲止沒有運氣 - 它只是讓我回到包含HTML頁面: - /從查看頭部,它看起來好像有很多請求都是使用這個URI進行的,包括一些重定向。有沒有辦法抓住所有這些迴應?也許這也可能解決這個問題。順便謝謝你的回覆。 – spanport 2012-03-17 00:14:08

+0

更新:通過查找最接近PDF文件的URL的結構,然後從這些文件進行重定向,我最終在該特定網站上找到了解決方法。乾杯! – spanport 2012-03-17 13:41:57

回答

1

的javascript:open_window_delivery(「http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 &所有者= resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 &用戶=來賓& pds_handle = & PID = 1673416 & con_lng = SPA & rd_session = ht TP://bibliotecadigitalhispanica.bne.es:80/R/7IUR42HNR5J19AY1Y3QJTL1P9M2AN81RCY4DRFE8JN5T22BI7I-03416" );

該URL導致302頁面。如果你遵循它,你最終會出現在一個框架頁面,其中底部框架是內容頁面。

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

(LIB)捲曲可以按照302頁。

JavaScript是不是問題到目前爲止。然後你在single_viewer_toolbar2.jsp中,在將函數提交給它的iframe「sendRequestIFrame」之前,函數setLabelMetadataStream將pdf的url放在一起。

我看到3種可能性:

  1. 的JavaScript的執行方法:高複雜性,需要編寫大量的代碼,可能脆
  2. 東西基於瀏覽器:硒可能是好的。我知道elinks2有javascript支持,根據它的維基百科頁面,它可以在「Perl,Ruby,Lua和GNU Guile」中編寫腳本。
  3. 請求網絡管理員尋求幫助。無論如何,你應該這樣做,以瞭解他們對機器人的政策/態度。也許他們可以爲你(和其他人)提供一個接口/ API。

我推薦學習更多關於硒的知識,看起來最簡單。

+0

Selenium的+1,這可能是最理智的(最少工作)解決方案。另一個爲「詢問管理員」+1。 – 2012-03-19 04:09:12

+0

得到它的工作。謝謝! – spanport 2012-04-01 21:24:31