网页数据爬取遇token验证问题:如何自动获取token并自定义参数获取新冠数据
可行实现方案
目前你遇到的Token和请求参数绑定问题,可通过以下两种成熟方案解决:
方案1:无头浏览器模拟请求(新手友好)
- 优势:无需分析站点JS加密逻辑,适配性强,只要前端可正常渲染就能拿到对应有效Token
- 操作步骤:使用Playwright模拟用户访问页面、修改查询参数的操作,自动捕获接口请求携带的有效Token,再携带Token发起自定义请求即可
- 环境准备:执行安装命令
pip install playwright playwright install chromium
- 参考代码:
from playwright.sync_api import sync_playwright import requests import time def get_covid_data(start_date, end_date): with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() valid_token = None # 监听所有网络请求,捕获目标接口的x-data-token def capture_token(route, request): nonlocal valid_token if "report-epi-province" in request.url and "start_time" in request.url: valid_token = request.headers.get("x-data-token") route.continue_() page.route("**/*", capture_token) # 访问目标页面 page.goto("https://ncov.vncdc.gov.vn/viet-nam-full.html") page.wait_for_timeout(1500) # 模拟修改日期参数,触发查询请求(选择器可根据站点实际结构调整) page.fill('input[placeholder="开始日期"]', start_date) page.fill('input[placeholder="结束日期"]', end_date) page.click('text=查询') # 替换为站点实际查询按钮的选择器 page.wait_for_timeout(2000) browser.close() if not valid_token: raise Exception("未捕获到有效Token,请调整页面操作逻辑") # 携带有效Token发起请求 timestamp = int(time.time()*1000) url = f'https://ncov.vncdc.gov.vn/v2/vietnam/report-epi-province?start_time={start_date}&end_time={end_date}&province_ids=&district_ids=&get_time={timestamp}' headers = {'x-data-token': valid_token} response = requests.get(url, headers=headers) return response.json() # 调用示例 if __name__ == "__main__": data = get_covid_data("2021-04-27", "2021-09-25") print(data)
方案2:逆向JS解析Token生成逻辑(性能更高)
- 优势:请求速度快,资源消耗低,适合批量高频抓取
- 操作步骤:
- 打开浏览器控制台,切换到Sources标签,搜索
x-data-token关键字,定位Token生成的JS代码段 - 分析生成逻辑:这类和参数绑定的Token一般是将start_time、end_time、时间戳等参数拼接后,加盐做MD5/SHA哈希运算得到
- 将逆向得到的JS加密逻辑翻译成Python代码,每次请求前根据自定义参数实时生成对应Token即可
- 参考代码框架:
import hashlib import requests import time def generate_token(start_date, end_date, timestamp): # 此处拼接规则需替换为你实际逆向得到的逻辑 raw_str = f"{start_date}{end_date}{timestamp}站点固定盐值" return hashlib.md5(raw_str.encode()).hexdigest() def get_covid_data(start_date, end_date): timestamp = int(time.time()*1000) token = generate_token(start_date, end_date, timestamp) url = f'https://ncov.vncdc.gov.vn/v2/vietnam/report-epi-province?start_time={start_date}&end_time={end_date}&province_ids=&district_ids=&get_time={timestamp}' headers = {'x-data-token': token} return requests.get(url, headers=headers).json()
注意:请遵守目标站点的robots协议和数据使用规范,不要高频发起请求对站点造成负担,抓取的数据仅可用于合法的非商用研究用途。
内容的提问来源于stack exchange,提问作者Kha Nguyễn Minh
相关产品推荐
相关产品推荐

