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

如何使用BeautifulSoup绕过「显示更多」按钮实现网页数据爬取

解决LLBean商品列表「显示更多」的爬取问题

先搞懂「显示更多」的工作机制

这个按钮本质是动态加载(AJAX):页面初始只加载start=1到start=48的商品(对应URL里的viewCount=48参数),点击「显示更多」时,浏览器会发送新的GET请求,把start参数改成49来获取下一批48个商品,再将内容追加到页面上。重复这个逻辑直到没有更多商品可加载。

修改代码实现全量爬取

你只需要循环修改URL里的start参数,每次请求后合并数据,直到某次请求返回的商品为空就停止循环。修改后的代码如下:

import requests
import bs4
import pandas as pd

# 基础URL,把start参数设为占位符,后续动态替换
base_url = 'https://www.llbean.com/llb/shop/630?page=womens-footwear&csp=f&bc=474&gnrefine=1*BRAND*L.L.Bean&sort_field=relevance&start={}&viewCount=48&nav=gnro2-hp&newPla=1'

product_data = {
    'Image':[], 
    'Style Name':[], 
    'Style Type':[], 
    'Color Offering':[], 
    'Price Point':[], 
    'Sale Price Point':[],
    'Description':[], 
    '"Why we love it" LLBEAN SPECIFIC':[], 
    'F&B/construction':[], 
    'Reviews Rating':[], 
    'Number of Reviews':[],
    'Review Notes':[], 
    'Merch Notes':[], 
    'Link':[]
}

start = 1
while True:
    # 替换start参数,构造当前请求的URL
    url = base_url.format(start)
    result = requests.get(url)
    soup = bs4.BeautifulSoup(result.text, 'lxml')
    products = soup.find_all('li', class_='ProductThumbnail_container')
    
    # 如果没有返回商品,说明已经爬完所有内容,退出循环
    if not products:
        break
    
    # 解析当前页商品数据,逻辑和你原有代码一致,优化了空值处理
    for i in products:
        product_image = i.find('img')
        product_name = i.find('a', class_='ProductThumbnail_name Anchor_not-underlined Anchor_anchor')
        product_colors = i.find('div', class_='ProductThumbnail_color-count')
        product_price = i.find('span', class_='')
        product_sales_price = i.find('span', class_='sale')
        product_rating = i.find('span', itemprop='ratingValue')
        product_number_of_reviews = i.find('a', class_='Rating_count Anchor_anchor')
        product_link = i.find('a', class_='ProductThumbnail_product')
        
        product_data['Image'].append(product_image.attrs['src'] if product_image else '')
        product_data['Style Name'].append(product_name.string if product_name else '')
        product_data['Style Type'].append('')
        
        try:
            product_data['Color Offering'].append(product_colors.string.split('"')[1] if product_colors else '')
        except:
            product_data['Color Offering'].append('')
            
        try:
            product_data['Price Point'].append(product_price.string if product_price else '')
        except:
            product_data['Price Point'].append('')
            
        try:
            product_data['Sale Price Point'].append(product_sales_price.string if product_sales_price else '')
        except:
            product_data['Sale Price Point'].append('')
            
        product_data['Description'].append('')
        product_data['"Why we love it" LLBEAN SPECIFIC'].append('')
        product_data['F&B/construction'].append('')
        
        try:
            product_data['Reviews Rating'].append(product_rating.string if product_rating else '')
        except:
            product_data['Reviews Rating'].append('')
            
        try:
            product_data['Number of Reviews'].append(product_number_of_reviews.string if product_number_of_reviews else '')
        except:
            product_data['Number of Reviews'].append('')
            
        product_data['Review Notes'].append('')
        product_data['Merch Notes'].append('')
        product_data['Link'].append(product_link.attrs['href'] if product_link else '')
    
    # 每次start增加48,获取下一批商品
    start += 48
    # 可选:添加延迟避免请求过于频繁被封禁
    # import time
    # time.sleep(1)

# 保存全量数据到CSV
df = pd.DataFrame(product_data)
df.to_csv('llbean_womens_full.csv', index=False)

额外提示

  • 建议添加time.sleep(1)这类延迟,减少被网站反爬机制封禁的风险
  • 可以给requests.get添加异常捕获,避免单个请求失败导致整个程序中断
  • 颜色数量解析部分优化了转义字符处理,直接用双引号拆分更稳妥

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:07:44