Python爬虫在采集需要权限的数据时,第一步往往是模拟登录。登录的核心通常是向服务器发送POST请求并提交表单数据,之后处理可能的重定向与验证码校验。下面我们逐步拆解其中的技术细节。

一、POST提交表单数据的基本流程
大多数网站登录接口接收用户名、密码等字段。我们可以通过浏览器的开发者工具找到表单字段名称和提交地址,再用requests库发送请求。
import requests
# 创建会话,自动保存cookie
session = requests.Session()
login_url = 'https://ipipp.com/login'
form_data = {
'username': 'test_user',
'password': 'test_pass',
'csrf_token': 'abc123' # 部分站点需要防跨站字段
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
# 发送POST请求
resp = session.post(login_url, data=form_data, headers=headers)
print(resp.status_code)
print(resp.text[:200])
使用Session对象可以在多次请求间保持cookie,这是登录后继续访问其他页面的关键。
二、处理登录后的重定向
有些网站在登录成功后会返回302状态码并指向个人中心页面。requests默认会自动跟随重定向,但如果需要手动控制,可以设置allow_redirects=False。
resp = session.post(login_url, data=form_data, headers=headers, allow_redirects=False)
if resp.status_code == 302:
# 获取重定向地址
next_url = resp.headers.get('Location')
print('需跳转至:', next_url)
# 带着已有cookie访问
page = session.get(next_url)
print(page.status_code)
重定向过程中,会话中的cookie会被自动携带,因此不需要重新登录。
三、验证码登录逻辑处理
当网站开启验证码时,登录表单通常还要提交验证码字段。我们需要先请求验证码图片接口,再识别后填入表单。
1. 获取验证码图片
captcha_url = 'https://ipipp.com/captcha'
cap_resp = session.get(captcha_url, headers=headers)
with open('captcha.png', 'wb') as f:
f.write(cap_resp.content)
2. 提交带验证码的表单
# 假设已通过人工或OCR得到验证码文本
captcha_text = '8x4f'
form_data['captcha'] = captcha_text
login_resp = session.post(login_url, data=form_data, headers=headers)
if '登录成功' in login_resp.text:
print('登录完成')
else:
print('登录失败,请检查验证码或账号')
如果验证码频繁失效,应注意请求间隔,并确认验证码接口和登录接口在同一个会话下调用。
四、常见注意事项
- 表单字段名必须和抓包一致,包括隐藏字段如
csrf_token。 - 请求头中的
Referer和User-Agent有时是必填项。 - 本地调试可使用127.0.0.1或192.168.0.1搭建mock服务。
登录逻辑的本质是复现浏览器行为:带cookie、带正确字段、处理跳转。只要请求和浏览器一致,爬虫就能稳定登录。