You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页数据爬取遇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生成逻辑(性能更高)

  • 优势:请求速度快,资源消耗低,适合批量高频抓取
  • 操作步骤:
  1. 打开浏览器控制台,切换到Sources标签,搜索x-data-token关键字,定位Token生成的JS代码段
  2. 分析生成逻辑:这类和参数绑定的Token一般是将start_time、end_time、时间戳等参数拼接后,加盐做MD5/SHA哈希运算得到
  3. 将逆向得到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:30:02