使用BeautifulSoup爬取数据异常:仅获9条而非600+,求解决方案
解决Lenskart VC-Air畅销眼镜爬取数据不全的问题
核心问题排查
- 列表初始化位置错误:原代码在循环内每次都重置
Model、Size等列表,导致前一页数据被覆盖,最终仅保留最后一页结果。 - 循环变量冲突:外层循环用
i作页码变量,内层遍历元素也用i,会干扰循环计数逻辑。 - 无反爬请求头:直接发送请求易被网站识别为爬虫,返回不完整或空页面。
- 潜在动态加载问题:部分产品数据可能通过JavaScript渲染,静态请求无法获取。
修正后的完整代码
import requests from bs4 import BeautifulSoup # 初始化全局存储列表(放在循环外,避免数据丢失) all_models = [] all_sizes = [] all_ratings = [] all_prices = [] # 模拟浏览器请求头,规避反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 遍历页码,避免变量名冲突 for page_num in range(1, 64): url = f'https://www.lenskart.com/eyeglasses/marketing/vc-air-bestseller-eyeglasses.html?page={page_num}' r = requests.get(url, headers=headers) # 检查请求状态,跳过失败页面 if r.status_code != 200: print(f"第{page_num}页请求失败,状态码:{r.status_code}") continue soup = BeautifulSoup(r.text, "lxml") # 提取当前页产品名称 for name in soup.find_all('div', class_="product-name"): all_models.append(name.text.strip()) # 提取当前页尺寸信息 for size in soup.find_all('span', class_="tags"): all_sizes.append(size.text.strip()) # 提取当前页评分 for rating in soup.find_all('span', class_="rating-value"): all_ratings.append(rating.text.strip()) # 提取当前页价格 for price in soup.find_all('span', class_="text-color-dark-blue fw700"): all_prices.append(price.text.strip()) print(f"第{page_num}页数据已抓取,累计产品数:{len(all_models)}") # 输出最终结果统计 print(f"最终抓取产品总数:{len(all_models)}")
额外优化建议
- 添加请求延迟:导入
time模块,在循环内加入time.sleep(1),避免频繁请求触发反爬机制。 - 处理动态渲染:若静态请求仍无法获取全部数据,改用
Selenium模拟浏览器加载页面,确保抓取JavaScript渲染的内容。 - 数据一致性校验:检查各列表长度是否一致,避免因页面元素缺失导致数据错位。
内容的提问来源于stack exchange,提问作者Ganeshwar
相关产品推荐
相关产品推荐

