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

Boots.com护肤品分类页多页爬虫仅返回首页结果求助

爬取Boots.com护肤品分类页面时多页爬取失效的问题

我尝试爬取Boots.com护肤品分类页面(链接:https://www.boots.com/beauty/skincare/skincare-all-skincare#),该页面共有122页护肤品产品。已使用requests和BeautifulSoup成功爬取首页数据,代码如下:

productlinks = []

r = requests.get('https://www.boots.com/beauty/skincare/skincare-all-skincare')
soup = BeautifulSoup(r.content, 'lxml')

productlist = soup.find_all('div', class_ = 'product_name')
    
for item in productlist:
    for link in item.find_all('a',href = True):
        productlinks.append(link['href'])

但尝试扩展到其他页面时,仅返回首页结果,具体尝试情况如下:

1. 循环爬取重复返回首页URL

执行循环代码后得到48条结果,均为首页24条数据的重复,代码如下:

productlinks = []

for i in range (24,72,24):
    page = f'https://www.boots.com/beauty/skincare/skincare-all-skincare#facet:&productBeginIndex:{i}&orderBy:&pageView:grid&minPrice:&maxPrice:&pageSize:&'
    soup = BeautifulSoup(r.content,'lxml')
    productlist = soup.find_all('div', class_ = 'product_name')

    for item in productlist:
        for link in item.find_all('a',href = True):
            productlinks.append(link['href'])

2. 直接使用第二页URL爬取仍返回首页数据

代码如下:

productlinks = []

r = requests.get('https://www.boots.com/beauty/skincare/skincare-all-skincare#facet:&productBeginIndex:24&orderBy:&pageView:grid&minPrice:&maxPrice:&pageSize:&')
soup = BeautifulSoup(r.content,'lxml')

productlist = soup.find_all('div', class_ = 'product_name')

for item in productlist:
    for link in item.find_all('a',href = True):
        productlinks.append(link['href'])

我注意到多数网站用page=i标识页码,但Boots.com用productBeginIndex:{i},不确定是否因此导致问题。


问题原因与解决方案

问题核心是URL中的#号:浏览器会将#后的内容视为页面锚点,不会发送给服务器,因此无论你在#后添加什么参数,服务器返回的始终是首页内容。Boots.com的分页参数需要放在URL的查询参数(?后),而非锚点部分。

修复后的分页爬取代码

import requests
from bs4 import BeautifulSoup

productlinks = []
# 模拟浏览器请求头,避免被拦截
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'
}

# 爬取前3页(如需爬取全部122页,改为range(0, 122*24, 24))
for i in range(0, 72, 24):
    # 正确构造分页URL:参数放在?后,而非#后
    page_url = f'https://www.boots.com/beauty/skincare/skincare-all-skincare?facet=&productBeginIndex={i}&orderBy=&pageView=grid&minPrice=&maxPrice=&pageSize='
    # 发送请求获取当前页内容
    r = requests.get(page_url, headers=headers)
    soup = BeautifulSoup(r.content, 'lxml')
    
    productlist = soup.find_all('div', class_='product_name')
    
    for item in productlist:
        for link in item.find_all('a', href=True):
            # 拼接完整产品URL(处理相对路径)
            full_link = 'https://www.boots.com' + link['href']
            productlinks.append(full_link)

# 去重并输出结果
productlinks = list(set(productlinks))
print(f"共爬取到{len(productlinks)}条产品链接")

额外注意事项

  • productBeginIndex从0开始计数:首页为0,第二页为24,第三页为48,以此类推,每页24条数据。
  • 大规模爬取(122页)时,建议添加延时(如import time; time.sleep(1)),减轻服务器压力,降低被封禁风险。
  • 若遇到反爬机制,可进一步添加Cookie、代理IP等策略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:33:30