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

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,提问作者Ας Μαθουμε

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:07