1


0

Pythonを使用して、URLで明示的に参照されていないドキュメントをダウンロードする

特定のドキュメントを検索し、後で分類するためにそれらをダウンロードするBing APIを使用して、Python 2.6でWebクローラーを作成しました。 文字列メソッドと `urllib.urlretrieve()`を使用して、URLが.pdf、.psなどで終わる結果をダウンロードしてきましたが、次のようなURLの後ろにドキュメントが「隠れている」場合、問題が発生します。

だから、2つの質問。 URLにpdf / docなどがあるかどうかを確認する一般的な方法はありますか 明示的にリンクしていない場合にリンクしているファイル(例: www.domain.com/file.pdf)? Pythonにそのファイルをスナッグさせる方法はありますか?

編集:返信いただきありがとうございます。そのいくつかは、ファイルをダウンロードして正しいタイプかどうかを確認するよう提案しています。 唯一の問題は・・・ その方法がわかりません(上記の質問2を参照)。 `urlretrieve()`は、同じURLを含むhrefを持つhtmlファイルのみを提供します。

7 Answer


8


URLから得られる情報を知る方法はありません。 `.pdf`で終わっていても、HTMLや好きなものを提供できます。

HEADリクエストを実行してcontent-typeを確認することができます。これにより、サーバーがあなたに嘘をついていない場合、それがPDFかどうかがわかります。

または、ダウンロードして、取得したものがPDFかどうかを確認することもできます。


3


この場合、「URLで明示的に参照されていないドキュメント」と呼ぶものは、「リダイレクト」と呼ばれるもののようです。 基本的に、サーバーは、別のURLでドキュメントを取得する必要があることを通知します。 通常、pythonのurllibはこれらのリダイレクトを自動的にたどるので、正しいファイルになります。 (および-他の人がすでに言及したように、応答のmime-typeヘッダーを確認して、それがpdfであるかどうかを確認できます)。

しかし、問題のサーバーはここで奇妙なことをしています。 URLをリクエストすると、別のURLにリダイレクトされます。 他のURLをリクエストすると、再びリダイレクトされます…​ 同じURLに! そしてまた…​ そしてまた…​ ある時点で、urllibはこれで十分であると判断し、無限ループに巻き込まれないようにリダイレクトの追跡を停止します。

それでは、ブラウザを使用してPDFを取得できるようになったのはなぜですか? どうやら、Cookieは、Cookieを有効にしている場合にのみPDFを提供するためです。 (なぜ? サーバーの責任者に尋ねる必要があります…​)Cookieがない場合は、永遠にリダイレクトされ続けます。

(http://docs.python.org/library/urllib2.html[urllib2]およびhttp://docs.python.org/library/cookielib.html[cookielib]モジュールをチェックして、Cookieのサポートを取得してください:http:/ /www.voidspace.org.uk/python/articles/cookielib.shtml [このチュートリアル]が役立つかもしれません)

少なくとも、それが問題の原因だと思います。 まだクッキーを使ってやってみたことがありません。 サーバーが「通常の」ブラウザーを使用していないことを検出するため(この場合、おそらくUser-Agentヘッダーをいじる必要があるため)、サーバーがpdfの提供を「望んでいない」こともありますが、それは奇妙な方法です。 だから私の推測では、「セッションCookie」を使用している場所であり、まだ取得していない場合は、リダイレクトを試行し続けます。


2


既に述べたように、URLからコンテンツタイプを識別する方法はありません。 ただし、すべてのURLのヘッダーを取得してもかまわない場合は、次の操作を実行できます。

obj = urllib.urlopen(URL)

headers = obj.info()
if headers['Content-Type'].find('pdf') != -1:
   # we have pdf file, download whole
...

この方法では、各URLをヘッダーだけをダウンロードする必要はありません。 ネットワークトラフィックを正確に節約することはできませんが、それ以上は向上しません。

また、粗雑なfind( 'pdf')の代わりにmime-typesを使用する必要があります。


0


No. 見ただけでは、どの種類のリソースがURLによって参照されているかを知ることは不可能です。 特定のURLをリクエストしたときに彼が提供するものを決定するのは、サーバー次第です。


0


`urllib.info()`関数でmimetypeを確認してください。 これは100%正確ではない場合があります。サイトがContent-Typeヘッダーとして返すものに依存します。 適切に動作していれば、適切なMIMEタイプが返されます。

PDFはapplication / pdfを返す必要がありますが、そうでない場合があります。

それ以外の場合は、ダウンロードして試してみてください。


0


URLから直接表示することはできません。 HTTP応答のヘッダーのみをダウンロードして、Content-Typeヘッダーを探すこともできます。 ただし、これについてはサーバーを信頼する必要があります。本文で提供されるデータと一致しない誤ったContent-Typeヘッダーで応答する可能性があります。


0


Python 3.xおよびwebappで、拡張子または偽の拡張子を持つことができなかったファイルのURLを使用してファイルタイプを検出します。 あなたはpython-magicをインストールするべきです。

pip3 install python-magic

Mac OS Xの場合は、libmagicもインストールする必要があります。

brew install libmagic

コードスニペット

import urllib
import magic
from urllib.request import urlopen

url = "http://...url to the file ..."
request = urllib.request.Request(url)
response = urlopen(request)
mime_type = magic.from_buffer(response.read())
print(mime_type)