4

編集: 多くのことをいじった後、各ファイルの後に接続を閉じるように指示した場合でも、urllib2が失敗したところでurlgrabberが成功したようです。urllib2 がプロキシを処理する方法、または使用方法に問題があるようです。とにかく、ループ内でファイルを取得するための最も単純なコードは次のとおりです。

import urlgrabber

for i in range(1, 100):
    url = "http://www.iana.org/domains/example/"
    urlgrabber.urlgrab(url, proxies={'http':'http://<user>:<password>@<proxy url>:<proxy port>'}, keepalive=1, close_connection=1, throttle=0)

皆さんこんにちは !

urllib2 を介して多数のファイルを取得するための非常に単純な python スクリプトを作成しようとしています。

このスクリプトは、職場でプロキシを介して動作する必要があります (イントラネット上のファイルを取得する場合、つまりプロキシを使用しない場合、私の問題は存在しません)。

このスクリプトは、「HTTPError: HTTP エラー 401: 基本認証に失敗しました」といういくつかのリクエストの後に失敗します。なぜそれが考えられるのですか?プロキシが認証を拒否しているようですが、なぜですか? 最初の 2 つの urlopen リクエストは正しく処理されました。

編集: リクエスト間に 10 秒のスリープを追加して、プロキシによって行われる可能性のある何らかのスロットリングを回避しても、結果は変わりませんでした。

これは私のスクリプトの簡略化されたバージョンです(明らかに識別された情報は削除されています):

import urllib2

passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
passmgr.add_password(None, '<proxy url>:<proxy port>', '<my user name>', '<my password>')
authinfo = urllib2.ProxyBasicAuthHandler(passmgr)

proxy_support = urllib2.ProxyHandler({"http" : "<proxy http address>"})
opener = urllib2.build_opener(authinfo, proxy_support)
urllib2.install_opener(opener)

for i in range(100):
with open("e:/tmp/images/tst{}.htm".format(i), "w") as outfile:
    f = urllib2.urlopen("http://www.iana.org/domains/example/")
    outfile.write(f.read())

前もって感謝します !

4

2 に答える 2

1

urlgrabberモジュールの keepalive ハンドラーを使用すると、接続数を最小限に抑えることができます。

import urllib2
from keepalive import HTTPHandler
keepalive_handler = HTTPHandler()
opener = urllib2.build_opener(keepalive_handler)
urllib2.install_opener(opener)

fo = urllib2.urlopen('http://www.python.org')

これがプロキシ設定で正しく機能するかどうかはわかりません。keepalive モジュールをハックする必要があるかもしれません。

于 2011-03-04T07:50:54.650 に答える
1

プロキシがリクエストを調整している可能性があります。ボットのように見えると思います。

タイムアウトを追加して、それがうまくいくかどうかを確認できます。

于 2011-02-26T18:17:41.830 に答える