要搞清楚爬虫里的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面板是主要战场。重点关注
XHR和Fetch请求,看token是从哪个请求的响应里来的,或者是作为哪个请求的参数发送的。
- 搜源码:在Sources面板里,全局搜索
token、csrf、authenticity等关键词,能找到生成或处理token的JavaScript函数。
- 逆向JS:如果遇到混淆或加密的JS,可能需要用
execjs库在Python里执行JS代码片段来模拟计算。
总结:先抓包定位token来源,再决定用解析、请求接口还是模拟浏览器的方式获取。