web-dev-qa-db-ja.com

Python:requests.exceptions.ConnectionError。 URLで最大再試行回数を超えました

これはスクリプトです:

import requests
import json
import urlparse
from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=1))

with open('proxies.txt') as proxies:
    for line in proxies:
        proxy=json.loads(line)

    with open('urls.txt') as urls:
        for line in urls:

            url=line.rstrip()
            data=requests.get(url, proxies=proxy)
            data1=data.content
            print data1
            print {'http': line}

ご覧のとおり、プロキシのリストを介してURLのリストにアクセスしようとしています。 urls.txtファイルは次のとおりです。

http://api.exip.org/?call=ip

proxies.txtファイルは次のとおりです。

{"http":"http://107.17.92.18:8080"}

このプロキシはwww.hidemyass.comで入手しました。それは悪いプロキシでしょうか?私はいくつか試してみましたが、これが結果です。注:これを複製しようとする場合、hidemyass.comでプロキシを最新のものに更新する必要がある場合があります。最終的には機能しなくなるようです。完全なエラーとトレースバックは次のとおりです。

Traceback (most recent call last):
  File "test.py", line 17, in <module>
    data=requests.get(url, proxies=proxy)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 335, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 454, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 144, in resolve_redirects
    allow_redirects=False,
  File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 438, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 327, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(Host=u'219.231.143.96', port=18186): Max retries exceeded with url: http://www.google.com/ (Caused by <class 'httplib.BadStatusLine'>: '')
27
BigBoy1337

スタックトレースを見ると、エラーの原因はhttplib.BadStatusLine例外。 docs によると:

サーバーが不明なHTTPステータスコードで応答した場合に発生します。

言い換えれば、プロキシサーバーによって返される(まったく返される場合)ものは、実際の要求を行うhttplibによって解析できません。

Httpプロキシ(書き込み)の私の経験から、一部の実装は仕様に厳密に従っていない(httpのrfc仕様は実際には読みにくい)か、ハックを使用して実装に欠陥のある古いブラウザーを修正すると言うことができます。

だから、これに答える:

それは悪いプロキシでしょうか?

...私は言うだろう-これが可能であること。確実な唯一の現実的な方法は、プロキシサーバーから返されるものを確認することです。

デバッガーでデバッグするか、パケットスニファー( Wireshark または Network Monitor など)を取得して、ネットワークで何が起こるかを分析してください。プロキシサーバーによって正確に何が返されるかについての情報があると、この問題を解決するためのキーが得られます。

33
Eugene Loy

たぶん、短期間にあまりにも多くのリクエストを送信することでプロキシサーバーをオーバーロードしていると、あなたは人気のある無料のプロキシウェブサイトからプロキシを取得したと言います。つまり、そのサーバーを使用しているのはあなただけではなく、頻繁に負荷がかかっているということです負荷。

このようにリクエスト間に遅延を追加する場合:

_from time import sleep

[...]

data=requests.get(url, proxies=proxy)
data1=data.content
print data1
print {'http': line}
sleep(1)
_

sleep(1)は、コードの実行を1秒間停止することに注意してください)

動作しますか?

8
user2629998
def hello(self):
    self.s = requests.Session()
    self.s.headers.update({'User-Agent': self.user_agent})
    return True

これを試して、それは私のために働いた:)

1
Ashu