本文目录导读:

我来介绍几种Python模拟前端请求的常用方法:
使用requests库(最常用)
基本GET请求
import requests
# 基本GET请求
response = requests.get('https://api.example.com/users')
print(response.json())
# 带参数的GET请求
params = {
'page': 1,
'limit': 10,
'search': 'keyword'
}
response = requests.get('https://api.example.com/users', params=params)
POST请求(模拟表单提交)
import requests
# 表单数据
data = {
'username': 'testuser',
'password': '123456'
}
# 模拟登录请求
response = requests.post('https://api.example.com/login', data=data)
print(response.status_code)
print(response.text)
发送JSON数据
import requests
import json
# JSON数据
json_data = {
'name': '张三',
'email': 'zhangsan@example.com',
'age': 25
}
# 设置请求头
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer your_token_here'
}
# 发送POST请求
response = requests.post(
'https://api.example.com/users',
json=json_data,
headers=headers
)
模拟浏览器行为
添加浏览器请求头
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1'
}
response = requests.get('https://example.com', headers=headers)
使用Session保持会话
import requests
# 创建session对象
session = requests.Session()
# 设置默认headers
session.headers.update({
'User-Agent': 'Mozilla/5.0...',
'Accept-Language': 'zh-CN,zh;q=0.9'
})
# 第一次请求(登录)
login_data = {'username': 'admin', 'password': 'admin123'}
session.post('https://example.com/login', data=login_data)
# 后续请求自动携带cookie
response = session.get('https://example.com/dashboard')
print(response.text)
处理AJAX请求
模拟异步请求
import requests
import json
# 模拟前端AJAX请求
headers = {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest', # AJAX标志
'Accept': 'application/json'
}
# 发送请求并期望JSON响应
response = requests.post(
'https://api.example.com/data',
json={'action': 'fetch_data'},
headers=headers
)
if response.status_code == 200:
data = response.json()
print(data)
处理复杂场景
文件上传模拟
import requests
# 模拟文件上传
files = {
'file': ('test.txt', open('test.txt', 'rb'), 'text/plain')
}
response = requests.post('https://example.com/upload', files=files)
处理重定向和cookies
import requests
# 允许重定向
response = requests.get('https://example.com/redirect', allow_redirects=True)
# 获取cookies
cookies = response.cookies
for key, value in cookies.items():
print(f'{key}: {value}')
# 使用cookies
cookies_dict = {'session_id': 'abc123'}
response = requests.get('https://example.com/profile', cookies=cookies_dict)
完整示例:模拟登录并获取数据
import requests
from bs4 import BeautifulSoup
class WebScraper:
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
def login(self, username, password):
"""模拟登录"""
login_url = 'https://example.com/login'
# 先获取登录页面(获取CSRF token等)
login_page = self.session.get(login_url)
soup = BeautifulSoup(login_page.text, 'html.parser')
csrf_token = soup.find('input', {'name': 'csrf_token'})['value']
# 发送登录请求
login_data = {
'username': username,
'password': password,
'csrf_token': csrf_token
}
response = self.session.post(login_url, data=login_data)
return response.ok
def get_profile(self):
"""获取用户信息"""
profile_url = 'https://example.com/profile'
response = self.session.get(profile_url)
return response.json()
# 使用示例
scraper = WebScraper()
if scraper.login('admin', 'password123'):
profile = scraper.get_profile()
print(profile)
使用异步请求(aiohttp)
import asyncio
import aiohttp
async def fetch_data():
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com/data') as response:
return await response.json()
# 运行异步请求
data = asyncio.run(fetch_data())
print(data)
实用技巧
-
设置超时时间:
response = requests.get(url, timeout=10)
-
异常处理:
try: response = requests.get(url) response.raise_for_status() # 检查状态码 except requests.exceptions.RequestException as e: print(f"请求失败: {e}") -
代理设置:
proxies = { 'http': 'http://proxy.example.com:8080', 'https': 'https://proxy.example.com:8080' } response = requests.get(url, proxies=proxies)
这些方法覆盖了大多数前端请求模拟场景,根据实际需求选择合适的方式即可。