Python中如何知道爬虫token是如何计算的?

我在一个机票网站上爬数据,自从被发现后,该网站把 timestamp 改动了一下,相当于变相的 token 验证。
1. 我如何才能知道这个 timestamp 的生成方式? Chrome 控制台可以找出,或者看到函数的生成记录吗?
2. JS 经过混淆,我怎样才能从一堆看不懂的字符中找到自己想要的东西?

希望有大神给予指导。
Python中如何知道爬虫token是如何计算的?

11 回复

1 服务器接收你的 get 之后,返回一串 cookie,可能通过 JS 加密

2 慢慢看


要搞清楚爬虫里的token是怎么算的,得具体看目标网站。通常有这么几种情况:

1. 直接藏在源码里 有些网站的token就在HTML页面里,直接用正则或者BeautifulSoup就能扒出来。

import re
import requests
from bs4 import BeautifulSoup

response = requests.get('https://example.com/login')
soup = BeautifulSoup(response.text, 'html.parser')
# 找隐藏的input标签
token_input = soup.find('input', {'name': 'csrf_token'})
if token_input:
    token = token_input.get('value')
    print(f"找到的token: {token}")

2. 从接口响应里拿 更常见的是,登录前先访问某个接口,token会在JSON响应里返回。

import requests

session = requests.Session()
# 先请求获取token的接口
init_resp = session.get('https://api.example.com/init')
token_data = init_resp.json()
csrf_token = token_data.get('csrfToken')
# 后续请求带上这个token
login_data = {
    'username': 'user',
    'password': 'pass',
    'csrf_token': csrf_token
}
login_resp = session.post('https://api.example.com/login', data=login_data)

3. 用JavaScript动态生成 这种最麻烦,token可能是用前端JS代码实时算出来的。这时候就得用Selenium这类工具,或者逆向分析JS逻辑。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()
driver.get('https://example.com/login')
time.sleep(2) # 等JS加载执行
# 从页面元素里拿JS计算好的值
token_element = driver.find_element(By.ID, 'token')
dynamic_token = token_element.get_attribute('value')
driver.quit()

怎么找到计算逻辑?

  • 看网络请求:浏览器开发者工具(F12)的Network面板是主要战场。重点关注XHRFetch请求,看token是从哪个请求的响应里来的,或者是作为哪个请求的参数发送的。
  • 搜源码:在Sources面板里,全局搜索tokencsrfauthenticity等关键词,能找到生成或处理token的JavaScript函数。
  • 逆向JS:如果遇到混淆或加密的JS,可能需要用execjs库在Python里执行JS代码片段来模拟计算。

总结:先抓包定位token来源,再决定用解析、请求接口还是模拟浏览器的方式获取。

用 selenium,难得去分析 js

前端上千 /万行 js 文件中一定有。

好像只能慢慢找了……

花钱找人弄

修改其 call 的函数为 function(){debugger;}从 call stack 里找
注意 DOM API call,等价替换

万能方案是模拟浏览器,相当于每次把 js 执行一遍,所以效率会大减。

找到加密的 js 文件,找到关键函数,execJS 模拟运行,生成你要的 token

看了一下上面都没有说找加密函数的方法论,那我提两个吧。
1、chrome 的各种条件断点
2、全局搜索参数名

selenium 我用过,太慢。如果多线程容易崩溃, 我还是想接入 api 十秒两千个结果。

回到顶部