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

Python爬虫获取Stack Overflow分页页码错误如何解决?

问题原因
  • 你的代码默认分页容器内除最后一个「下一页」按钮外的所有a标签均对应连续数字页码,不符合Stack Overflow分页控件的实际结构:当搜索结果总页数较多时,分页控件会插入跳转到全站招聘内容总最后一页的按钮,你提取到的83是全站招聘内容的总页数,而非python分类下的24页。
  • 未对提取到的span文本做合法性校验,非数字、非当前搜索条件下的页码内容会被误存入结果列表。
  • 未添加请求头的User-Agent标识,站点可能会返回异常的默认页面内容,导致分页信息和实际搜索结果不匹配。
修复方案

优化后的逻辑优先通过分页标签的属性和链接参数提取信息,可靠性远高于提取页面文本:

  1. 加合法的User-Agent请求头,保证返回的页面内容和浏览器访问一致
  2. 优先查找带rel="last"属性的分页标签,直接从其链接参数中提取当前搜索条件下的总页数,该值为站点官方返回的准确最大页码
  3. 对提取到的页码文本增加纯数字校验、最大页码范围校验,过滤异常值

修正后代码如下:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs

url = "https://stackoverflow.com/jobs?q=python"
# 模拟浏览器UA,避免站点返回异常内容
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"
}

so_info = requests.get(url, headers=headers)
so_soup = BeautifulSoup(so_info.text, "html.parser")
pagination = so_soup.find("div", {"class": "s-pagination"})
pages = pagination.find_all("a")

page_numbers = []
max_page = None

# 提取当前搜索条件的准确最大页码
last_page_tag = pagination.find("a", {"rel": "last"})
if last_page_tag:
    last_url = last_page_tag["href"]
    query_params = parse_qs(urlparse(last_url).query)
    max_page = int(query_params.get("pg", [0])[0])

# 提取当前页显示的连续有效页码
for page in pages[:-1]:
    span_text = page.find("span").get_text().strip()
    # 仅保留纯数字、且不超过最大页码的内容
    if span_text.isdigit():
        page_num = int(span_text)
        if not max_page or page_num <= max_page:
            page_numbers.append(str(page_num))

print(page_numbers)
print(f"python分类招聘内容总页数:{max_page}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:54:04