Python爬虫使用Selenium的Chrome无头模式时,页面跳转问题如何解决?
本小菜最近在做一个爬虫抓数据,遇到个问题,请教各位大佬。
在使用 selenium 与谷歌浏览器抓取数据时,在正常模式下程序是没问题的,但是在 headless 模式下,由于没有 handle,所以会识别不了哪个 tab 页面,比较苦恼。好几天了也没有解决,网上也找不到相关解决办法。
程序基本流程就是:
页面 1:selenium 自动 输入用户名、密码,登陆成功。然后点击页面内的一个图标链接,此时会跳一个新的页面(页面 2 )。
页面 2:页面 2 打开后,点击其中某个链接,会再跳出一个新的页面(页面 3 )。
页面 3:抓取页面 3 中的相关内容。
现在的问题:
这些新的 tab 页面,页面 2、页面 3 在 headless 模式下怎么定位到,求救!
Python爬虫使用Selenium的Chrome无头模式时,页面跳转问题如何解决?
用Selenium的Chrome无头模式时,页面跳转问题通常是因为页面加载策略或等待机制没处理好。无头模式下页面渲染和网络请求的时机和普通模式有差异。
核心解决方案是设置明确的等待条件。别用time.sleep(),用WebDriverWait配合expected_conditions。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置无头模式
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get("https://example.com")
# 等待页面完全加载
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
# 点击某个链接触发跳转
link = driver.find_element(By.LINK_TEXT, "下一页")
link.click()
# 关键:等待新页面加载完成
# 方法1:等待特定元素出现(推荐)
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "content-area"))
)
# 方法2:等待URL变化
WebDriverWait(driver, 10).until(
EC.url_changes("https://example.com")
)
# 获取新页面内容
page_source = driver.page_source
print("成功获取新页面内容")
finally:
driver.quit()
如果页面用了很多JavaScript,可能需要等更长时间或者检查DOM状态:
# 等待JavaScript执行完成
WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return document.readyState") == "complete"
)
# 或者等待某个JavaScript变量/函数可用
WebDriverWait(driver, 10).until(
lambda d: d.execute_script("return typeof window.myApp !== 'undefined'")
)
另外,检查下ChromeDriver和Chrome版本是否匹配,不匹配也会出各种奇怪问题。
总结:用显式等待替代隐式等待和固定休眠。
登录成功后,find element 到 a 元素,把 a 元素的 href 提取出来,driver 去 get。
打开新的标签页也不过是把 a 元素的 target 属性给了在新窗口打开的值而已。
忘记说了,这个链接是通过 js 方法跳转的,方法比较复杂,最终生成的链接上加上了 sessionid 等较多参数,我尝试过用 selenium 直接执行 js,但是由于定位不到哪个 tab 页面,所以失败。 如果是个 href 的值就好了 :(:(

