You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Selenium(Chrome)打开页面空白返回空HTML的问题求助

解决Selenium打开Arket网站返回空白HTML的问题

我在用Selenium(不管开不开无头模式)打开目标网站时,页面经常显示空白,返回的HTML是<html><head></head><body></body></html>,但手动浏览器打开完全正常。试过设置time.sleep(10)、移除随机UserAgent、添加--remote-debugging-port=9222--no-sandbox这些启动参数,甚至重装了chromedriver,都没解决。偶尔能正常加载,但大部分时候不行。昨天还出现过返回<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body></body></html>的情况。我的代码如下:

url = "https://www.arket.com/de_de/men/knitwear/product.alpaca-blend-jumper-grey.0937502001.html"
options = Options()
ua = UserAgent()
userAgent = ua.random
options.add_argument(f'user-agent={userAgent}')
#options.add_argument("headless")
driver = webdriver.Chrome('/path/to/chromedriver', options=options)
time.sleep(5)
driver.get(url)
time.sleep(5)
soup = BeautifulSoup(driver.page_source, 'html.parser')
time.sleep(0.5)
driver.quit()
soup

请问该怎么解决这个问题?

我之前也碰到过电商网站反爬导致Selenium加载空白页的情况,结合你的代码和问题描述,给你几个针对性的解决方案:

1. 隐藏Selenium自动化特征,避免被反爬检测

Arket这类电商站的反爬机制会检测navigator.webdriver等自动化标识,你需要彻底隐藏这些特征:

from selenium.webdriver.chrome.options import Options

options = Options()
# 建议用真实的主流浏览器UA,比如Chrome最新版本的UA,比随机UA更稳定
options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36')
# 禁用自动化控制提示
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)
# 执行JS移除webdriver标识
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

2. 用显式等待替代固定sleep,确保页面加载完成

固定的time.sleep()太不可靠,网页加载速度受网络影响波动大。改用显式等待,等待页面关键元素出现后再获取源码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver.get(url)
try:
    # 等待商品标题元素加载(根据Arket页面实际元素调整选择器)
    WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CLASS_NAME, 'product-name'))
    )
except TimeoutException:
    print("页面关键元素加载超时,可能被反爬拦截")
# 此时再获取页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')

3. 检查地域限制,尝试使用德国代理IP

目标网站是德国区的Arket,可能会验证访问IP的地域。如果你的IP不在德国,网站可能返回空白页。可以添加德国代理:

# 替换成有效的德国代理IP和端口
options.add_argument('--proxy-server=http://de-proxy-ip:port')

同时可以模拟德语环境,减少地域检测风险:

options.add_argument('--lang=de-DE')

4. 确保Chrome和chromedriver版本完全匹配

版本不兼容是Selenium常见问题,建议用webdriver-manager自动管理chromedriver版本,避免手动匹配出错:

from webdriver_manager.chrome import ChromeDriverManager

# 自动安装匹配当前Chrome版本的chromedriver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

5. 启用无头模式时使用新版参数

如果需要无头模式,建议用Chrome 112+支持的--headless=new,它的行为更接近真实浏览器,不容易被检测:

options.add_argument("--headless=new")
options.add_argument("--window-size=1920,1080")  # 设置窗口大小,避免页面布局异常
options.add_argument("--disable-gpu")

内容的提问来源于stack exchange,提问作者sebk

火山引擎 最新活动