オンラインプログラミング入門コースを初めて3週目(「requests.exceptions.SSLError: HTTPSConnectionPool」の解決策を末尾に記載)
タイトル
PythonとDB操作
目的
Pythonの環境構築を学ぶ。
Pythonの基礎文法
Pythonを使用したデータスクレイピング
MongoDBを使用したDB操作
概要
キーワード:Python、ターミナル、MongoDB、スクレイピング
Pythonの環境構築
MongoDBの作成
スクレイピング作業
学び
結論、環境構築が最難関。インストールする開発環境から、パッケージ、DB、PCのバージョンすべてが噛み合わないと上手くいかない。
疑問
正直環境構築が難しすぎて、実際の作業は二の次になってしまった。Pythonのバージョンを今後変える方法はどうしたらいいのか。
WindowsとMacでそれぞれ原因は異なっているようだが、PC自体のSSLエラーが発生する場合、どのように対処したらいいのか。事前にPCやバージョンについて下調べしてから実行しないと上手く進められなさそう。
今後の課題
今回は環境構築が難しすぎて、コード面での疑問が浮かぶまで進められなかった。
Requestsライブラリとbeautifulsoup4ライブラリを使用したスクレイピングを行う課題を進める上でも、また以下のSSL周りのエラー(「requests.exceptions.SSLError: HTTPSConnectionPool」)が表示されて進めることができなかった。
requests.exceptions.SSLError: HTTPSConnectionPool(host='xxxxxxxxxxxxxxxxxxxx): Max retries exceeded with url: /charts/detail?a=hot100 (Caused by SSLError(SSLError(1, '[SSL: WRONG_SIGNATURE_TYPE] wrong signature type (_ssl.c:997)')))
調べると、SSL証明書のアップデートが必要だとかなんだとか表示されるがイマイチ要領を得ない。。。
よくネットに載っていた、「verify=False」の追記も試したが全く意味がなかった。
結局証明書のインストールを行ってみたところ、先程までは問題なく動作していた、パッケージのモジュールさえ存在しないことになってしまった。。。つらい。。。
import requests
ModuleNotFoundError: No module named 'requests'
尽くプログラミングはこのようなところで躓くから困る。。。オンラインプログラミングのコースの指導を待って、解決をお願いしたいところです。。これでは課題もクリアできないので、しばらくは原因追究に時間を費やすことになりそうです。
※追記
----- 上記、「requests.exceptions.SSLError: HTTPSConnectionPool」のエラー修正が上手くいったため記載しておきます。 -----
■前提
・「verify=False」は特定の状況では意味がない。
・今回の原因は、Pythonのrequestsライブラリが使用するOpenSSLライブラリのバージョンが古いか、何らかの互換性の問題があった可能性が高いです。Pythonの新しいバージョンをインストールすることで、それに付随するOpenSSLライブラリも更新され、SSLエラーが解決されたと考えられます。これにより、requestsライブラリを正常に使用できるようになりました。
■解決の流れ
requestsライブラリでSSL証明書のエラーが発生。
サーバー証明書の署名アルゴリズムとPythonのrequestsライブラリの互換性の問題が原因と推定。
Pythonとrequestsライブラリが使用しているOpenSSLライブラリのバージョンが古いことが問題の原因の可能性を検討。
Pythonのバージョンをアップデートし、pyenvを使って新しいPythonバージョンをインストール。
新しいPythonバージョンでrequestsライブラリを使用して、SSLエラーが解決されることを確認。
①問題の発生したコードは以下。
import requests
response = requests.get('https://example.com')
②サーバー証明書の署名アルゴリズムとPythonのrequestsライブラリの互換性の問題が原因と推定。
この段階では特にコードや作業は行いません。
③Pythonとrequestsライブラリが使用しているOpenSSLライブラリのバージョンが古いことが問題の原因の可能性を検討。
この段階では特にコードや作業は行いません。
④Pythonのバージョンをアップデートし、pyenvを使って新しいPythonバージョンをインストール。
pyenvをインストール (すでにインストール済みの場合はスキップ)
brew update
brew install pyenv
新しいPythonバージョンをインストール(今回は3.8.2を想定した内容だったため、その最新の3.8.12を選択)
pyenv install 3.8.12
新しいPythonバージョンをプロジェクトやグローバルに適用
pyenv global 3.8.2
必要に応じて、Pythonパッケージを再インストール
pip install requests
⑤新しいPythonバージョンでrequestsライブラリを使用して、SSLエラーが解決されることを確認。(Requestsライブラリやbeautifulsoup4ライブラリを再インストールを仮想環境に再度インストール)
再度、以下のコードを実行してエラーが解決されていることを確認。
import requests
response = requests.get('https://example.com')
これにより、無事「requests.exceptions.SSLError: HTTPSConnectionPool」が表示されることなく、スクレイピングに成功しました。
この記事が気に入ったらサポートをしてみませんか?