如何爬取有登陆的界面

 人参与 | 时间:2026-10-17 06:51:00

登录页面背后藏着一道门,何爬门后是登陆的界数据。爬虫想进去,何爬得先拿到钥匙——也就是登陆的界那串Cookie或Token。没这东西,何爬你发出去的登陆的界请求全都会撞在登录墙上,返回一个302跳转或者干脆给你个401。何爬

我最早踩这个坑是登陆的界爬一个内部论坛。用requests直接怼首页,何爬拿到的登陆的界永远是登录页的HTML。后来用浏览器F12打开Network面板,何爬手动登录一次,登陆的界盯着请求头看,何爬才发现关键就在Cookie字段里那个sessionid。登陆的界把它复制到代码里,何爬请求一发,数据就回来了。就这么简单,也这么直接。

手动拿Cookie:最笨但最快的方法

打开Chrome,登录目标网站,按F12,切到Network标签,刷新页面。找到第一个请求,看Request Headers里的Cookie值,整段复制。然后在代码里这样写:

import requests headers = {  'Cookie': 'sessionid=abc123; csrftoken=xyz789; other=value', 'User-Agent': 'Mozilla/5.0 ...' } resp = requests.get('https://example.com/data', headers=headers) print(resp.text) 

这招适合临时抓点数据。缺点是Cookie会过期,短则几小时,长则几天。过期了就得重新登一次手动复制。你要是天天爬,这法子能把人逼疯。

用requests.Session模拟登录流程

更靠谱的做法是让代码自己走一遍登录流程。核心是requests.Session(),它会自动保持Cookie。关键步骤:先GET登录页拿到CSRF token(很多网站藏在hidden input里),再POST用户名密码。

s = requests.Session() login_page = s.get('https://example.com/login') # 用BeautifulSoup解析出csrf_token soup = BeautifulSoup(login_page.text, 'html.parser') token = soup.find('input', { 'name': 'csrf_token'})['value'] payload = {  'username': 'your_user', 'password': 'your_pass', 'csrf_token': token } s.post('https://example.com/login', data=payload) # 之后用s.get()访问任何页面都带着登录态 data = s.get('https://example.com/protected') 

我遇到过一种情况:登录接口返回的是JSON,但CSRF token藏在响应头里而不是HTML。那就得先发一个空POST拿token,再带着token正式登录。每个网站的实现都不一样,得具体看。

Selenium:当JavaScript掺和进来的时候

有些登录页面用JS动态生成参数,或者有滑块验证、短信验证码。这时候requests就力不从心了。Selenium直接驱动真实浏览器,你点什么它点什么。

from selenium import webdriver driver = webdriver.Chrome() driver.get('https://example.com/login') driver.find_element('id', 'username').send_keys('your_user') driver.find_element('id', 'password').send_keys('your_pass') driver.find_element('id', 'submit-btn').click() # 等页面跳转完成后,Cookie已经在driver里了 cookies = driver.get_cookies() # 可以把cookies转给requests继续用 

Selenium慢,吃内存,但对付复杂登录页面确实省心。我一般用它只做登录这一步,拿到Cookie后转给requests去批量抓数据,速度能快不少。

Token放在请求头里的情况

现在很多前后端分离的站点不用Cookie了,改用Authorization头。登录接口返回一个JWT,后续请求都得带上Authorization: Bearer <token>。这种反而好处理,不用管Session,直接把token存下来,每次请求塞进headers就行。token过期时间通常写在JWT的payload里,base64解码就能看到exp字段,提前刷新即可。

几个实际会卡住你的细节

User-Agent别用默认的python-requests,很多网站直接拦。Referer有时候也检查,尤其是POST请求。还有,登录成功后别急着关Session,先访问一个需要登录的页面确认状态,不然你可能拿着一个根本没登上的Session在瞎跑。我吃过这个亏,调试了半天以为是解析逻辑错了,结果压根没登录成功。

另外,别把账号密码硬编码在脚本里。用环境变量或者单独的配置文件,尤其是你要把代码传到GitHub上的时候。

顶: 655踩: 33