質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

requests.getによるProxyErrorを解決したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,057

score 12

[コードの参考サイト]
https://qiita.com/neet-AI/items/98d4194872ee4f53e3b4

[実行環境]
Python 3.7.3
Windows 10 Pro
Jupiter notebook
社内ネットワーク

import requests
response = requests.get('https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8')
print(response.text)

スクレイピングの練習のため上記のコードを実行すると、下記のようなエラーが出ました。
おそらく社内のプロキシに引っかかったのだと思いますが、どうすべきか分からず苦しんでいます。
解決方法を教えていただけないでしょうか?

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
C:\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    593             if is_new_proxy_conn:
--> 594                 self._prepare_proxy(conn)
    595 

C:\Anaconda3\lib\site-packages\urllib3\connectionpool.py in _prepare_proxy(self, conn)
    804         conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers)
--> 805         conn.connect()
    806 

C:\Anaconda3\lib\site-packages\urllib3\connection.py in connect(self)
    307             # self._tunnel_host below.
--> 308             self._tunnel()
    309             # Mark this connection as not reusable

C:\Anaconda3\lib\http\client.py in _tunnel(self)
    910             raise OSError("Tunnel connection failed: %d %s" % (code,
--> 911                                                                message.strip()))
    912         while True:

OSError: Tunnel connection failed: 407 Proxy Authentication Required ( Forefront TMG は、要求を実行する権限を要求しています。Web プロキシ フィルターへのアクセスは拒否されます。  )

During handling of the above exception, another exception occurred:

MaxRetryError                             Traceback (most recent call last)
C:\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    448                     retries=self.max_retries,
--> 449                     timeout=timeout
    450                 )

C:\Anaconda3\lib\site-packages\urllib3\connectionpool.py in urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    637             retries = retries.increment(method, url, error=e, _pool=self,
--> 638                                         _stacktrace=sys.exc_info()[2])
    639             retries.sleep()

C:\Anaconda3\lib\site-packages\urllib3\util\retry.py in increment(self, method, url, response, error, _pool, _stacktrace)
    398         if new_retry.is_exhausted():
--> 399             raise MaxRetryError(_pool, url, error or ResponseError(cause))
    400 

MaxRetryError: HTTPSConnectionPool(host='ja.wikipedia.org', port=443): Max retries exceeded with url: /wiki/%E3%83%9A%E3%83%BC%E3%82%B8 (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 407 Proxy Authentication Required ( Forefront TMG ã\x81¯ã\x80\x81è¦\x81æ±\x82ã\x82\x92å®\x9fè¡\x8cã\x81\x99ã\x82\x8b権é\x99\x90ã\x82\x92è¦\x81æ±\x82ã\x81\x97ã\x81¦ã\x81\x84ã\x81¾ã\x81\x99ã\x80\x82Web ã\x83\x97ã\x83\xadã\x82\xadã\x82· ã\x83\x95ã\x82£ã\x83«ã\x82¿ã\x83¼ã\x81¸ã\x81®ã\x82¢ã\x82¯ã\x82»ã\x82¹ã\x81¯æ\x8b\x92å\x90¦ã\x81\x95ã\x82\x8cã\x81¾ã\x81\x99ã\x80\x82  )')))

During handling of the above exception, another exception occurred:

ProxyError                                Traceback (most recent call last)
<ipython-input-26-1ec3f8246665> in <module>
      1 import requests
      2 
----> 3 req = requests.get("https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8")
      4 print(req.text)

C:\Anaconda3\lib\site-packages\requests\api.py in get(url, params, **kwargs)
     73 
     74     kwargs.setdefault('allow_redirects', True)
---> 75     return request('get', url, params=params, **kwargs)
     76 
     77 

C:\Anaconda3\lib\site-packages\requests\api.py in request(method, url, **kwargs)
     58     # cases, and look like a memory leak in others.
     59     with sessions.Session() as session:
---> 60         return session.request(method=method, url=url, **kwargs)
     61 
     62 

C:\Anaconda3\lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    531         }
    532         send_kwargs.update(settings)
--> 533         resp = self.send(prep, **send_kwargs)
    534 
    535         return resp

C:\Anaconda3\lib\site-packages\requests\sessions.py in send(self, request, **kwargs)
    644 
    645         # Send the request
