使用BeautifulSoup爬取Konga网站返回空列表,求技术帮助
解决Konga网站三星手机爬取返回空列表的问题
问题根源分析
- 反爬拦截:默认
requests.get请求未携带浏览器标识,网站会识别为爬虫,返回空页面或无目标内容。 - 动态类名失效:代码中使用的
af885_1iPzH这类类名是网站动态生成的,每次页面加载都会变化,导致选择器无法匹配元素。 - 未校验请求状态:没有检查响应状态码,无法及时发现请求失败的情况。
- 元素缺失容错不足:部分商品可能没有旧价格或折扣,直接
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
相关产品推荐
相关产品推荐

