1

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

http://www.oecd.org/officialdocuments/displaydocument/?cote=STD/CSTAT/WPNA(2008)25&docLanguage=En

それで、2つの質問。URLにリンク先のpdf/docなどのファイルが明示的に含まれていない場合(例:www.domain.com/file.pdf)にあるかどうかを確認する方法はありますか?Pythonにそのファイルを引っ掛けさせる方法はありますか?

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

4

7 に答える 7

8

URLから何が得られるかを知る方法はありません。それが終わったとしても、.pdfそれでもあなたにHTMLまたはそれが好きなものを与えることができます。

HEADリクエストを実行して、コンテンツタイプを確認できます。これは、サーバーが嘘をついていない場合は、PDFであるかどうかを示します。

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

于 2010-10-21T15:14:00.630 に答える
5

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

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

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

urllib2およびcookielibモジュールをチェックして、cookieのサポートを取得してください。このチュートリアルが役立つ場合があります)

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

于 2010-10-21T16:11:37.593 に答える
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を使用する必要があります。

于 2010-10-21T15:23:12.993 に答える
0

いいえ。URLを見ただけでは、どのようなリソースがURLによって参照されているかを知ることはできません。あなたが特定のURLを要求したときに彼があなたに何を与えるかを決めるのは完全にサーバー次第です。

于 2010-10-21T15:13:49.257 に答える
0

関数でmimetypeを確認してくださいurllib.info()。これは100%正確ではない可能性があります。実際には、サイトがContent-Typeヘッダーとして返すものによって異なります。正常に動作している場合は、適切なmimeタイプが返されます。

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

それ以外の場合は、ダウンロードして試してみる必要があるかもしれません。

于 2010-10-21T15:14:09.897 に答える
0

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

于 2010-10-21T15:14:11.830 に答える
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)
于 2016-09-06T20:08:19.897 に答える