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

Python使用requests循环爬取多分页仅返回第一页数据问题求解

问题原因
    1. 请求方法使用错误:目标站点的分页参数通过URL查询参数page传递,属于标准GET请求场景,你使用POST请求时服务端会忽略URL携带的page参数,默认返回第一页内容,单次请求能生效大概率是临时缓存导致的偶发现象。
    1. Python函数可变默认参数陷阱:你定义的get_profile_link函数将空列表作为默认参数,Python中列表这类可变对象作为默认参数时,只会在函数定义阶段初始化一次,后续所有不传该参数的调用都会复用同一个列表对象,虽然这个问题不是你返回重复第一页的核心原因,但会导致后续数据累加逻辑异常。
    1. 反爬策略拦截:默认的requests请求头会被站点识别为爬虫,即使参数正确也可能统一返回第一页内容,你的r.cookies为空就是因为服务端没有给爬虫请求返回正常的会话cookie。
修复方案

第一步:修正函数默认参数写法

避免使用可变对象作为函数默认参数,修改为如下写法:

def get_profile_link(profile_links, profiles=None):
    if profiles is None:
        profiles = []
    for link in profile_links:
        profiles.append(link['href'])
    return profiles

第二步:更换请求方法、添加模拟浏览器请求头

将POST请求改为GET,同时添加User-Agent请求头模拟正常浏览器访问,避免被反爬识别:

# 请求头可替换为你自己浏览器的实际UA
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}

第三步:调整循环逻辑,统一存储结果

初始化一个全局列表存储所有爬取结果,每次调用提取函数时传入该列表做累加,可选添加请求延时避免触发频率限制:

import time

all_profiles = []
for x in range(0, 21):
    r = s.get(urls[x], headers=headers)
    # 每次请求间隔1-2秒,根据站点响应速度调整
    time.sleep(1.5)
    soup = bs(r.content, "html.parser")
    links = soup.find_all('a', attrs={'data-link_text': "Profile Button"})
    all_profiles = get_profile_link(links, all_profiles)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:04