启用headless=True时爬虫获取新标签页URL返回about:blank求助
Headless模式下ChromeDriver获取新标签页URL为about:blank的解决方法
爬取网站时,代码在headless=False模式下运行正常:遍历目标链接并点击,新标签页打开后切换至该标签页获取URL并存储。但启用headless=True时,获取到的URL始终为about:blank。相关代码如下:
options = webdriver.ChromeOptions() options.add_argument('--disable-notifications') #Disable notification send by chrome. Ex: ALlow location access. if headless: options.add_argument('--headless') #Run the automation in background driver = webdriver.Chrome(path_driver, options=options) driver.get(website_url) driver.set_window_size(1920, 1080) for pos, link in enumerate(tqdm(links)): actions = ActionChains(driver) actions.move_to_element(link).perform() #To move the scroll bar to current element link.click() file_names.append(link.text) driver.switch_to.window(driver.window_handles[1]) #Switch to new window url = driver.current_url file_links.append(url) driver.close() #Close the new window driver.switch_to.window(driver.window_handles[0]) #Switch back to old window
原因及解决方案
浏览器环境差异导致拦截
无头模式下Chrome的默认配置与正常浏览器不同,部分网站会拦截无头请求,或新标签页加载逻辑异常。补充以下参数模拟正常浏览器环境:options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--disable-dev-shm-usage') # 替换为你当前Chrome的User-Agent,可在浏览器控制台输入navigator.userAgent获取 options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') # 推荐使用新版无头模式,兼容性更好 options.add_argument('--headless=new')页面未加载完成就获取URL
无头模式下页面加载速度与正常模式有差异,切换标签页后立即获取URL时,页面还未完成跳转,因此返回about:blank。添加显式等待直到URL加载完成:from selenium.webdriver.support.ui import WebDriverWait # 切换到新窗口后等待URL非空白 driver.switch_to.window(driver.window_handles[1]) WebDriverWait(driver, 10).until( lambda driver: driver.current_url != 'about:blank' ) url = driver.current_url点击动作未正确触发
无头模式下ActionChains的点击可能失效,改用JavaScript强制点击链接:# 替换原actions.move_to_element和link.click()的代码 driver.execute_script("arguments[0].click();", link)
修改后的完整代码示例
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from tqdm import tqdm options = webdriver.ChromeOptions() options.add_argument('--disable-notifications') options.add_argument('--no-sandbox') options.add_argument('--disable-gpu') options.add_argument('--disable-dev-shm-usage') options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') if headless: options.add_argument('--headless=new') driver = webdriver.Chrome(path_driver, options=options) driver.get(website_url) driver.set_window_size(1920, 1080) for pos, link in enumerate(tqdm(links)): # 滚动到元素位置 actions = ActionChains(driver) actions.move_to_element(link).perform() # JavaScript强制点击 driver.execute_script("arguments[0].click();", link) file_names.append(link.text) # 等待新窗口出现 WebDriverWait(driver, 10).until( lambda driver: len(driver.window_handles) > 1 ) # 切换到新窗口并等待URL加载 driver.switch_to.window(driver.window_handles[1]) WebDriverWait(driver, 10).until( lambda driver: driver.current_url != 'about:blank' ) url = driver.current_url file_links.append(url) driver.close() # 切回原窗口 driver.switch_to.window(driver.window_handles[0])
内容的提问来源于stack exchange,提问作者DumbCoder
相关产品推荐
相关产品推荐

