如何使用Selenium获取指定类名值?价格爬取及Network header获取求助
解决Alfagift商品价格爬取问题:两种可行方案
方案一:修复原有Selenium代码直接获取价格
你的原代码无法获取价格有两个核心问题:
By.CLASS_NAME不支持传入多个类名,你写的"text-xlg fw7 text-primary mb-1"是多个类的组合,应该用CSS选择器定位。- 页面是动态渲染的,直接调用
find_elements时元素可能还未加载完成,需要添加显式等待。
修改后的代码如下:
import requests from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url='https://alfagift.id/p/elmondo-jas-hujan-ceria-setelan-jaket-celana-759454' options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(ChromeDriverManager().install(),options=options) driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'}) driver.get(url) # 显式等待价格元素加载完成,最多等待10秒 price_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".text-xlg.fw7.text-primary.mb-1")) ) print(price_element.text) driver.quit()
方案二:监听网络请求提取API数据(获取指定Network项的Header)
如果页面价格是通过API动态加载的,你可以通过监听浏览器的网络请求,找到携带商品ID(759454)和fingerprint的请求,提取其Header后直接请求API获取数据,效率比渲染页面更高。
实现代码如下:
from selenium import webdriver from webdriver_manager.chrome import ChromeDriverManager import requests url='https://alfagift.id/p/elmondo-jas-hujan-ceria-setelan-jaket-celana-759454' target_product_id = "759454" options = webdriver.ChromeOptions() options.add_argument("start-maximized") options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(ChromeDriverManager().install(),options=options) driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.53 Safari/537.36'}) # 启用网络请求监听 driver.execute_cdp_cmd('Network.enable', {}) # 存储目标请求的信息 target_request = None def capture_requests(request): global target_request # 筛选包含商品ID和fingerprint的请求 if target_product_id in request['url'] and 'fingerprint' in request['headers']: target_request = request print("找到目标请求:", request['url']) print("请求Header:", request['headers']) # 添加请求监听回调 driver.execute_cdp_cmd('Network.requestWillBeSent', {}, lambda params: capture_requests(params)) driver.get(url) # 等待目标请求捕获(可根据实际情况调整等待时间) import time time.sleep(3) if target_request: # 提取必要的Header和URL api_url = target_request['url'] headers = target_request['headers'] # 用requests发送请求获取数据 response = requests.get(api_url, headers=headers) data = response.json() # 从返回的JSON中提取价格(需根据实际API返回结构调整) price = data.get('data', {}).get('price', '未找到价格') print("商品价格:", price) driver.quit()
注意事项
- API返回的JSON结构需要你自己在浏览器开发者工具中查看,调整代码中提取价格的逻辑。
- fingerprint等Header可能有有效期,若请求失败需重新获取最新的Header。
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

