LoginSignup
sonosuke519
@sonosuke519

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonでスクレイピングをしたいがrequests.get()の段階でエラーが出る

解決したいこと

Pythonでスクレイピングをしたい

下記ページからそれぞれの活動記録のページへアクセスし、
ページ中にある「エクスポート」ボタンからダウンロードできる
GPXファイルをまとめてダウンロードしたい。
https://yamap.com/search/activities

なお、GPXファイルのダウンロードはプレミアム会員のみ可能ですが、
当方プレミアム会員のアカウントを所持しています。

発生している問題・エラー

import requests

url = "https://yamap.com/search/activities"
response = requests.get(url)

GPXファイル収集のためコードを書いていましたが、
上記の段階で下記エラーが出ることが発覚。

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/urllib3/connectionpool.py:711, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    710 if is_new_proxy_conn and http_tunnel_required:
--> 711     self._prepare_proxy(conn)
    713 # Make the request on the httplib connection object.

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/urllib3/connectionpool.py:1007, in HTTPSConnectionPool._prepare_proxy(self, conn)
   1005     conn.tls_in_tls_required = True
-> 1007 conn.connect()

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/urllib3/connection.py:374, in HTTPSConnection.connect(self)
    372 # Calls self._set_hostport(), so self.host is
    373 # self._tunnel_host below.
--> 374 self._tunnel()
    375 # Mark this connection as not reusable

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/http/client.py:926, in HTTPConnection._tunnel(self)
    925     self.close()
--> 926     raise OSError(f"Tunnel connection failed: {code} {message.strip()}")
    927 while True:

OSError: Tunnel connection failed: 403 Forbidden

During handling of the above exception, another exception occurred:

MaxRetryError                             Traceback (most recent call last)
File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/adapters.py:486, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
    485 try:
--> 486     resp = conn.urlopen(
    487         method=request.method,
    488         url=url,
    489         body=request.body,
    490         headers=request.headers,
    491         redirect=False,
    492         assert_same_host=False,
    493         preload_content=False,
    494         decode_content=False,
    495         retries=self.max_retries,
    496         timeout=timeout,
    497         chunked=chunked,
    498     )
    500 except (ProtocolError, OSError) as err:

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/urllib3/connectionpool.py:798, in HTTPConnectionPool.urlopen(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)
    796     e = ProtocolError("Connection aborted.", e)
--> 798 retries = retries.increment(
    799     method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
    800 )
    801 retries.sleep()

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/urllib3/util/retry.py:592, in Retry.increment(self, method, url, response, error, _pool, _stacktrace)
    591 if new_retry.is_exhausted():
--> 592     raise MaxRetryError(_pool, url, error or ResponseError(cause))
    594 log.debug("Incremented Retry for (url='%s'): %r", url, new_retry)

MaxRetryError: HTTPSConnectionPool(host='yamap.com', port=443): Max retries exceeded with url: /activities/ (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))

During handling of the above exception, another exception occurred:

ProxyError                                Traceback (most recent call last)
Cell In[75], line 7
      4 import shutil
      6 url = "https://yamap.com/activities/"
----> 7 response = requests.get(url)

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/api.py:73, in get(url, params, **kwargs)
     62 def get(url, params=None, **kwargs):
     63     r"""Sends a GET request.
     64 
     65     :param url: URL for the new :class:`Request` object.
   (...)
     70     :rtype: requests.Response
     71     """
---> 73     return request("get", url, params=params, **kwargs)

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/api.py:59, in request(method, url, **kwargs)
     55 # By using the 'with' statement we are sure the session is closed, thus we
     56 # avoid leaving sockets open which can trigger a ResourceWarning in some
     57 # cases, and look like a memory leak in others.
     58 with sessions.Session() as session:
---> 59     return session.request(method=method, url=url, **kwargs)

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/sessions.py:589, in Session.request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    584 send_kwargs = {
    585     "timeout": timeout,
    586     "allow_redirects": allow_redirects,
    587 }
    588 send_kwargs.update(settings)
--> 589 resp = self.send(prep, **send_kwargs)
    591 return resp

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/sessions.py:703, in Session.send(self, request, **kwargs)
    700 start = preferred_clock()
    702 # Send the request
--> 703 r = adapter.send(request, **kwargs)
    705 # Total elapsed time of the request (approximately)
    706 elapsed = preferred_clock() - start

File /opt/conda/envs/anaconda-panel-2023.05-py310/lib/python3.11/site-packages/requests/adapters.py:513, in HTTPAdapter.send(self, request, stream, timeout, verify, cert, proxies)
    510     raise RetryError(e, request=request)
    512 if isinstance(e.reason, _ProxyError):
--> 513     raise ProxyError(e, request=request)
    515 if isinstance(e.reason, _SSLError):
    516     # This branch is for urllib3 v1.22 and later.
    517     raise SSLError(e, request=request)

ProxyError: HTTPSConnectionPool(host='yamap.com', port=443): Max retries exceeded with url: /activities/ (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))

urlを「https://yahoo.com/」に変更するとエラーは出ません。
ファイル収集先のYAMAPの利用規約にはスクレイピング禁止の旨は記載されておらず、
YAMAP側からスクレイピングにガードを掛けているようには思えません。

自分で試したこと

import requests

url = "https://yamap.com/search/activities"
user_agent = 'Mozilla/5.0'
response = requests.get(url, headers={"User-Agent": user_agent})

調べてみたところ、ユーザエージェントを設定すると
エラーが解消される可能性があるとのことで、
上記のコードを実行しましたが、結果は同じでした。


