如何借助Session ID/Referrer访问静态URL网站的下一页?
解决分页爬取失败的方案
核心问题分析
你的代码存在几个关键疏漏:没有用同一个Session全程管理会话、未携带页面的CSRF令牌、可能缺少必要的请求头模拟浏览器行为。以下是具体修复步骤:
步骤1:全程使用同一个Session管理会话
Session会自动保存和携带cookies,无需手动传递,确保请求处于同一会话中:
import requests from bs4 import BeautifulSoup # 初始化Session,所有请求都用这个session发送 session = requests.Session() base_domain = "https://arcinsys.hessen.de" # 替换为你实际的第一页完整URL first_page_url = f"{base_domain}/arcinsys/你的第一页路径" # 获取第一页内容,session自动保存cookies response = session.get(first_page_url) soup = BeautifulSoup(response.content, 'html.parser')
步骤2:提取CSRF令牌
页面表单中的_csrf字段是网站验证请求合法性的关键,必须携带:
# 从第一页HTML中提取CSRF令牌 csrf_token = soup.find('input', {'name': '_csrf'})['value']
步骤3:构造下一页请求
有两种可行的请求方式,任选其一即可:
方式一:直接调用分页链接
从data-href提取下一页相对路径,拼接完整URL并带上CSRF令牌:
# 获取下一页的相对链接 next_page_rel_path = soup.find('span', id='pId3')['data-href'] next_page_url = f"{base_domain}{next_page_rel_path}&_csrf={csrf_token}" # 添加Referer头,模拟浏览器跳转行为 headers = { 'Referer': first_page_url } # 请求下一页 next_response = session.get(next_page_url, headers=headers) # 验证响应状态,200表示成功 print(next_response.status_code) # 解析下一页内容 next_soup = BeautifulSoup(next_response.content, 'html.parser')
方式二:模拟表单提交
直接提交分页表单,更贴近浏览器原生操作:
# 构造表单参数 form_data = { '_csrf': csrf_token, 'pageposition': '2' # 目标页码 } # 表单提交的目标URL form_action_url = f"{base_domain}/arcinsys/recherchePagingSelect.action" # 发送表单请求 next_response = session.get(form_action_url, params=form_data, headers=headers) next_soup = BeautifulSoup(next_response.content, 'html.parser')
关键注意事项
- 不要混用
requests.get()和session.get(),全程用同一个Session对象 - 必须携带
_csrf参数,否则网站会拒绝请求 Referer头是模拟浏览器跳转的必要字段,部分网站会验证来源
内容的提问来源于stack exchange,提问作者ssp24
相关产品推荐
相关产品推荐

