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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

Q&A

解決済

3回答

1447閲覧

PythonによるBeautifulSoup4を利用したスクレイピング時に発生するエラー(おそらく環境)について

tss

総合スコア12

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

0グッド

0クリップ

投稿2020/10/26 10:29

BeautifulSoup4を利用したスクレイピングをテストしています。

以下ソース(独学プログラマーという本のサンプルです)

Python

1import urllib.request 2from bs4 import BeautifulSoup 3 4class Scraper: 5 def __init__(self, site): 6 self.site = site 7 8 def scrape(self): 9 r = urllib.request\ 10 .urlopen(self.site) #ここでエラーが発生している。 11 html = r.read() 12 parser = "html.parser" 13 sp = BeautifulSoup(html, 14 parser) 15 for tag in sp.find_all("a"): 16 url = tag.get("href") 17 if url is None: 18 continue 19 if "html" in url: 20 print("\n" + url) 21 22news = "https://news.google.com/" 23Scraper(news).scrape()

上記を実行すると下記のエラーが出るのですが、原因がわかりません。

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/urllib/request.py", line 1342, in do_open h.request(req.get_method(), req.selector, req.data, headers, File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1255, in request self._send_request(method, url, body, headers, encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1301, in _send_request self.endheaders(body, encode_chunked=encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1250, in endheaders self._send_output(message_body, encode_chunked=encode_chunked) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1010, in _send_output self.send(msg) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 950, in send self.connect() File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/http/client.py", line 1424, in connect self.sock = self._context.wrap_socket(self.sock, File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 500, in wrap_socket return self.sslsocket_class._create( File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1040, in _create self.do_handshake() File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ssl.py", line 1309, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1122)

サンプルプログラム自体が動作しないので、環境の問題かとも思うのですが原因がわかりません。
原因及び解決法をご教示頂けると助かります。

試したこと
Pythonの再インストール
BeautifulSoup4の再インストール

環境情報
Pythonバージョン:3.9
MacOS:10.15.7

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

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

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

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

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

guest

回答3

0

ターミナルで、下記の実行を試してみてください

cd /Applications/Python 3.9/ ./Install Certificates.command

参考
https://stackoverflow.com/questions/52805115/certificate-verify-failed-unable-to-get-local-issuer-certificate
https://qiita.com/0_a_e/items/d0c7287ea71b555f9ffd

投稿2020/10/26 11:03

sfdust

総合スコア1135

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

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

tss

2020/10/26 12:27

回答ありがとうございます。 そのまま実行してみたら、うまくいきました。 ありがとうございます。
guest

0

ベストアンサー

まず初めに、今回生じているエラーについてはBeautifulSoupが起因したものではありません。

r = urllib.request\

.urlopen(self.site) #ここでエラーが発生している。

とご自身でも掲載されている様に、エラーの原因はurllib.request.urlopen()によるものです。

BeautifulSoupとは、[urllibやrequestsなどのページ情報やリクエスト情報を取得するライブラリ]で得た情報を
パースしたり、またその中から特定の要素を抽出する等の動作に特化したライブラリです。

macOSに標準でインストールされているOpenSSLが古すぎるため、Python 3.6以降ではmacOS用のインストーラーにはOpenSSLが同梱され、システムのOpenSSLは参照されなくなりました。

これによって、OSにインストールされたルート証明書も参照されず、インストール直後の状態ではルート証明書が含まれていません1。このため、TLSサーバー証明書の検証に失敗します。

今回urllib.requestにてページ情報の取得に失敗してしまっており
以上が原因でhttps通信が出来ずエラーが生じた原因となります。
従って他の回答者様が回答している様にCertificatesをインストールしてあげる事で
そこに含まれるルート証明書を参照する様になり、正常にhttps通信によるリクエストが可能になります。


参照記事
Teratail - Webスクレイピングでのエラー
macOS用公式インストーラーのPython 3.6でCERTIFICATE_VERIFY_FAILEDとなる問題

投稿2020/10/26 11:35

nto

総合スコア1438

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

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

tss

2020/10/26 12:28

丁寧な説明ありがとうございます。 納得しました。ちょっと勘違いしていたようです。
guest

0

Pythonのインストール手順が抜けているんだと思います。
手順では、PythonをインストールしたディレクトリにあるInstall Certificates.commandを実行するようです。

投稿2020/10/26 11:01

otn

総合スコア84423

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

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

tss

2020/10/26 12:27

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問