requestsライブラリを使用し、特定のURLへアクセスを試み、そのページがSSL化されているかどうかをチェックするプログラムを作成致しました。
該当のコードは以下になります。
def check_ssl_certification(targetURL, waitsec_from=1, waitsec_to=3): err_msg = {} headers = { "User-Agent": ( "Mozilla/5.0 (X11; Linux x86_64; rv:57.0)" "Gecko/20100101 Firefox/57.0" ) } session = requests.Session() # retries = Retry(total=1, # リトライ回数 # backoff_factor=1, # sleep時間(リトライするごとに待機時間を指定した秒数加算する) # status_forcelist=[500, 502, 503, 504],raise_on_status=False) # timeout以外でリトライするステータスコード """ Session.mount(prefix, adapter) はこのセッションで行う URL が prefix で始まる HTTP 通信に対して、 アダプター adapter を設定する関数。 prefix="https://" の場合、URL が https:// で始まるすべての通信が対象 """ # session.mount("https://", HTTPAdapter(max_retries=retries)) # session.mount("http://", HTTPAdapter(max_retries=retries)) try: # print('ok') response = session.get( url=targetURL, headers=headers, stream=True, timeout=(20.0, 30.0) ) except ssl.SSLError: print("SSL認証エラー") except ssl.CertificateError as e: print("エラー", e) except requests.exceptions.ConnectTimeout: print("タイムアウトしました。") err_msg["connection_timeout"] = "ホストへの接続に失敗しました。" except requests.exceptions.ConnectionError as e: print("ホストが見つかりませんでした(https)", e) err_msg["no_host"] = "ホストが見つかりませんでした。" return response # HTTP ステータスコードが 4xx と 5xx の場合は urllib.error.HTTPError 例外が投げられる except requests.exceptions.HTTPError as e: print(e.response.status_code) # except requests.exceptions.RetryError: # print('再試行制限に到達しました') except requests.exceptions.ReadTimeout as e: print("requests.exceptions.ReadTimeoutエラー : ", e) except requests.exceptions.TooManyRedirects as e: print("エラー: ", e) else: print("レスポンスステータス: ", response.status_code) # sys.exit() s = randint(waitsec_from, waitsec_to) sleep(s) msg_headder = "random sleep " + str(s) + "sec" print( str(datetime.datetime.now()) + "," + msg_headder + "," + response.url, file=codecs.open("requests.log", "a", "utf-8"), ) # print('response.raise_for_status()' ,response.raise_for_status()) return response return err_msg
こちらのコードなのですが、仮にSSL化されていないサイトをtargetURL
に設定し、リクエストをかけてみますと、except requests.exceptions.ConnectionError as e:
こちらの例外が捕捉されてしまいます。
エラー内容は以下になります。
HTTPSConnectionPool(host='リクエストを送ったURL', port=443): Max retries exceeded with url: /ec_website/login.php (Caused by SSLError(CertificateError("hostname 'リクエストを送ったURL' doesn't match either of '*.php.xdomain.ne.jp', 'php.xdomain.ne.jp'",),))
エラー内容にCaused by SSLError(CertificateError
と表示されている通り、根本的なエラーの原因はこちらだと思う為、上記コードにおきましては、except ssl.CertificateError as e:
を捕捉したいと考えています。
エラー内容で調べていましたら、こちらの記事でもCaused by~~
といった形でエラーが出力されていたのですが、ここの部分のエラーを捕捉するか判定するような方法はありませんでしょうか。
ご助言頂けましたら幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/18 08:11 編集
2021/06/18 08:36
2021/06/18 08:42