使用Selenium爬取网站时返回不完整HTML,无法获取全部商品卡片
解决Gap网站爬取商品卡片结果不足的问题
以下是几个常见原因和对应的解决方法:
1. 商品列表需要滚动触发动态加载
Gap的商品列表采用滚动加载机制,只等待4秒只会加载页面初始显示的少量商品。你需要模拟滚动到底部的操作,触发更多商品加载,直到页面不再更新内容。
代码示例:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options import time url = 'https://www.gap.com/browse/category.do?cid=5664&nav=meganav%3AWomen%3ACategories%3AJeans#pageId=0&department=136' options = Options() options.add_argument('--headless') # 添加UA伪装和反检测参数 options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36') options.add_argument('--disable-blink-features=AutomationControlled') driver = webdriver.Chrome(options=options, executable_path='/Users/wangxining/Downloads/chromedriver_mac_arm64/chromedriver') driver.get(url) # 循环滚动加载所有商品 last_scroll_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 等待加载时间可根据网络调整 current_scroll_height = driver.execute_script("return document.body.scrollHeight") if current_scroll_height == last_scroll_height: break last_scroll_height = current_scroll_height soup = BeautifulSoup(driver.page_source, 'html.parser') product_cards = soup.find_all('div', class_='product-card') print(f"共抓取到 {len(product_cards)} 个商品卡片") driver.quit()
2. 避免使用动态生成的Class名
你代码中使用的category-page-zu5l9z这类Class后缀是动态生成的,每次页面加载都会变化,导致定位不到元素。改用固定不变的product-card类来定位,就能稳定获取商品卡片。
3. 用显式等待替代硬等待
time.sleep(4)是硬等待,无法保证页面元素完全加载完成。改用Selenium的显式等待,等待商品卡片元素出现后再解析页面,更可靠:
代码片段示例:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 滚动加载后,等待商品卡片全部加载完成 WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'product-card')) ) soup = BeautifulSoup(driver.page_source, 'html.parser') product_cards = soup.find_all('div', class_='product-card')
4. 解决Headless模式被检测的问题
部分网站会识别Headless浏览器并限制内容渲染,添加UA伪装和禁用自动化检测参数,能避免被网站拦截,确保页面正常加载。
内容的提问来源于stack exchange,提问作者shealynnn
相关产品推荐
相关产品推荐

