2011-08-03 8 views
2

私はPythonを初めて使いました。私の現在の仕事は、特定のWebページでPDFファイルを探してダウンロードするWebクローラを作成することです。ここで(ちょうど1サンプルURLの)私の現在のアプローチがあります:mechanizeとurllibを使ったpdfファイルのダウンロード

import mechanize 
import urllib 
import sys 

mech = mechanize.Browser() 
mech.set_handle_robots(False) 

url = "http://www.xyz.com" 

try: 
    mech.open(url, timeout = 30.0) 
except HTTPError, e: 
    sys.exit("%d: %s" % (e.code, e.msg)) 

links = mech.links() 

for l in links: 
    #Some are relative links 
    path = str(l.base_url[:-1])+str(l.url) 
    if path.find(".pdf") > 0: 
     urllib.urlretrieve(path) 

プログラムがエラーなく実行されますが、私はPDFファイルを任意の場所に保存されて見ていないです。私はpdfにアクセスし、私のブラウザを通してそれを保存することができます。何が起きているのか? Pydev(Eclipseベース)を開発環境として使用しています。

もう1つの質問は、私がそれを保存しながら特定の名前をpdfに与えたいのですが、どうすればいいですか?このアプローチは正しいですか? PDFを保存する前に 'filename'でファイルを作成する必要がありますか?

urllib.urlretrieve(path, filename) 

ありがとうございます。

答えて

3

urllibのドキュメントこれはurlretrieve機能についてこう述べています。

存在する場合2番目の引数が、存在しない場合は、場所が生成された名前を持つ一時ファイルになります(へ をコピーするファイルの場所を指定します)。

関数の戻り値は、ファイルの場所があります

戻りファイル名がオブジェクトを見つけることができる 名その下にローカルファイルであるタプル(ファイル名、ヘッダ)、およびヘッダーれますurlopen()によって返されたオブジェクトの info()メソッドが返されました( リモートオブジェクトの場合、キャッシュされる可能性があります)。場所を持つことになりますfilename

(filename, headers) = urllib.urlretrieve(path) 

とパス:これまで

urllib.urlretrieve(path) 

ので、この行を変更します。オプションで、filename引数をurlretrieveに渡して、自分で場所を指定します。

+0

ああ、私はそれを持っています。ありがとう。 – user721975

1

私はMechanizeのを使用していないが、http://docs.python.org/library/urllib.htmlでurllibはのドキュメントから決してしました:

urllib.urlretrieve(URL [ファイル名[、場合reporthook [データ]]])

コピーA が必要な場合は、ローカルファイルへのURLで示されるネットワークオブジェクト。 URLがローカルファイルを指すか、またはオブジェクトの有効なキャッシュされたコピー が存在する場合、オブジェクトはコピーされません。タプルを返す (filename、headers)filenameは、 オブジェクトが見つかるローカルファイル名であり、ヘッダーは のinfo()メソッドであっても、urlopen()によって返されたオブジェクトが返されます(リモートオブジェクトの場合は、可能であればキャッシュされた )。例外はurlopen()と同じです。

ご覧のとおり、urlretrieve関数を指定しないと、一時ファイルに保存されます。だから、2番目のコードで示唆したようにファイル名を指定してみてください。それ以外の場合は、次のようにurlretrieveを呼び出すことができます。

saved_filename,headers = urllib.urlretrieve(path) 

その後、saved_filenameを後で使用してください。

+0

+1。それを指摘してくれてありがとう。 – user721975

関連する問題