爬取二手市场商品列表时部分HTML结构异常Selenium加载失败如何解决
问题原因
- 节点混淆:你抓取的
container_related类同时被网站用于商品和第三方广告位占位,带data-engageya属性的是广告位节点,本身就不会加载商品结构,和页面加载是否完成无关。 - 分页逻辑错误:原有代码把
page_num递增放在了商品遍历循环内部,每遍历1个商品就跳1页,导致大部分分页内容没有正常请求,拿到的节点本身就是错误页的内容。 - 懒加载未触发:部分网站商品用滚动懒加载机制,不滚动到对应视口位置,后端不会返回商品内容,节点会保持占位符状态,硬等固定时长无法触发渲染。
解决方案
基础修复(requests版本)
- 过滤无效广告节点,抓取时直接排除带
data-engageya属性的容器:
products = soup.find_all('div', class_='container_related', attrs={'data-engageya': None})
- 修正分页逻辑,将
page_num += 1移到while循环末尾,处理完一整页再翻页,同时增加容错判断避免异常中断:
def cj_search(location='portugal', search_term='gtx+1080'): headers = {'user-agent': 'Mozilla/5.0'} page_num = 1 while True: page = requests.get(f'https://www.custojusto.pt/{location}/q/{search_term}?o={page_num}&sp=1&st=a', headers=headers) soup = BeautifulSoup(page.text, 'lxml') # 过滤广告节点 products = soup.find_all('div', class_='container_related', attrs={'data-engageya': None}) if not products: break for product in products: # 加容错判断,避免节点异常中断程序 try: product_name = product.find('h2', class_='title_related').find('b').text product_price = float(product.find('h5', class_='price_related').text.strip()[:-2]) product_link = product.find('a')['href'] print(f'Name: {product_name}\nPrice: {product_price}€\nLink: {product_link}\n') except AttributeError: continue # 分页递增移到此处 page_num += 1
Selenium版本优化
针对懒加载场景,替换固定时长等待为滚动触发加载:
driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get(f'https://www.custojusto.pt/{location}/q/{search_term}?o={page_num}&sp=1&st=a') # 模拟滚动3次触发全页懒加载 for _ in range(3): # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待内容加载 time.sleep(2) soup = BeautifulSoup(driver.page_source, 'lxml') # 后续同样过滤广告节点再解析即可
内容的提问来源于stack exchange,提问作者André Clérigo
相关产品推荐
相关产品推荐

