Cookie
Cookie 是保存在客户端(通常是浏览器)上的一个小型文本文件。它由服务器发送,并且在之后的每次请求中,客户端都会自动将这个 Cookie 附带到请求头中,发送回服务器。
在用户登录之后,为了能够准确地获取到用户的登录信息,服务器通常会生成一个唯一的 Session ID,并将其存储在 Cookie 中。这个 Cookie 会跟随请求头一起提交到服务器。这样,服务器就能够识别出这是哪一个用户,从而返回相应的数据。
可以使用 模块 requests 的 session来模拟这种行为。session
对象会自动管理和维护服务器返回的 Cookie。具体来说,当你使用 session
对象发送请求时,服务器返回的 Cookie 会被自动保存,并且在后续请求中,session
对象会自动附带这些 Cookie。
import requests
# 创建一个session对象
session = requests.Session()
# 准备用户名和密码
data = {
"username": "testuser",
"password": "testpass"
}
# 设置User-Agent
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}
# 登录请求
login_url = "https://httpbin.org/post"
response = session.post(login_url, data=data, headers=headers)
# 检查状态码
if response.status_code == 200:
print("登录请求成功,状态码:", response.status_code)
else:
print("登录请求失败,状态码:", response.status_code)
# 打印响应内容
print("登录响应内容:", response.json())
# 查看session中保存的cookies
print("Cookies:", session.cookies)
# 带着cookie请求另一个页面
response2 = session.get("https://httpbin.org/cookies")
if response2.status_code == 200:
print("获取Cookies页面请求成功,状态码:", response2.status_code)
else:
print("获取Cookies页面请求失败,状态码:", response2.status_code)
# 打印获取Cookies页面的响应内容
print("获取Cookies页面响应内容:", response2.json())
登录请求成功,状态码: 200
登录响应内容: {'args': {}, 'data': '', 'files': {}, 'form': {'password': 'testpass', 'username': 'testuser'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '35', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36', 'X-Amzn-Trace-Id': 'Root=1-669a74c2-2f1473ba4669055015c87eba'}, 'json': None, 'origin': '18.163.49.25', 'url': 'https://httpbin.org/post'}
Cookies: <RequestsCookieJar[]>
获取Cookies页面请求成功,状态码: 200
获取Cookies页面响应内容: {'cookies': {}}
Referer
防盗链,本次的请求是由哪个url产生。
import requests
# 视频页面URL
url = "https://www.某视频.com/video_1795272"
# 从URL中提取视频ID
contId = url.split("_")[1]
# 构造视频状态的URL
videoStatus_url = f"https://www.某视频.com/videoStatus.jsp?contId={contId}&mrd=0.8097797275308494"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
"Referer": url
}
# 发送GET请求,获取视频状态信息
response = requests.get(videoStatus_url, headers=headers)
response_data = response.json()
# 从返回的数据中提取系统时间和视频URL
systemTime = response_data['systemTime']
videoUrl = response_data["videoInfo"]['videos']['srcUrl']
# 替换URL中的时间戳部分,拼接出真正的视频URL地址
videoUrl = videoUrl.replace(systemTime, f"cont-{contId}")
print("视频URL:", videoUrl)
# 下载视频并保存为文件
video_content = requests.get(videoUrl).content
video_filename = f"{contId}.mp4"
with open(video_filename, mode="wb") as f:
f.write(video_content)
print(f"视频已下载并保存为 {video_filename}")