解决Selenium网站截图时SSL握手失败(handshake failed)问题求助
我用Selenium实现网站全屏截图时,部分网站访问出现SSL握手失败错误,导致无法截图,错误日志如下:
t[0901/133518.496:ERROR:ssl_client_socket_impl.cc(968)] handshake failed; returned -1, SSL error code 1, net_error -100
[0901/133522.374:ERROR:ssl_client_socket_impl.cc(968)] handshake failed; returned -1, SSL error code 1, net_error -100
[0901/133527.577:ERROR:ssl_client_socket_impl.cc(968)] handshake failed; returned -1, SSL error code 1, net_error -100
[0901/133527.862:ERROR:ssl_client_socket_impl.cc(968)] handshake failed; returned -1, SSL error code 1, net_error -100
我的实现代码:
# selenium 4 from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager import os import datetime #ヘッドレス実行 ※全画面用 options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument("--ignore-certificate-error") options.add_argument('--ignore-certificate-errors-spki-list') options.add_argument("--ignore-ssl-errors") driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),options=options) driver.implicitly_wait(10) # seconds driver.get("https://パズドラ.gamewith.jp/") #driver.get("https://laboratory.kazuuu.net/get-the-width-and-height-of-an-image-using-python/") #driver.get("https://pad.gungho.jp/member/") #driver.get("https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html") #保存する画像ファイル名 fname = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') #スクショ保存ディレクトリが存在しなければ生成 if os.path.isdir(os.getcwd()+"\\ss") == False: os.mkdir(os.getcwd()+"\\ss") #ウインドウサイズをWebサイトに合わせて変更 ※全画面用 width = driver.execute_script("return document.body.scrollWidth;") height = driver.execute_script("return document.body.scrollHeight;") driver.set_window_size(width,height) #スクショをPNG形式で保存 driver.get_screenshot_as_file(os.getcwd() + "\\ss\\" + fname + ".png")
解决方案
补充SSL忽略参数:现有参数覆盖场景有限,添加以下参数进一步放宽证书校验:
options.add_argument('--allow-insecure-localhost') options.add_argument('--disable-web-security') options.add_argument('--allow-running-insecure-content') options.add_argument('--ignore-urlfetcher-cert-requests')指定ChromeDriver版本:新版Chrome可能存在SSL策略兼容性问题,指定稳定版本安装:
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="114.0.5735.90").install()), options=options)添加真实用户代理:无头模式默认代理可能被网站拦截,补充浏览器用户代理:
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36')切换旧版无头模式:新版无头模式(
--headless=new)可能存在SSL兼容性问题,切换回旧版:options.add_argument('--headless=old')检查系统根证书:若上述方法无效,可能是系统缺失网站根证书,手动导入对应根证书到系统证书库。
内容的提问来源于stack exchange,提问作者yushi

