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
相关产品推荐
相关产品推荐

