破解登录限制:Python爬虫模拟登录与Cookie持久化技巧

发布时间:2026/6/19 4:36:54

破解登录限制:Python爬虫模拟登录与Cookie持久化技巧 前段时间需要爬某知识付费平台的专栏内容但是不登录只能看前10%每次手动复制Cookie又特别麻烦研究了一周把各种模拟登录和Cookie持久化的方法都摸透了现在爬需要登录的网站不用开浏览器代码自动就能搞定今天把完整的方法分享给大家所有代码直接复制就能用。先搞懂原理网站登录是怎么回事当你在浏览器输入账号密码点击登录之后服务器会返回一个Set-Cookie的响应头浏览器会把这些Cookie存下来之后每次请求这个网站都会自动带上这些Cookie服务器通过Cookie就能识别你已经登录了。爬虫模拟登录的核心就是拿到登录后的Cookie之后每次请求都带上这个Cookie就能和浏览器一样访问需要登录才能看到的内容。方法一最简单的方案手动复制Cookie5分钟搞定适合偶尔用一次不想写复杂登录逻辑的场景直接从浏览器里复制Cookie到代码里用importrequests# 从浏览器F12的Network里找登录后的请求复制Request Headers里的Cookie字段cookie_str你的Cookie字符串直接从浏览器复制就行# 把Cookie字符串转成字典defcookie_str_to_dict(cookie_str):cookie_dict{}forlineincookie_str.split(;):key,valueline.strip().split(,1)cookie_dict[key]valuereturncookie_dict cookiescookie_str_to_dict(cookie_str)headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36}# 请求需要登录的页面带上cookies参数responserequests.get(https://example.com/需要登录才能访问的页面,headersheaders,cookiescookies)print(response.text)优点超级简单不用写登录逻辑不管什么验证码、什么加密登录都能绕过缺点Cookie会过期一般几天到几周不等过期了要重新复制不适合长期自动运行的爬虫方法二Session会话保持10分钟搞定适合登录逻辑简单没有验证码的网站用requests的Session对象自动保存Cookie不用手动处理importrequests# 创建Session对象会自动保存和携带Cookiesessionrequests.Session()# 配置请求头session.headers.update({User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Referer:https://example.com/login})# 第一步请求登录页获取必要的参数比如csrf_token、captcha_id之类的login_pagesession.get(https://example.com/login)# 从登录页解析csrf_token这里用BeautifulSoup解析frombs4importBeautifulSoup soupBeautifulSoup(login_page.text,html.parser)csrf_tokensoup.find(input,{name:csrf_token})[value]# 第二步提交登录请求login_data{username:你的账号,password:你的密码,csrf_token:csrf_token,remember:on}responsesession.post(https://example.com/login,datalogin_data)# 检查登录是否成功if欢迎回来inresponse.textorresponse.status_code200:print(登录成功)else:print(登录失败)# 现在session里已经有登录后的Cookie了直接请求需要登录的页面就行responsesession.get(https://example.com/需要登录才能访问的页面)print(response.text)优点自动管理Cookie不用手动处理适合简单登录场景缺点遇到验证码、滑块验证、加密密码的场景就搞不定了方法三Cookie持久化一次登录长期使用如果不想每次运行爬虫都登录一次可以把登录后的Cookie保存到本地文件下次直接加载用importrequestsimportjsonfrompathlibimportPath# Cookie保存路径COOKIE_FILElogin_cookie.jsondefsave_cookies(session,path):保存Session的Cookie到文件withopen(path,w,encodingutf-8)asf:json.dump(session.cookies.get_dict(),f)print(Cookie已保存到文件)defload_cookies(session,path):从文件加载Cookie到SessionifnotPath(path).exists():returnFalsetry:withopen(path,r,encodingutf-8)asf:cookiesjson.load(f)session.cookies.update(cookies)# 测试Cookie是否有效test_responsesession.get(https://example.com/user/info,timeout10)if用户名intest_response.text:print(Cookie加载成功仍然有效)returnTrueelse:print(Cookie已过期)returnFalseexcept:returnFalse# 使用示例sessionrequests.Session()session.headers.update({User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36})# 先尝试加载本地Cookieifnotload_cookies(session,COOKIE_FILE):# Cookie无效重新登录print(需要重新登录)# 这里放前面的登录逻辑...# 登录成功后保存Cookiesave_cookies(session,COOKIE_FILE)# 现在可以正常请求了responsesession.get(https://example.com/需要登录才能访问的页面)优点一次登录长期有效不用每次都输入账号密码缺点Cookie过期还是需要重新登录不过一般有效期都有几周方法四终极方案Playwright模拟登录万能方案不管是滑块验证、图片验证码、扫码登录、JS加密密码只要人能手动登录的网站用Playwright都能模拟而且还能自动保存Cookie# 安装依赖pipinstallplaywright playwrightinstallchromium登录Cookie持久化代码importasyncioimportjsonfrompathlibimportPathfromplaywright.async_apiimportasync_playwright COOKIE_FILEplaywright_cookie.jsonasyncdefsave_cookies(context,path):保存浏览器上下文的Cookiecookiesawaitcontext.cookies()withopen(path,w,encodingutf-8)asf:json.dump(cookies,f)print(Cookie已保存)asyncdefload_cookies(context,path):加载Cookie到浏览器上下文ifnotPath(path).exists():returnFalsetry:withopen(path,r,encodingutf-8)asf:cookiesjson.load(f)awaitcontext.add_cookies(cookies)# 测试是否登录有效pageawaitcontext.new_page()awaitpage.goto(https://example.com/user/info,timeout30000)ifawaitpage.locator(text用户名).count()0:print(Cookie有效自动登录成功)awaitpage.close()returnTrueawaitpage.close()returnFalseexceptExceptionase:print(f加载Cookie失败:{e})returnFalseasyncdefmain():asyncwithasync_playwright()asp:# 启动浏览器browserawaitp.chromium.launch(headlessFalse)contextawaitbrowser.new_context()# 尝试加载Cookieifnotawaitload_cookies(context,COOKIE_FILE):print(需要手动扫码/输入验证码登录)pageawaitcontext.new_page()awaitpage.goto(https://example.com/login)# 等待用户手动登录最多等5分钟awaitpage.wait_for_url(https://example.com/dashboard,timeout300000)# 登录成功后保存Cookieawaitsave_cookies(context,COOKIE_FILE)awaitpage.close()# 现在已经登录了可以开始爬数据了pageawaitcontext.new_page()awaitpage.goto(https://example.com/需要登录才能访问的页面)contentawaitpage.content()print(content)awaitbrowser.close()if__name____main__:asyncio.run(main())优点万能方案任何登录场景都能搞定不管是验证码、扫码、滑块都能手动登录一次之后自动用Cookie缺点需要启动浏览器速度比纯requests慢一点适合难搞的网站避坑指南新手必看Cookie域的问题保存Cookie的时候要注意域名比如你登录的是example.comCookie只能在example.com下用不能用于sub.example.comCookie过期时间有些网站的Cookie有效期很短只有几个小时这时候建议用Playwright方案自动刷新Cookie不要泄露CookieCookie里包含你的登录信息不要把Cookie文件发给别人不然别人就能直接登录你的账号不要频繁登录短时间多次登录会触发网站的安全机制会要求你验证或者封账号密码加密问题有些网站的登录密码会用JS加密之后再提交这时候要么抠JS加密代码要么直接用Playwright模拟输入不用管加密逻辑进阶玩法结合验证码识别API对于简单的图片验证码可以接入打码平台自动识别完全不用手动操作Cookie池多账号登录每个账号保存一个Cookie轮流使用避免单个账号被封自动续期定期访问用户中心页面刷新Cookie有效期不用重新登录分布式爬虫Cookie共享把Cookie存在Redis里多个爬虫节点共享使用写在最后登录限制是爬虫最常见的限制之一但是只要搞懂了Cookie的原理大部分网站的登录限制都能搞定。新手推荐从手动复制Cookie开始简单易上手复杂的网站直接用Playwright方案万能好用。我自己现在爬需要登录的网站都是用PlaywrightCookie持久化的方案手动登录一次之后几个月都不用管爬虫自动就能跑非常省心。

相关新闻