Selenium获取Hepsiburada商品价格日期失败,无法生成走势图
解决Selenium爬取Hepsiburada价格数据为空的问题
1. 检查元素定位器是否失效
Hepsiburada的页面结构可能会更新,导致你之前用的XPath、CSS选择器失效:
- 打开浏览器开发者工具(F12),手动定位价格和日期元素,确认当前的定位表达式是否正确
- 替换旧的定位器,比如原来的
//div[@class='old-price']可能已变更,以实际页面DOM结构为准
2. 添加显式等待,避免页面未加载完成就抓取
静态等待(time.sleep())稳定性差,改用Selenium显式等待确保元素加载完成:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待价格列表元素出现,最长等待10秒 price_elements = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//更新后的价格元素XPath")) ) date_elements = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.XPATH, "//更新后的日期元素XPath")) )
3. 排查反爬机制
- 检查是否需要登录:部分商品的历史价格仅对登录用户开放,尝试手动登录后再运行脚本
- 验证是否触发验证码:如果页面出现验证码,需手动处理或添加验证码识别逻辑
- 更换User-Agent:模拟真实浏览器请求,避免被识别为爬虫:
from selenium.webdriver.chrome.options import Options options = Options() 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") driver = webdriver.Chrome(options=options)
- 控制请求频率:添加随机间隔的等待,避免短时间内频繁请求
4. 确认历史价格区域是否需要手动展开
部分商品的历史价格默认折叠,需点击展开按钮才能加载数据:
# 定位并点击展开按钮 expand_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//展开按钮的XPath")) ) expand_btn.click() # 等待展开后的数据加载完成 time.sleep(2) # 或用显式等待等待价格元素出现
5. 检查代码逻辑错误
- 确认是否误用
find_element(单个元素)而非find_elements(多个元素),导致仅获取到单个元素或无结果 - 添加异常捕获,查看具体错误信息:
try: price_elements = driver.find_elements(By.XPATH, "//目标价格元素XPath") for elem in price_elements: prices.append(elem.text.strip()) except Exception as e: print(f"抓取价格时出错: {str(e)}")
内容的提问来源于stack exchange,提问作者user14178341
相关产品推荐
相关产品推荐

