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

使用BeautifulSoup爬取Konga网站返回空列表,求技术帮助

解决Konga网站三星手机爬取返回空列表的问题

问题根源分析

  1. 反爬拦截:默认requests.get请求未携带浏览器标识,网站会识别为爬虫,返回空页面或无目标内容。
  2. 动态类名失效:代码中使用的af885_1iPzH这类类名是网站动态生成的,每次页面加载都会变化,导致选择器无法匹配元素。
  3. 未校验请求状态:没有检查响应状态码,无法及时发现请求失败的情况。
  4. 元素缺失容错不足:部分商品可能没有旧价格或折扣,直接zip会因长度不一致导致数据丢失。

修复方案与代码

import requests
from bs4 import BeautifulSoup
import pandas as pd

# 模拟浏览器请求头,避免被反爬拦截
headers = {
    "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"
}

data = []

# 循环爬取25页数据
for page in range(1, 26):
    url = f"https://www.konga.com/category/phones-tablets-5294?brand=Samsung&page={page}"
    response = requests.get(url, headers=headers)
    
    # 校验请求是否成功
    if response.status_code != 200:
        print(f"第{page}页请求失败,状态码:{response.status_code}")
        continue
    
    soup = BeautifulSoup(response.content, 'html.parser')
    
    # 定位商品卡片容器(使用稳定的data-testid属性选择器)
    product_cards = soup.select("div[data-testid='product-card']")
    
    for card in product_cards:
        # 提取商品名称,做容错处理
        name_tag = card.select_one("h3[data-testid='product-name']")
        name = name_tag.get_text(strip=True) if name_tag else "无名称"
        
        # 提取新价格
        new_price_tag = card.select_one("span[data-testid='product-price']")
        new_price = new_price_tag.get_text(strip=True) if new_price_tag else "无新价格"
        
        # 提取旧价格(部分商品无此信息)
        old_price_tag = card.select_one("span[data-testid='product-old-price']")
        old_price = old_price_tag.get_text(strip=True) if old_price_tag else "无旧价格"
        
        # 提取折扣(部分商品无此信息)
        discount_tag = card.select_one("span[data-testid='product-discount']")
        discount = discount_tag.get_text(strip=True) if discount_tag else "无折扣"
        
        data.append({
            "Phone Names": name,
            "New Prices": new_price,
            "Old Prices": old_price,
            "Discounts": discount
        })

# 转换为DataFrame查看结果
df = pd.DataFrame(data)
print(df.head())

关键修改说明

  • 加入headers参数模拟浏览器请求,绕过基础反爬机制。
  • 使用data-testid属性编写选择器,这类属性为测试专用,不会随页面更新动态变化,稳定性更高。
  • 增加请求状态码检查,快速定位请求失败的页面。
  • 对每个元素做存在性判断,避免因部分商品缺少字段导致的报错,同时填充默认值保证数据完整性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:15:55