🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3769閲覧

Pythonのルート証明書の取得について

nogish

総合スコア20

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/26 09:35

編集2021/03/02 10:27

前提・実現したいこと

Jupyter labを使ってウェブスクレイピングをしており、HTMLデータを取得しようとしております。
しかし、次のエラーが出ました。

Jupyterlab

1URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)>

そこで、下記サイトを参考に、
https://qiita.com/orangain/items/0a641d980019fd7e0c52

certifiモジュールで、ルート証明書を取得しようとしたのですが、エラーになってしまいます。

発生している問題・エラーメッセージ

Jupyterlab

1--------------------------------------------------------------------------- 2SSLCertVerificationError Traceback (most recent call last) 3/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in do_open(self, http_class, req, **http_conn_args) 4 1345 try: 5-> 1346 h.request(req.get_method(), req.selector, req.data, headers, 6 1347 encode_chunked=req.has_header('Transfer-encoding')) 7 8/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in request(self, method, url, body, headers, encode_chunked) 9 1254 """Send a complete request to the server.""" 10-> 1255 self._send_request(method, url, body, headers, encode_chunked) 11 1256 12 13/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in _send_request(self, method, url, body, headers, encode_chunked) 14 1300 body = _encode(body, 'body') 15-> 1301 self.endheaders(body, encode_chunked=encode_chunked) 16 1302 17 18/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in endheaders(self, message_body, encode_chunked) 19 1249 raise CannotSendHeader() 20-> 1250 self._send_output(message_body, encode_chunked=encode_chunked) 21 1251 22 23/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in _send_output(self, message_body, encode_chunked) 24 1009 del self._buffer[:] 25-> 1010 self.send(msg) 26 1011 27 28/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in send(self, data) 29 949 if self.auto_open: 30--> 950 self.connect() 31 951 else: 32 33/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py in connect(self) 34 1423 35-> 1424 self.sock = self._context.wrap_socket(self.sock, 36 1425 server_hostname=server_hostname) 37 38/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py in wrap_socket(self, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, session) 39 499 # ctx._wrap_socket() 40--> 500 return self.sslsocket_class._create( 41 501 sock=sock, 42 43/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py in _create(cls, sock, server_side, do_handshake_on_connect, suppress_ragged_eofs, server_hostname, context, session) 44 1039 raise ValueError("do_handshake_on_connect should not be specified for non-blocking sockets") 45-> 1040 self.do_handshake() 46 1041 except (OSError, ValueError): 47 48/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py in do_handshake(self, block) 49 1308 self.settimeout(None) 50-> 1309 self._sslobj.do_handshake() 51 1310 finally: 52 53SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123) 54 55During handling of the above exception, another exception occurred: 56 57URLError Traceback (most recent call last) 58<ipython-input-7-81afa538059d> in <module> 59 1 url = 'https://scraping-for-beginner.herokuapp.com/ranking/' 60----> 2 response = req.urlopen(url) # 指定したwebサイトのHTMLを取得できる関数 61 62/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context) 63 212 else: 64 213 opener = _opener 65--> 214 return opener.open(url, data, timeout) 66 215 67 216 def install_opener(opener): 68 69/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in open(self, fullurl, data, timeout) 70 515 71 516 sys.audit('urllib.Request', req.full_url, req.data, req.headers, req.get_method()) 72--> 517 response = self._open(req, data) 73 518 74 519 # post-process response 75 76/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in _open(self, req, data) 77 532 78 533 protocol = req.type 79--> 534 result = self._call_chain(self.handle_open, protocol, protocol + 80 535 '_open', req) 81 536 if result: 82 83/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args) 84 492 for handler in handlers: 85 493 func = getattr(handler, meth_name) 86--> 494 result = func(*args) 87 495 if result is not None: 88 496 return result 89 90/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in https_open(self, req) 91 1387 92 1388 def https_open(self, req): 93-> 1389 return self.do_open(http.client.HTTPSConnection, req, 94 1390 context=self._context, check_hostname=self._check_hostname) 95 1391 96 97/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py in do_open(self, http_class, req, **http_conn_args) 98 1347 encode_chunked=req.has_header('Transfer-encoding')) 99 1348 except OSError as err: # timeout error 100-> 1349 raise URLError(err) 101 1350 r = h.getresponse() 102 1351 except: 103 104URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)>

