51243

[code]

    import feedparser as feed
    url = "https://news.yahoo.co.jp/pickup/rss.xml"
    news = feed.parse(url)
    
[/code]

これでnewsの中身を見ると

[code]

    {'feed': {}, 'entries': [], 'bozo': 1, 'bozo_exception': URLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)'))}
    
[/code]

となってしまう。  
どうやらssl認証がうまくいかないっぽいです。  
どうしたらいいでしょうか？

使用バージョン  
Python 3.7.1  
macOS Mojave 10.14.2  
feedparser 5.2.1  
です。


CC BY-SA 4.0
2018-12-15T22:07:27.203
51239
2018-12-16T03:47:57.443
2018-12-16T03:16:57.407
31464
31464
question
python python3
feedparserでパースすると失敗する


これは macOS にインストールされている Python 3 が、バージョン 3.6 から macOS
デフォルトの証明書に依存しなくなったために起こるエラーです。

### 解決策

`/Applications/Python 3.7/Install Certificates.command`
を実行して、証明書をダウンロードして使えるようにする。(`Python 3.7` の部分は Python のバージョンに応じて適宜変えてください。)

たとえば「アプリケーション」から Python を探し、そのフォルダーへ行き、`Install Certificates.command`
をダブルクリックすれば良いです。

### 詳細

macOS の Python はバージョン 3.6 から macOS にインストールされている OpenSSL に依存せず、独自に OpenSSL
を内包してそちらを使うようになりました。したがって CA 証明書も共有されず、macOS 上のブラウザから HTTPS
のサイトにアクセスできても、Python からはアクセスできないという状況が生まれます。

このことの解決策は macOS 用 Python の README に書かれています:

> ## Certificate verification and OpenSSL
>
> **NEW** This variant of Python 3.6 now includes its own private copy of
> OpenSSL 1.0.2. Unlike previous releases, the deprecated Apple-supplied
> OpenSSL libraries are no longer used. This also means that the trust
> certificates in system and user keychains managed by the Keychain Access
> application and the security command line utility are no longer used as
> defaults by the Python ssl module. For 3.6.0b1, a sample command script is
> included in /Applications/Python 3.6 to install a curated bundle of default
> root certificates from the third-party certifi package
> (<https://pypi.python.org/pypi/certifi>). If you choose to use certifi, you
> should consider subscribing to the project's email update service to be
> notified when the certificate bundle is updated.
>
> The bundled pip included with the Python 3.6 installer has its own default
> certificate store for verifying download connections.

この説明が言っているように、Python 用の OpenSSL
に証明書をインストールしなければいけません。そのためのスクリプトが用意されており、それが上述の `Install Certificates.command`
です。詳しく書かれていませんがこのコマンドは pip から certifi パッケージをインストールし、更に OpenSSL のディレクトリに
certifi への symlink を貼ります。

### 参考

  * [Error CERTIFICATE_VERIFY_FAILED in macOS](https://bugs.python.org/issue28150) \-- Python tracker
  * [urllib and “SSL: CERTIFICATE_VERIFY_FAILED” Error](https://stackoverflow.com/q/27835619/5989200) \-- Stack Overflow
  * [Scraping: SSL: CERTIFICATE_VERIFY_FAILED error for http://en.wikipedia.org](https://stackoverflow.com/q/50236117/5989200) \-- Stack Overflow


CC BY-SA 4.0
2018-12-16T03:31:34.227
51243
2018-12-16T03:47:57.443
2018-12-16T03:47:57.443
19110
19110
51239
answer