2024/06/30 15:11追記
様々なURLを試してみましたが、https://yahoo.comhttps://google.com くらいしかエラーが出ないURLがありませんでした。
JupiterNotebookから実行していますが、なにか関係ありますかね…?


2024/07/01 15:01追記
一応解決(?)しました。
ご回答者様から「モジュールのインストール時はプロキシエラーが出ないのか」とご質問いただいたきました。
コードの実行はJupiterNotebookから、
モジュールのインストールはAnaconda Promptから行っておりましたが、
モジュールインストール時にはプロキシエラーは出ていなかったため、
Anaconda Promptからコードを実行してみたところ、
なぜかエラーは出ませんでした。
JupiterNotebookだとなぜエラーが出るのか、原因は不明ですが、とりあえず動くようになったのでクローズさせていただきます。
ご回答くださったみなさんありがとうございました。

0

6Answer

上記の段階で下記エラーが出ることが発覚。

一度も接続に成功していないということでしょうか?

0Like

Comments

  1. ”ProxyError”とありますが、プロキシを使用されているんですか?会社ですか?

  2. @sonosuke519

    Questioner

    いえ、自宅のネットワーク、個人所有のPCです。
    プロキシを経由?していることがエラーの原因なんでしょうか。
    当方初心者でよくわかっておらず、エラー回避のためのプロキシの設定方法等わかれば教えて下さい。

  3. プロキシを利用していないということであれば・・・関係ないかもしれませんが、以前に何かproxy環境変数を設定したことはありませんか?余計な設定が残っていないか確認してみてはどうでしょうか?

    ※ Pythonのモジュールはどうやってインストールしてるんですか?そのときはエラーは出ないという事でしょうか??

  4. @sonosuke519

    Questioner

    プロキシに関係する環境変数というのはHTTP_PROXYやHTTPS_PROXYということですよね?
    環境変数の一覧を確認してみましたが、何も設定されておらず…

    モジュールはanaconda promptからインストールしており、問題なくインストールできています。

  5. ではrequestsモジュールのみでエラー(ProxyError)発生しているということですね。requestsモジュールのバージョンを変えてみても同じ現象でしょうか?

(長いので省略)じゃなくて、エラーは全文貼ってください。
あなたは問題の一部だけを聞いて、全容を把握できますか?
もしあなたにそういった能力があったとしても、多くの人には備わっていない能力です。
なので回答が欲しいなら面倒くさがらず、個人情報等の開示できない箇所に関しては適宜マスク等をし、提供可能な情報はすべて開示することを心掛けて下さい。

0Like

Comments

  1. @sonosuke519

    Questioner

    失礼しました。アドバイスありがとうございます。
    エラーメッセージの全文を記載しましたので、ご確認いただけると幸いです。

  2. Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden'))

    問題はエラーの通りです。

  3. @sonosuke519

    Questioner

    ご返信ありがとうございます。
    プロキシへの接続が失敗している、というのは読み取れました。
    エラー文が長すぎて読み解けなかったので助かりました。
    とはいえ調べてみてはいるのですがエラー解消の方法がわからず、
    なにかアドバイスいただけないでしょうか。

  4. エラーの解決方法ではなく、エラーの原因を探ってください。

    なぜプロキシエラーが出ている?どこのプロキシにつなごうとしている?なぜつなごうとしている?

    原因がわかれば、解決方法もわかるかもしれません。

Comments

  1. @sonosuke519

    Questioner

    ご回答ありがとうございます。ログインが必要なサイト以外のURLでも試してみたのですが、ほとんどのURLでエラーが出てしまいました…。

プロキシで403エラーが返ってきているようです。プロキシのログで何がエラーになっているか確認してみるにはどうでしょうか

ProxyError: HTTPSConnectionPool(host='yamap.com', port=443): Max retries exceeded with url: /activities/ (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden')))
0Like

Comments

  1. @sonosuke519

    Questioner

    ご回答ありがとうございます。
    初歩的な質問で申し訳無いのですが、Windowsのプロキシ設定のページは下記の様になっています。
    プロキシを使っていないように思えるのですが、プロキシ関連のエラーが出ており対処の仕方がわかりません…
    スクリーンショット 2024-06-30 185526.png

↓ こちらの情報によると、'Tunnel connection failed: 403 Forbidden' は「クライアントがリクエストしたリソースへのアクセスがサーバーによって明確に禁止されていることを示しています」とあります。

0Like

Comments

  1. わざわざ太字なんだからせめてちゃんと読んで

    一方、「Tunnel connection failed」は通常、クライアントがサーバーに接続するための「トンネル」を確立できなかったことを示しています。これはプロキシサーバーを介して接続を試みている場合によく見られます。このエラーは、サーバーがリクエストを理解できなかった、または扱うことができなかったときに発生します。

プロキシエラーっぽいですが、社内LANなどからアクセスしてますでしょうか。その場合は、requests.get()のオプションのproxiesにプロキシの設定をする必要があった気がします。

0Like

Comments

  1. @sonosuke519

    Questioner

    スクリーンショット 2024-06-30 185526.png
    自宅の回線、個人所有のPCで作業しています。
    Windowsの設定から確認したプロキシの設定は画像のとおりです。
    初歩的な質問で申し訳無いのですが、
    画像のとおりであればプロキシを使用していないということですよね?
    なのにプロキシを使っていると判定されてしまっているということでしょうか。
    解決策に心当たりありましたら教えて下さい。

  2. curlコマンドでアクセスするとアクセスできますでしょうか? もし、アクセスできない場合はpython(or request)の問題ではないと思います。

    curl https://yamap.com/search/activities
    

    でアクセスできるか、まずは確認してみてください。

Your answer might help someone💌