如何使用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
相关产品推荐
相关产品推荐