terminal

1-bash: /Applications/Python 3.9/Install Certificates.command: No such file or directory

該当のソースコード

Jupyterlab

1!pip3 install beautifulsoup4 2 3from bs4 import BeautifulSoup 4import urllib.request as req 5 6url = 'https://scraping-for-beginner.herokuapp.com/ranking/' 7response = req.urlopen(url)

certifiモジュールの方は、何を変えればよいかわからず、とりあえずバージョンの数字だけ自分のpyhtonのバージョンに合わせました

terminal

1MacBook-Air:~ a$ /Applications/Python\ 3.9/Install\ Certificates.command

試したこと

自分のpythonが格納されているパスでないとダメなのかと思い、
一度pythonをアップグレードしたところ、

terminal

1They will install into the site-package directory 2 /usr/local/lib/python3.9/site-packages

と出たので、

terminal

1$ /usr/local/Cellar/python@3.9/Install\ Certificates.command 2や、 3$ /usr/local/bin/Python\ 3.9/Install\ Certificates.command

なども入力してみましたが、全て同じエラーです

補足情報(FW/ツールのバージョンなど)

OS:Mac、Pythonのバージョン:3.9.2_1

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/02/26 09:56

アクセスしているサイトの側に問題がないことの切り分けはどのようにしたのでしょうか。 (Firefoxあたりで開けるかどうか? とか) > ウェブスクレイピングをしており どんなコードでサーバにアクセスしていますか? (requests?)
nogish

2021/03/02 10:13

上記修正しました! アクセスしているサイトの側に問題があるかどうか、判断ができなかったのですが、サイトは以下です。 https://scraping-for-beginner.herokuapp.com/ranking/ Firefoxをダウンロードしてみましたが、ひらけました。 コードも載せました!
guest

回答2

0

http://kottas.hatenablog.com/entry/2019/02/04/000000
根本的解決ではないのかもしれませんが、このサイトを参考にできました。

ベストアンサーに選んだものも試してみます!

投稿2021/03/02 23:14

nogish

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msiz07

2021/03/02 23:54

解決方法の報告・共有ありがとうございます リンク先を見てみました。以下のコードを使う方法は私も知らなかったので参考になりました。 ```python import ssl ssl._create_default_https_context = ssl._create_unverified_context ``` しっかり調べたわけではないのですが、気になったことを1つだけ。「create_unverified_context」は直訳すると「検証されてない環境を作成する」のような意味合いになると思うので、セキュリティ的には注意が必要な手段かもしれません。 ※このコメントとは直接関係ありませんが、ベストアンサーありがとうございました。
guest

0

ベストアンサー

私はMacもJupyterもほとんど使ったことがなく、手元にも確かめる環境がないので想像がかなり入りますが、使っているPython環境を明らかにするために、「venv」でJupyter用の環境を用意してみたらどうでしょうか。

Macよく知らないのですが、bashを使ってるときに、venvで環境を構築する例です。

bash

1(適当なディレクトリを作成し、そこに移動) 2 3$ python -m venv _venv # 仮想環境作成 4$ source _venv/bin/activate # 作業中の端末で仮想環境を有効化 5(仮想環境有効化ができたとき、bashだとプロンプトが変化します) 6(_venv) $ python -m pip install -U pip 7(_venv) $ pip install jupyterlab 8(_venv) $ jupyter lab

質問にあるようなSSL関連のエラーが出てcertifiをインストール・更新したくなった場合は、仮想環境を有効化した後、以下のコマンドで実施できると思います。

bash

1(_venv) $ pip install certifi

pipvenvのインストールや使い方については本題から外れるので、説明は省略します。
Mac環境で試していないので、間違いがありましたらすみません。

投稿2021/03/02 15:30

msiz07

総合スコア172

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問