Selenium 在爬取过程中,网络响应被退出的解决方案_selenium闪退
我在使用 Selenium 爬取网站的时候,直接get url ,却立马闪退,遇到了获取网络响应直接被退出的问题。
这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。
以下是 完整排查与解决方案:
1. 检查常见原因
webdriver
属性)TimeoutException
或无响应2. 解决方案
✅ 方案 1:绕过浏览器检测
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsoptions = Options()options.add_argument(\"--disable-blink-features=AutomationControlled\")options.add_experimental_option(\"excludeSwitches\", [\"enable-automation\"])options.add_experimental_option(\"useAutomationExtension\", False)driver = webdriver.Chrome(options=options)# 修改 navigator.webdriver 属性driver.execute_cdp_cmd(\"Page.addScriptToEvaluateOnNewDocument\", { \"source\": \"\"\" Object.defineProperty(navigator, \'webdriver\', { get: () => undefined }) \"\"\"})
✅ 方案 2:使用 undetected-chromedriver
(推荐)
import undetected_chromedriver as ucdriver = uc.Chrome( version_main=114, # 匹配你的 Chrome 版本 headless=False, # 无头模式容易被检测 use_subprocess=True)driver.get(\"https://目标网站.com\")
✅ 方案 3:模拟人类行为(降低检测概率)
import timeimport randomfrom selenium.webdriver.common.action_chains import ActionChains# 随机延迟(避免固定时间间隔)time.sleep(random.uniform(1, 3))# 模拟鼠标移动actions = ActionChains(driver)actions.move_by_offset(random.randint(10, 50), random.randint(10, 50))actions.perform()
✅ 方案 4:处理 Cloudflare / 反爬验证
# 方法 1:更换 User-Agentoptions.add_argument(\"user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\")# 方法 2:使用代理 IPoptions.add_argument(\"--proxy-server=http://代理IP:端口\")# 方法 3:手动处理验证码(如 2Captcha 服务)
✅ 方案 5:检查网络问题
from selenium.common.exceptions import TimeoutExceptiontry: driver.set_page_load_timeout(30) # 设置超时时间 driver.get(\"https://目标网站.com\")except TimeoutException: print(\"页面加载超时,可能是网络问题或网站拦截\") driver.quit()
3. 高级调试技巧
📌 检查网络请求(Chrome DevTools)
from selenium.webdriver.common.desired_capabilities import DesiredCapabilitiescaps = DesiredCapabilities.CHROMEcaps[\'goog:loggingPrefs\'] = {\'performance\': \'ALL\'} # 启用网络日志driver = webdriver.Chrome(desired_capabilities=caps)# 获取网络日志logs = driver.get_log(\'performance\')for log in logs: print(log)
📌 使用 selenium-wire
捕获 HTTP 请求
from seleniumwire import webdriverdriver = webdriver.Chrome()driver.get(\"https://目标网站.com\")# 查看所有请求for request in driver.requests: if request.response: print(request.url, request.response.status_code)
4. 终极解决方案
如果仍然被拦截,可以:
- 更换 IP(使用住宅代理,如 Luminati)
- 降低爬取频率(增加随机延迟)
- 改用 Puppeteer/Playwright(更接近真实浏览器)
- 模拟登录 Cookie(避免被识别为新会话)
总结
undetected-chromedriver
+ 修改 webdriver
属性set_page_load_timeout
以上是一些解决方法,我在爬取网站的时候,遇到网站闪退,很有可能是被该网址“封号”了,这个是跟登录账号相关的,或者跟响应方式有关。
如果是账号问题,可能是这个账号登录太多次,导致被拉黑
如果是响应方式的问题,可能一些网址要通过其他方式打开,而不能直接连接这个网址,例如:
html 有这样的元素
onclick=\"searchlog
说明后面接着的网址是不能直接去get url的,要点击才可以,那么这种就只能模拟点击的方法才能获取url的响应了。
具体的做法可以参考:
【Python】Selenium切换网页的标签页的写法(全!!!)