Selenium Python 循环执行失效:批量抓取新闻链接结果为空
问题原因
- 核心时序不匹配:代码未设置任何页面等待逻辑。
driver.get()仅触发页面加载指令,默认等待页面基础HTML框架加载完成即返回执行后续代码。该站点的新闻列表为异步渲染,基础框架加载完成时,link-detailpage对应的新闻元素还未生成,此时直接执行定位操作会返回空列表。手动逐行执行时,人工操作的间隔天然给了页面渲染时间,因此可正常抓取。 - API兼容性问题:代码使用的
find_element_by_id、find_elements_by_tag_name、find_elements_by_class_name为Selenium 3及更早版本的废弃API,Selenium 4+环境下这类方法可能失效,进一步导致定位异常。
修复方案
- 替换废弃的旧定位API,统一使用
By类的标准定位方法。 - 为每个页面的目标元素添加显式等待,确保元素完全渲染后再执行抓取操作。
- 可配置页面加载策略,减少冗余等待时长。
修复后的完整可运行代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器时可配置页面加载策略,按需启用 # options = webdriver.ChromeOptions() # options.page_load_strategy = 'eager' # 仅等待DOM加载完成,不等待图片、样式等静态资源 driver = webdriver.Chrome('C:/Users/SoumyaPandey/Desktop/Galytix/Scrapers/data_ingestion/chromedriver.exe') # 初始化显式等待,最长等待10秒,可根据网络情况调整时长 wait = WebDriverWait(driver, 10) driver.get('https://www.cnhindustrial.com/en-us/media/press_releases/Pages/default.aspx') years_urls = list() # 等待年份筛选控件加载完成后再定位年份元素 years_container = wait.until( EC.presence_of_element_located((By.ID, 'ctl00_ctl33_g_8893c127_d0ad_40f2_9856_d85936172f35_years')) ) years_elements = years_container.find_elements(By.TAG_NAME, 'a') for year_ele in years_elements: years_urls.append(year_ele.get_attribute('href')) newslinks = list() for year_url in years_urls: driver.get(year_url) # 等待新闻列表元素渲染完成后再抓取 news_elements = wait.until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'link-detailpage')) ) for news_ele in news_elements: newslinks.append(news_ele.find_element(By.TAG_NAME, 'a').get_attribute('href')) # 抓取完成后关闭浏览器,释放资源 driver.quit()
内容的提问来源于stack exchange,提问作者Soumya Pandey
相关产品推荐
相关产品推荐

