You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium+BeautifulSoup爬取电商站点时价格字段返回None问题求助

问题核心原因

你用Selenium完成邮编提交后,站点会把邮编验证状态存在当前浏览器会话的Cookie里,但你后续抓取页面用的是独立的requests库,requests不会自动携带Selenium浏览器会话里的Cookie,站在站点视角,你用requests发的请求都是未提交过邮编的新访客,自然返回的页面没有价格字段。

解决方案

方案1:全程使用Selenium抓取(兼容性最高)

无需混用requests,所有页面访问、元素提取都用Selenium完成,直接复用已经提交过邮编的浏览器会话,修正后参考代码:

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

driver = webdriver.Chrome(executable_path = "D:\chromedriver\chromedriver.exe")
driver.maximize_window()
wait = WebDriverWait(driver, 30)
baseurl = 'https://www.russellhendrix.com'

# 提交邮编的原有逻辑保持不变
driver.get("https://www.russellhendrix.com/category/185/cooking-equipment?pagesize=600")
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.entity-product-price-wrap.grid-item-price-wrap"))).click()
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input#gv-postcalcode"))).send_keys("B3K 1X2")
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.gv-red-btn.gv-set-postal"))).click()
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, "a.gv-red-btn.gv-set-postal")))
time.sleep(3) # 无需等待60秒,弹窗消失后会话状态就已生效

# 用Selenium提取产品链接
product_eles = driver.find_elements(By.CSS_SELECTOR, "div.entity-product-image-wrap a")
productlinks = [ele.get_attribute('href') for ele in product_eles]

# 复用已有会话访问产品页提取信息
for link in productlinks:
    driver.get(link)
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.regPriceValue")))
    skunumber = driver.find_element(By.CSS_SELECTOR, "table.product-details-table").text
    pricing = driver.find_element(By.CSS_SELECTOR, "div.regPriceValue").text
    print(skunumber, pricing)

driver.quit()

方案2:导出Selenium Cookie给requests使用

如果要继续使用requests+BeautifulSoup的技术栈,只要把Selenium会话里的Cookie导出,后续所有requests请求都携带该Cookie即可:

# 在邮编提交完成的代码后新增Cookie导出逻辑
cookies = driver.get_cookies()
requests_cookies = {}
for cookie in cookies:
    requests_cookies[cookie['name']] = cookie['value']

# 之后所有requests.get请求都加上cookies参数
r = requests.get(url, headers=headers, cookies=requests_cookies)

额外优化建议

  • 你原有代码里重复请求了两次分类页,还有一处请求漏传了headers参数,这类冗余代码可以直接清理
  • 60秒等待没有必要,过长的等待反而可能触发会话超时,只要确认邮编提交弹窗消失即可进入后续抓取逻辑

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:39:01