刚开始做网站哪有免费空间,域名服务器的主要功能是,公众号登录平台入口官网,网站外链建设教程原标题#xff1a;Python技术分享课总结#xff1a;用Python模拟知乎自动登录Python语言是由Guido van Rossum大牛在1989年发明#xff0c;它是当今世界最受欢迎的计算机编程语言之一#xff0c;也是一门“学了有用、学了能用、学会能久用”的计算生态语言。为此#xff0…原标题Python技术分享课总结用Python模拟知乎自动登录Python语言是由Guido van Rossum大牛在1989年发明它是当今世界最受欢迎的计算机编程语言之一也是一门“学了有用、学了能用、学会能久用”的计算生态语言。为此CSDN作为国内最大的IT中文社区特向广大Python爱好者开设了Python学习班帮助大家在学习的道路上少走弯路事半功倍。3月29号晚上8点我们特邀请知名Python技术专家刘志军老师在班级里举行分享活动。刘志军6年开发经验曾就职中兴、博雅互动。擅长Web技术架构对爬虫、数据挖掘领域兴趣浓厚。目前在一家大型医药集团从事数据分析工作。微信公众号Python之禅(vttalk)。以下为昨晚的分享内容前言文章会按照先原理再实践的方式来讲解希望可以做到知其然且知其所以然读这篇文章前你需要对 HTTP 协议、 Cookies、跨站请求伪造(CSRF)有一定了解如果你不太了解这些概念文末给出了两个链接推荐阅读。在做爬虫时有些页面在登录之前是被禁止抓取的比如我们查看知乎的话题页面 https://www.zhihu.com/topic 就要求我 们登录。当提到「登录」时就不得不提 Cookie 技术而说起 Cookie 技术时还得从 HTTP 协议说起。当然在这里我不会把HTTP 从0到1讲一遍你只需要了解基本的 HTTP 流程是什么就可以了推荐阅读我之前在公众号「Python之禅」中写的另一篇文章一次完整的HTTP请求过程HTTP 是一种无状态的协议, 协议本身不保留之前的一切请求信息和响应信息也就是说对于一个刚刚发送了HTTP 请求的客户端再次发起请求时服务端并不知道之前访问过。这样设计的理由是为了更快地处理大量事务确保协议的可伸缩性而特意把 HTTP 协议设计如此简单。但是无状态导致业务处理就变得棘手了一个简单的例子就是网上购物的时候当我在一个页面把商品加入购物车的时候正当我要跳转到支付页面时如果没有一种机制来保持我的登录状态那么之前选的商品全部丢失了。因此为了在无状态的 HTTP 协议之上维护会话状态使服务器可以知道当前是和哪个客户端打交道于是Cookie 技术应运而生 Cookie 通俗的理解就是服务端分配给客户端的一个标识。Cookie原理其实也非常简单总共4个步骤维护HTTP会话。1. 浏览器第一次发起 HTTP 请求时没有携带任何 Cookie 信息服务器收到请求并返回给浏览器的HTTP响应同时HTTP 响应包括了一个响应头 Set-Cookie 字段它的值是要设置的 Cookie。2. 浏览器收到来自服务器的 HTTP 响应响应头中发现有 Set-Cookie 字段就会将该字段的值保存在内存或者硬盘中。3. 浏览器下次给该服务器发送 HTTP 请求时 会将 Cookie 信息附加在 HTTP 请求的头字段 Cookie 中。4. 服务器收到这个HTTP请求发现请求头中有Cookie字段 便知道之前就和这个用户打过交道了。理解了 Cookie 的基本原理之后我们就可以尝试用 Python 来实现模拟知乎登录。用过知乎的都知道只要提供用户名和密码以及验证码之后即可登录。当然这只是我们眼中看到的而背后隐藏的技术细节还需要借助浏览器来发觉。现在我们就用 Chrome 来查看当我们填完表单后点击登录的时候究竟发生了什么首先进入知乎的登录页面 https://www.zhihu.com/#signin 打开 Chrome 的开发者工具条(按 F12)先尝试输入一个错误的验证码观察浏览器是如何发送请求的。从浏览器的请求可以发现几个关键的信息1. 登录的 URL 地址是 https://www.zhihu.com/login/email2. 登录需要提供的表单数据有4个用户名(email)、密码(password)、验证码(captcha)、_xsrf。3. 获取验证码的URL地址是 https://www.zhihu.com/captcha.gif?r1490690391695typelogin那么 _xsrf 参数是什么如果你对CSRF(跨站请求伪造)攻击非常熟悉的话那么你一定知道它的作用xsrf是一串伪随机数它是用于防止跨站请求伪造的。它一般存在网页的 form 表单标签中为了证实这一点可以在页面上搜索 “xsrf”果然从下图可以看到 _xsrf在一个隐藏的 input 标签中 。到这里基本上摸清了浏览器登录时所需要的数据是如何获取的了那么现在就可以开始撸代码用 Python 模拟浏览器来登录。登录时所依赖的两个第三方库是 requests 和 BeautifulSoup先安装。pip install beautifulsoup44.5.3pip install requests2.13.0获取 xsrf前面已经找到了 xsrf 所在的标签利用 BeatifulSoup的find方法可以非常便捷的获取该值当然如果你熟悉正则表达式也可以不用 BeatifulSoupdefget_xsrf():response session.get(https://www.zhihu.com, headersheaders)soup BeautifulSoup(response.content, html.parser)xsrf soup.find(input, attrs{name: _xsrf}).get(value)returnxsrf获取验证码验证码是通过 /captcha.gif 接口返回的这里我们把验证码图片下载保存到当前目录由人工识别当然你可以用第三方支持库来自动识别比如pytesser。defget_captcha():把验证码图片保存到当前目录手动识别验证码:return:t str(int(time.time() * 1000))captcha_url https://www.zhihu.com/captcha.gif?r t typeloginr session.get(captcha_url, headersheaders)withopen(captcha.jpg, wb) asf:f.write(r.content)captcha input(验证码)returncaptcha登录一切参数准备就绪之后就可以请求登录接口了。deflogin(email, password):login_url https://www.zhihu.com/login/emaildata {email: email,password: password,_xsrf: get_xsrf(),captcha: get_captcha(),remember_me: true}response session.post(login_url, datadata, headersheaders)login_code response.json()print(login_code[msg])session.cookies.save()最后运行返回的结果是“登录成功”。表明登录成功了。细心的你可能已经发现了我调用了一个 cookies.save() 方法我是把cookie信息保存到了本地下次请求其他需要登录的页面时就可以把 cookie信息携带上了。session requests.session()session.cookies cookiejar.LWPCookieJar(filenamecookies)try:session.cookies.load(ignore_discardTrue)except:print(还没有cookie信息)源码https://github.com/lzjun567/crawler_html2pdf/blob/master/zhihu/auto_login.pyCSDN Python学习班组织的【攒课】活动正在火热进行中欢迎Python爱好者报名参与Python数据分析实战扫描报名返回搜狐查看更多责任编辑