我在使用 Selenium 爬取网站的时候,直接get url ,却立马闪退,遇到了获取网络响应直接被退出的问题。
这通常是由于 反爬机制、浏览器检测 或 网络限制 导致的。
以下是 完整排查与解决方案:
问题类型 | 典型表现 | 可能原因 |
---|---|---|
浏览器检测 | 页面加载后立即关闭 | 被检测到自动化工具(如 webdriver 属性) |
反爬机制 | 返回 403/404 或跳转验证码 | 请求头、IP 或行为异常 |
网络限制 | TimeoutException 或无响应 |
代理问题、DNS 污染、Cloudflare 拦截 |
页面重定向 | 获取不到目标数据 | 网站强制跳转(如登录页) |
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = 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
})
"""
})
undetected-chromedriver
(推荐)import undetected_chromedriver as uc
driver = uc.Chrome(
version_main=114, # 匹配你的 Chrome 版本
headless=False, # 无头模式容易被检测
use_subprocess=True
)
driver.get("https://目标网站.com")
import time
import random
from 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()
# 方法 1:更换 User-Agent
options.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:使用代理 IP
options.add_argument("--proxy-server=http://代理IP:端口")
# 方法 3:手动处理验证码(如 2Captcha 服务)
from selenium.common.exceptions import TimeoutException
try:
driver.set_page_load_timeout(30) # 设置超时时间
driver.get("https://目标网站.com")
except TimeoutException:
print("页面加载超时,可能是网络问题或网站拦截")
driver.quit()
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities.CHROME
caps['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 webdriver
driver = webdriver.Chrome()
driver.get("https://目标网站.com")
# 查看所有请求
for request in driver.requests:
if request.response:
print(request.url, request.response.status_code)
如果仍然被拦截,可以:
问题 | 解决方案 |
---|---|
浏览器检测 | undetected-chromedriver + 修改 webdriver 属性 |
反爬拦截 | 更换 User-Agent + 代理 IP |
网络超时 | 增加 set_page_load_timeout |
验证码 | 使用 2Captcha 或手动处理 |
以上是一些解决方法,我在爬取网站的时候,遇到网站闪退,很有可能是被该网址“封号”了,这个是跟登录账号相关的,或者跟响应方式有关。
如果是账号问题,可能是这个账号登录太多次,导致被拉黑
如果是响应方式的问题,可能一些网址要通过其他方式打开,而不能直接连接这个网址,例如:
html 有这样的元素
onclick="searchlog
说明后面接着的网址是不能直接去get url的,要点击才可以,那么这种就只能模拟点击的方法才能获取url的响应了。
具体的做法可以参考:
【Python】Selenium切换网页的标签页的写法(全!!!)