如何使用Beautiful Soup绕过网站Cookie协议以爬取https://cage.dla.mil内容
你遇到的这类问题很常见——这类网站的Cookie同意机制不是简单手动设置一个agree=True就能绕过的,必须先获取服务器生成的初始会话Cookie(包括那个你发现的唯一值Cookie),再模拟点击同意按钮时的请求,服务器才会认可你已接受协议。
问题根源
你之前的代码直接手动设置了agree Cookie,但忽略了服务器在第一次访问时会分配一个唯一的会话标识Cookie(比如类似ASP.NET_SessionId这类),服务器需要验证这个会话Cookie的有效性,仅设置agree=True无法通过验证,所以还是会返回协议页面。
正确解决步骤
- 用Session管理会话:
requests.Session()会自动帮你保存所有服务器设置的Cookie,包括那个唯一值的会话Cookie,避免手动管理的麻烦。 - 先访问协议页面拿初始Cookie:第一次请求协议页面时,服务器会把必要的Cookie下发给你,Session会自动留存这些Cookie。
- 模拟提交同意请求:通过浏览器开发者工具找到点击"I Agree"时网站发送的请求(URL、请求方法、参数),用Session发送这个请求完成协议接受。
- 访问目标页面:此时Session已经持有有效的Cookie,再请求目标页面就能拿到实际内容了。
具体代码示例
import requests from bs4 import BeautifulSoup # 关键URL(同意请求的URL需要你用浏览器确认,下面是示例) usage_agree_url = "https://cage.dla.mil/Home/UsageAgree" accept_cookies_url = "https://cage.dla.mil/Home/AcceptCookies" # 需替换为实际同意请求URL target_page_url = "https://cage.dla.mil/" # 你要爬取的实际页面 # 创建会话,自动管理Cookie session = requests.Session() # 设置浏览器UA,避免被反爬识别 session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' }) # 第一步:访问协议页面,获取服务器下发的初始Cookie session.get(usage_agree_url) # 第二步:发送同意Cookie的请求(根据实际请求方法调整,POST/GET) # 如果是POST且需要表单参数,添加data={'agree': 'True'}这类参数 session.post(accept_cookies_url) # 第三步:访问目标页面,获取实际内容 response = session.get(target_page_url) # 解析并输出内容 soup = BeautifulSoup(response.content, "html.parser") print(soup.prettify())
细节调整提示
- 确认同意请求的细节:打开浏览器F12开发者工具→Network标签,点击"I Agree"按钮,找到新生成的请求,查看它的请求URL、方法(GET/POST)和表单参数,对应调整代码里的请求方式和参数。
- 处理CSRF Token(如果有):部分网站会在协议页面的HTML里隐藏一个CSRF Token(比如
<input name="__RequestVerificationToken" value="xxx">),需要先用BeautifulSoup提取这个值,再加到同意请求的data参数里一起提交。
内容的提问来源于stack exchange,提问作者impossibru
相关产品推荐
相关产品推荐

