2012-03-16 5 views
6

Pythonを使用して、いくつかのPDFをサイト(http://bibliotecadigitalhispanica.bne.es)に自動的にダウンロードしようとしています。PythonとのリンクのhrefでJavaScriptを実行

私はurllib/urllib2/mechanizeモジュール(これは他のサイトに使用しています:これにはurlopen、urlretrieveなどの標準機能が含まれています)を使用しようとしましたが、リンクにはJavaScriptが埋め込まれていますいくつかの処理を行い、少なくとも私がここで読んだことから、これらのモジュールは扱えないように見えるPDFを開きます。例えば、私が行うときは、次の

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

+0

私はこれをやってみましたが、JavaScript関数呼び出しの中からURIを引き出し、mechanizeとurllib2を使ってアクセスしようとしましたが、今まで運がなかったので、含まれているHTMLページを返します: - /ヘッダー、いくつかのリダイレクトを含む多くの要求がこのURIで行われたようです。これらすべての対応をとる方法はありますか?おそらくこれも問題を解決するかもしれない。ところで、ありがとうございました。 – spanport

+0

更新:この特定のサイトで、PDFファイルに最も近いURLの構造を見つけてからリダイレクトする方法を見つけました。乾杯! – spanport

答えて

1

のjavascript:open_window_delivery(「http://bibliotecadigitalhispanica.bne.es:80/webclient/DeliveryManager?application=DIGITOOL-3 &所有者= resourcediscovery & custom_att_2 = simple_viewer & forebear_coll = 1333 &ユーザー= GUEST & 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にあります。ここで、関数setLabelMetadataStreamは、iframe "sendRequestIFrame"に送信する前に、pdfのURLをまとめています。セレンはおそらく良いです:コードの多く、おそらく脆性ブラウザに基づいて

  • 何かをプログラムする必要があり、高い複雑:

    1. javascriptの実行のアプローチ:

      は、私は3つの可能性を参照してください。私はelinks2がjavascriptをサポートしていることを知っています。ウィキペディアのページによれば、 "Perl、Ruby、Lua、GNU Guile"でスクリプト化することができます。

    2. ウェブ管理者に問い合わせてください。ボットの方針や態度を理解するには、これをやってください。おそらく彼らはあなた(そして他の人たち)にインターフェース/ APIを提供することができます。

    セレンについてもっと知ることをお勧めします。最も簡単なようです。

  • +0

    +1(セレンのための+1)おそらく最も穏やかな(最も仕事の少ない)解決策です。もう1つは「管理者に尋ねる」です。 –

    +0

    これは機能しています。ありがとう! – spanport

    関連する問題