新しい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'))