立花証券がurllib3でエラー

新しいpandasではrollingにrankが使えるらしいからとモジュールを上げていたら立花証券e支店のコードが動かなくなった。どうもurllib3がいかんらしい。

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='kabuka.e-shiten.jp', port=443): Max retries exceeded with url: /e_api_v4r5/ (Caused by SSLError(SSLEOFError(8, '[SSL: UNEXPECTED_EOF_WHILE_READING] EOF occurred in violation of protocol (_ssl.c:1000)')))

なんのこっちゃと思ったけど、どうもSSL/TSLまわりぽい。以下のような単純なコードでもエラーになるからね。

import urllib3

http = urllib3.PoolManager()
url = 'https://kabuka.e-shiten.jp/e_api_v4r5/'
response = http.request('GET', url)

print(response.data.decode('utf-8'))

他のサイトだと問題はない。kabuka.e-shiten.jpだけである。困った。

結論から言うと暗号方式を以下のように指定すると通る。

import urllib3
import ssl

# 機能: ホームページデータの取得。
# 備考: 'str_url'で指定した先に接続し、応答データを取得する。

# ページを指定
str_url = 'https://kabuka.e-shiten.jp/e_api_v4r5/'

# カスタムのSSLコンテキストを作成
ssl_context = ssl.create_default_context()

# ソケットで利用する暗号方式を指定
ssl_context.set_ciphers('RSA+AES')

# urllib3のPoolManagerを作成し、カスタムのSSLコンテキストを渡す
http = urllib3.PoolManager(ssl_context=ssl_context)
req = http.request('GET', str_url)

# 応答データを表示
print(req.data.decode('shift-jis'))

Leave a Reply

Your email address will not be published. Required fields are marked *