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

