POST请求返回JSON为null问题排查及Cookies、Tokens自动生成实现问询
咱们先来理清楚核心问题:你手动填入的这些Cookies和Token,都是网站在用户首次访问页面时动态生成并绑定到当前会话的。要实现自动化,就得完整模拟用户从加载页面到完成验证的整个流程。下面分步骤给你具体的实现方法:
1. 用会话获取初始Cookies和__RequestVerificationToken
网站的__RequestVerificationToken(ASP.NET的防伪造令牌)是嵌入在页面HTML里的隐藏输入框中,而会话Cookies(比如.AspNetCore.Antiforgery.*和BIGipServer*)会在你首次GET请求页面时由服务器自动设置。我们可以用requests.Session()来自动维护会话Cookies,再用BeautifulSoup解析页面提取令牌:
import requests from bs4 import BeautifulSoup # 初始化会话,自动管理Cookies session = requests.Session() # 模拟浏览器的User-Agent,避免被识别为爬虫 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36' } # 首次访问目标页面,获取Cookies和验证Token response = session.get('https://services.paci.gov.kw/card/search', headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 从页面的隐藏input中提取__RequestVerificationToken verification_token = soup.find('input', {'name': '__RequestVerificationToken'})['value'] print(f"已获取防伪造令牌: {verification_token[:20]}...")
2. 自动获取Google reCAPTCHA Token
你代码里的Token字段是Google reCAPTCHA的验证响应(也就是前端提交的g-recaptcha-response),这是网站的反爬机制。要自动获取这个Token,通常需要借助第三方验证码破解服务(比如2Captcha)——因为手动破解reCAPTCHA的难度极高。
下面是集成2Captcha的示例代码(你需要先注册2Captcha账号并获取API密钥):
def get_recaptcha_token(api_key, sitekey, target_url): # 向2Captcha提交reCAPTCHA破解任务 submit_url = f"http://2captcha.com/in.php?key={api_key}&method=userrecaptcha&googlekey={sitekey}&pageurl={target_url}" submit_response = requests.get(submit_url) if not submit_response.text.startswith('OK'): raise Exception(f"提交验证码任务失败: {submit_response.text}") captcha_id = submit_response.text.split('|')[1] # 轮询等待破解结果 while True: result_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}" result_response = requests.get(result_url) if result_response.text.startswith('OK'): return result_response.text.split('|')[1] elif result_response.text == 'CAPCHA_NOT_READY': import time time.sleep(2) # 等待2秒后重试 else: raise Exception(f"获取验证码结果失败: {result_response.text}") # 配置你的2Captcha密钥和目标网站的reCAPTCHA Sitekey(从页面源码的data-sitekey属性提取) CAPTCHA_API_KEY = "你的2Captcha API密钥" RECAPTCHA_SITEKEY = "从目标页面源码中找到的sitekey值" TARGET_URL = "https://services.paci.gov.kw/card/search" # 获取reCAPTCHA验证Token recaptcha_token = get_recaptcha_token(CAPTCHA_API_KEY, RECAPTCHA_SITEKEY, TARGET_URL) print(f"已获取reCAPTCHA令牌: {recaptcha_token[:20]}...")
3. 组装请求并发起查询
现在把所有获取到的凭证组装起来,用之前的会话发起POST请求——会话会自动带上之前获取的Cookies,确保请求的合法性:
# 组装请求参数 payload = { 'CivilId': '278071306337', 'Token': recaptcha_token, 'InquiryType': '2', '__RequestVerificationToken': verification_token, } # 发起POST请求 response = session.post('https://services.paci.gov.kw/card/search', headers=headers, data=payload) # 处理响应结果 print(response.text) with open('Output.txt', 'w', encoding='utf-8') as f: f.write(response.text)
关键注意事项
- 会话必须保持:全程使用同一个
requests.Session()实例,因为网站的Cookies和Token是绑定到会话的,分开的请求会导致凭证失效。 - UA要真实:一定要设置和浏览器一致的User-Agent,很多网站会拦截默认的
python-requests/xxxUA。 - 合规性问题:使用第三方验证码服务时,要确保符合目标网站的服务条款,避免触发反爬机制导致IP或账号被封禁。
内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

