私の環境
iMac macOS Ventura13.2
python 3.10.4
selenium 4.18.1
requests 2.31.0
概要
Pythonで自作の新刊情報をTRC新刊図書オープンデータにアクセスしてdataを取得するprogramを、いつも通り実行したところ、突然、 r = requests.get(url)で以下のエラーが発生しました。
ChatGPTに質問したところ
ChatGPTは言葉では教えてくれますが、専門用語が多く具体的な対処方法がわからなかったので、、いろいろググってみたところ参考になるサイトに出会えたので、それを参考にして対処してみたところ、無事回復できました。
大変参考になりました。
結論
A.「certifi/cacert.pem」に直接SSL証明書の情報を書き加える(/Users/〜/site-packages/certifi/cacert.pem)
B.または、「cacert.pem」ファイルをコピーして、これにSSL証明書の情報を書き加え、プロジェクトフォルダ直下に貼り付ける。そしてコードを一部修正。<—私はこっちを選択しました。(理由は下記に記載)
具体的な流れ
1.cacert.pemに追記するSSL証明書の情報を取得する
このサイトで、調べたいホスト名「xxxx.com」(私の場合はwww.trc.co.jp:TRC新刊図書オープンデータ)を入力すると、SSL証明書の情報を取得できます。
このページをスクロールすると"Click here to expand" というボタンがあるのでこれをクリックします。
”Click here to expand”をクリックすると以下に展開します。
Certification Paths(認定パス)の欄の”apple”(私の場合)をクリックした後、右に薄くある”Download chain”をクリック
ボタンにはダウンロードとありましたが、クリックしてもサイトが開くだけでした。以下のようにしてFinderのダウンロードディレクトリにダウンロードしました(ご参考まで)。
2、次に,取得したSSL証明書の情報を貼り付けるために「cacert.pem」ファイルがどこにあるか"場所"を調べます。
ターミナルに% pip show certifi と入力して実行すれば調べられます。
使用状況によっては多少違うと思いますが”Location”の場所にそのファイルはあります。
Location: /Users/xxxxxxxxxxx/.pyenv/versions/3.10.4/lib/python3.10/site-packages
3、次にFinderで「cacert.pem」ファイルまで辿ります。
a. そのために、まず隠しファイルが見える状況にします。
Finderを開き、自分の名前のところで、Finderを開き、ショートカット:Command + Shift + .(ドット)で隠しファイルが見える状態になります。
b. Locationにあるパスの通り、Finderでディレクトリを順番に辿っていきます。
私の場合は
/Users/xxxxxx/.pyenv/versions/3.10.4/lib/python3.10/site-packages/certifi/cacert.pem
にありました。
c. この場所でファイルを開きダウンロードした証明を貼り付けるか、または「cacert.pem」ファイルをコピーするか選択します。(私は「cacert.pem」ファイルをコピーする方法にしました。)
ファイルを開くには、
最初私は、普通に「開く」を選んだところ、チェーンアクセス.appが起動して、「チェーンアクセス・・・につながりません」から画面がフリーズするというトラブルが発生し強制終了(起動ボタンを押すしか終了できなかった)することになりましたので、この方法がいいと思います。
私がファイルのコピーを選んだ理由としては
・他のプログラムにも影響する。
・新刊情報を取得するため、「TRC新刊図書オープンデータ」にアクセスする時にエラー出るだけだから。
・本当にできるか心配。
以上の理由から、「acert.pem」ファイルをコピーして、プロジェクトフォルダ直下に貼り付ける方法を選びました。
d./site-packages/certifi/cacert.pemで開いた
又は,
コピーしたacert.pemファイルに、先ほどダウンロードしたファイルを貼り付ける。
これは、/site-packages/certifi/cacert.pemへ直接単純に貼り付けるにしても、コピーしたファイルに貼り付けるにしても同じです。単純に「cacert.pem」ファイルの最後にコピー&ペーストするだけです。
4、最後にプロジェクトフォルダ直下に貼り付ける方法を選んだ場合は.pyのコードの修正をします。
なお、直接/Users/xxxxxx/.pyenv/versions/3.10.4/lib/python3.10/site-packages/certifi/cacert.pemにダウンロードしたファイルを貼り付けた場合は、コードの修正は不要です。これで終わりです。
プロジェクトフォルダ直下に貼り付ける方法を選んだ場合は,verify='cacert.pem'を付記してください。これで終わりです。
(現状) r = requests.get(url)#urlを取得
(修正後)r = requests.get(url, verify='cacert.pem')
後記
やってみれば簡単でした。私が時間がかかったのは、
・最初の「SSL証明書の情報を取得する」サイトが全て英語で、参考にしたサイトと若干フォームが違っていたため英訳したりボタンを押すのに躊躇したことや
・「acert.pem」ファイルを開く際に、フリーズという事態に直面した
ことでした。
でも、これで折角自作した新刊情報をseleniumで取得するprogramを再び活かすことができるようになりました。