Python爬取带分页电商商品页仅能获取第一页该如何修复?
问题核心原因
你拼接的分页参数放在了URL锚点(#后面的部分),锚点参数仅在浏览器前端路由做跳转使用,不会被发送到服务端,所以不管你pageNumber拼的是多少,服务端收到的请求永远是第一页的地址,自然只会返回第一页内容。
修复方案
第一步:抓包找真实分页接口
打开Chrome/Firefox的开发者工具(F12),切换到「网络」面板,筛选「XHR/Fetch」类型,手动点击页面上的第二页、第三页按钮,观察触发的后台请求:
- 通常这类异步加载的分页会请求独立的后台接口,分页参数
pageNumber、pageSize等会作为Query参数或者POST请求的Body参数传递,不会放在锚点里 - 复制这个接口的请求地址、请求方法、请求头、参数格式即可
第二步:调整代码逻辑
提供两个可选方案,可根据网站渲染逻辑选择:
方案1:直接请求真实接口(效率最高)
如果抓包拿到了后台数据接口,直接请求接口拿JSON数据即可,不需要解析HTML,示例逻辑:
import requests import time headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36', # 补充抓包拿到的其他必要请求头,比如Referer、X-Requested-With等 'Referer': 'https://www.acihellas.gr/gaming-pontikia' } urllist = [] page_number = 4 # 总页数 # 注意range左闭右开,要爬4页的话需要写page_number+1 for itm in range(1, page_number+1): print(f"爬取第{itm}页") # 替换成你抓包拿到的真实分页接口,参数对应修改 params = { 'pageSize': 21, 'viewMode': 'grid', 'orderBy': 10, 'pageNumber': itm } r = requests.get('https://www.acihellas.gr/替换为实际接口地址', headers=headers, params=params) if r.status_code == 200: data = r.json() # 从JSON里提取商品链接,字段名根据返回的实际结构调整 for product in data['products']: productlink = product['url'] url_item = 'https://acihellas.gr' + productlink urllist.append(url_item) time.sleep(2)
方案2:用无头浏览器渲染前端页面(兼容性最好)
如果网站是纯前端渲染,没有暴露公开数据接口,用Selenium、Playwright这类工具模拟浏览器运行,自动点击分页按钮拿内容,Selenium示例逻辑:
from selenium import webdriver from selenium.webdriver.common.by import By import time from bs4 import BeautifulSoup urllist = [] driver = webdriver.Chrome() driver.get('https://www.acihellas.gr/gaming-pontikia#/') page_number = 4 for itm in range(page_number): time.sleep(3) # 等待页面异步加载完成 soup = BeautifulSoup(driver.page_source, 'lxml') productlist = soup.find_all('div',attrs = {'class','item-box'}) for p_item in productlist: a = p_item.find('a') if a: productlink = a['href'] url_item = 'https://acihellas.gr'+productlink urllist.append(url_item) # 模拟点击下一页按钮,选择器根据页面实际元素修改即可 if itm < page_number -1: next_btn = driver.find_element(By.CSS_SELECTOR, 'li.next-page a') next_btn.click() driver.quit()
补充原代码其他小问题
你原来的循环range(1, page_number)如果总页数是4的话,只会跑1、2、3三次,漏掉第4页,需要改成range(1, page_number+1)。
内容的提问来源于stack exchange,提问作者Ας Μαθουμε
相关产品推荐
相关产品推荐

