Python爬虫获取Stack Overflow分页页码错误如何解决?
问题原因
- 你的代码默认分页容器内除最后一个「下一页」按钮外的所有a标签均对应连续数字页码,不符合Stack Overflow分页控件的实际结构:当搜索结果总页数较多时,分页控件会插入跳转到全站招聘内容总最后一页的按钮,你提取到的
83是全站招聘内容的总页数,而非python分类下的24页。 - 未对提取到的span文本做合法性校验,非数字、非当前搜索条件下的页码内容会被误存入结果列表。
- 未添加请求头的User-Agent标识,站点可能会返回异常的默认页面内容,导致分页信息和实际搜索结果不匹配。
修复方案
优化后的逻辑优先通过分页标签的属性和链接参数提取信息,可靠性远高于提取页面文本:
- 加合法的User-Agent请求头,保证返回的页面内容和浏览器访问一致
- 优先查找带
rel="last"属性的分页标签,直接从其链接参数中提取当前搜索条件下的总页数,该值为站点官方返回的准确最大页码 - 对提取到的页码文本增加纯数字校验、最大页码范围校验,过滤异常值
修正后代码如下:
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
相关产品推荐
相关产品推荐