--> 646         r = adapter.send(request, **kwargs)
    647 
    648         # Total elapsed time of the request (approximately)

C:\Anaconda3\lib\site-packages\requests\adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    508 
    509             if isinstance(e.reason, _ProxyError):
--> 510                 raise ProxyError(e, request=request)
    511 
    512             if isinstance(e.reason, _SSLError):

ProxyError: HTTPSConnectionPool(host='ja.wikipedia.org', port=443): Max retries exceeded with url: /wiki/%E3%83%9A%E3%83%BC%E3%82%B8 (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 407 Proxy Authentication Required ( Forefront TMG ã\x81¯ã\x80\x81è¦\x81æ±\x82ã\x82\x92å®\x9fè¡\x8cã\x81\x99ã\x82\x8b権é\x99\x90ã\x82\x92è¦\x81æ±\x82ã\x81\x97ã\x81¦ã\x81\x84ã\x81¾ã\x81\x99ã\x80\x82Web ã\x83\x97ã\x83\xadã\x82\xadã\x82· ã\x83\x95ã\x82£ã\x83«ã\x82¿ã\x83¼ã\x81¸ã\x81®ã\x82¢ã\x82¯ã\x82»ã\x82¹ã\x81¯æ\x8b\x92å\x90¦ã\x81\x95ã\x82\x8cã\x81¾ã\x81\x99ã\x80\x82  )')))
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • matobaa

    2019/11/01 16:46

    Proxyに認証情報を要求されているようですが、普段はどうやっていますか? Webブラウザで認証ダイアログが出てきてユーザ名とパスワードを入力しているのか、ICカードリーダーに社員カードを刺しておくと自動的にやってくれるとかそのへんを知りたいです。

    キャンセル

  • kkz

    2019/11/01 16:53

    Google Chromeをブラウザとして使っていて、新しく開くたびに社員IDとパスワードを入力して認証しています。
    ICカードの類は使用しておりません。
    よろしくお願いいたします。

    キャンセル

回答 1

checkベストアンサー

+2

OSError: Tunnel connection failed: 407 Proxy Authentication Required ( Forefront TMG ã¯ã€è¦æ±‚を実行する権限を要求しています。Web ãƒ—ロキシ ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯æ‹’否されます。  )

を もじばけらった に貼って、上にiso-8859-1、下にUTF-8 を指定したら、こんな文字が浮かんできました:

OSError: Tunnel connection failed: 407 Proxy Authentication Required ( Forefront TMG は、要求を実行する権限を要求しています。Web プロキシ フィルターへのアクセスは拒否されます。 )

Proxyまでは道に迷ってないようなので、環境変数 HTTPS_PROXY あたりの設定はちゃんとできているようです。

ということなので、Proxyに認証情報を渡してやりましょう。

requestsのドキュメントのProxies によれば、Basic認証であれば、こんな感じでProxy認証情報を載せられるようです。

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",  # 環境に合わせて設定すること
    "https": "https://user:pass@10.10.1.10:1080/",  # 環境に合わせて設定すること
}

requests.get('https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%BC%E3%82%B8', proxies=proxies)

環境変数 HTTPS_PROXY に上記のようにユーザ名とパスワードを仕込むのでも同じ結果が得られるかも。

認証方式がBasic認証ではない場合は、別の方法が必要かもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/01 17:11

    ご回答ありがとうございます。
    すぐ試したいところですが、11/5までできない状況です。
    basic認証かどうかは現状分かりません。どう確認するのでしょうか?

    お教えいただいた認証情報を載せる方法は以前試しましたが、そのときは30秒ほど読み込み時間を経たあと同じようなProxyErrorが起こりました。
    環境に合わせた数字部分の決め方がわかっていなかったことが原因かもしれません。
    10.10.1.10:1080といった数字部分はどういう基準で決めればいいのでしょうか?

    キャンセル

  • 2019/11/01 17:43

    > 10.10.1.10:1080といった数字部分

    inetcpl.cpl を実行して 接続 > LANの設定 > プロキシサーバ の画面で設定されている、と思います。あるいは環境変数 HTTPS_PROXY で設定されているかも。

    キャンセル

  • 2019/11/05 08:47

    教えていただいた方法で成功しました。誠にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る