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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 15:12:24