如何让requests.get使用与浏览器一致的同一会话访问目标页面
问题原因
你碰到的爬取数值和浏览器打开不一致的问题,和会话是否匹配没有关系。websudoku.com 每次收到指向根路径的GET请求时,服务端都会动态生成一套全新的随机数独盘面,不管你用浏览器还是requests发起请求,哪怕请求头、cookie完全一致,只要是新的请求打到根路径,返回的都是新盘面,数值自然不可能和之前打开的页面对应上。
解决方法
- 不要直接请求无参数的根域名:每个生成的数独都有唯一固定的
set_id标识,浏览器打开某一个具体数独时,地址栏的URL会带参数,格式为https://www.websudoku.com/?level=难度等级&set_id=数字ID,你只要把这个带完整参数的URL作为requests的请求地址,就能拿到和当前浏览器页面完全一致的数独内容,不需要刻意复刻全量浏览器会话。 - 基础反爬适配:requests默认的请求头很容易被站点识别拦截,只需要补一个常规浏览器的User-Agent头即可正常请求,示例代码:
import requests from bs4 import BeautifulSoup # 替换为浏览器打开目标数独时带set_id的完整URL url = "https://www.websudoku.com/?level=1&set_id=替换为实际的ID值" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } res = requests.get(url, headers=headers) res.encoding = res.apparent_encoding soup = BeautifulSoup(res.text, "html.parser") # 后续执行数独盘面解析逻辑即可
- 如果你确实需要完全对齐浏览器会话做其他操作:在浏览器打开目标数独页面后按F12调出开发者工具,在「网络」面板找到对应文档请求,右键选择「复制为cURL」,再把cURL内容转换为requests代码即可,所有cookie、请求头都会自动同步,不需要手动逐个配置。
注意:即使用
requests.Session()创建持久化会话,只要你反复请求不带set_id参数的根路径,每次请求都会返回新生成的数独,数值永远无法和之前的页面对齐。
内容的提问来源于stack exchange,提问作者Aditya suresh
相关产品推荐
相关产品推荐

