python课设总结_Python技术分享课总结:用Python模拟知乎自动登录

原标题: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/email

2. 登录需要提供的表单数据有4个:用户名(email)、密码(password)、验证码(captcha)、_xsrf。

3. 获取验证码的URL地址是 https://www.zhihu.com/captcha.gif?r=1490690391695&type=login

那么 _xsrf 参数是什么?如果你对CSRF(跨站请求伪造)攻击非常熟悉的话,那么你一定知道它的作用,xsrf是一串伪随机数,它是用于防止跨站请求伪造的。它一般存在网页的 form 表单标签中,为了证实这一点,可以在页面上搜索 “xsrf”,果然,从下图可以看到 _xsrf在一个隐藏的 input 标签中 。

到这里,基本上摸清了浏览器登录时所需要的数据是如何获取的了,那么现在就可以开始撸代码用 Python 模拟浏览器来登录。登录时所依赖的两个第三方库是 requests 和 BeautifulSoup,先安装。

pip install beautifulsoup4==4.5.3

pip install requests==2.13.0

获取 xsrf

前面已经找到了 xsrf 所在的标签,,

利用 BeatifulSoup的find方法可以非常便捷的获取该值,当然,如果你熟悉正则表达式,也可以不用 BeatifulSoup

defget_xsrf():response = session.get("https://www.zhihu.com", headers=headers)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 + "&type=login"r = session.get(captcha_url, headers=headers)withopen('captcha.jpg', 'wb') asf:f.write(r.content)captcha = input("验证码:")returncaptcha

登录

一切参数准备就绪之后,就可以请求登录接口了。

deflogin(email, password):login_url = 'https://www.zhihu.com/login/email'data = {'email': email,'password': password,'_xsrf': get_xsrf(),"captcha": get_captcha(),'remember_me': 'true'}response = session.post(login_url, data=data, headers=headers)login_code = response.json()print(login_code['msg'])session.cookies.save()

最后运行返回的结果是“登录成功”。表明登录成功了。细心的你可能已经发现了,我调用了一个 cookies.save() 方法,我是把cookie信息保存到了本地,下次请求其他需要登录的页面时,就可以把 cookie信息携带上了。

session = requests.session()session.cookies = cookiejar.LWPCookieJar(filename='cookies')try:session.cookies.load(ignore_discard=True)except:print("还没有cookie信息")

源码:https://github.com/lzjun567/crawler_html2pdf/blob/master/zhihu/auto_login.py

CSDN Python学习班组织的【攒课】活动正在火热进行中,欢迎Python爱好者报名参与:Python数据分析实战,扫描报名!返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/349286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC中@RequestParam和@PathVariable批注之间的区别?

Spring MVC框架是在Java世界中开发Web应用程序最流行的框架之一,它还提供了一些有用的注释,可以从传入的请求中提取数据并将请求映射到控制器,例如 RequestMapping, RequestParam和PathVariable。 即使将RequestParam和ParthVari…

php 随机钱数,PHP 仿微信红包金额随机

博主寒冰最近闲来无事。就想研究一下微信红包的金额随机算法。早在微信红包刚出来的时候就研究过。始终不得要领。后来,通过查阅诸多资料。听说要实现“正态分布”。这个理论的东西不想深挖。恰好在网上一篇博客找到一个相对完整的算法。我经过试用确实不错。经过我…

excel 两列模糊匹配给出结果_北大硕士给大脑植入Excel病毒,工作效率提升了好几倍...

在工作中,我们经常会碰到这样的同事,他们是这样完成工作的:先用计算器算好结果,甚者动用手指头在电脑屏幕上数数,然后把数据填写到Excel表格中。结果可以预见,原本可以在上班时间完成的工作,愣是…

5 在java等于多少,java基础面试题之Java中的Math. round(-1. 5)等于多少

Java 中的 Math. round(-1. 5) 等于多少?答案:-1/*** Returns the closest {code long} to the argument, with ties* rounding to positive infinity.** Special cases:* If the argument is NaN, the result is 0.* If the argument is negative infin…

java ee cdi_Java EE CDI Producer方法教程

java ee cdi这是CDI Producer方法的教程。 在CDI中,生产者方法生成一个对象,然后可以将其注入。 当我们要注入本身不是bean的对象,要注入的对象的具体类型在运行时可能有所不同,或者当对象需要一些bean构造函数不执行的自定义初始…

qnap nas web php,如何在QNAP NAS上建立并使用 iSCSI Target

本帖最后由 小Q 于 2015-2-5 13:30 编辑在QNAP Turbo NAS上建立并使用iSCSI Target,快速、便利且便宜建置网络储存系统之方式内容:l 在Windows中使用Microsoft iSCSI启动器来连接iSCSI装置什么是iSCSI且它有什么好处?iSCSI(Internet Small Computer Sy…

python坐标轴刻度设置对数_Python中的对数刻度

我试图以对数比例(Y轴)绘制一个图形,但我需要在Y轴上显示原始值。我用了密码:# -*- coding: utf-8 -*-import mathimport matplotlib.pyplot as pltimport matplotlib.dates as datesfrom datetime import datetime, timedeltaimport numpy as npx []y …

openssl php api,PHP7使用openssl解密易班API中的用户数据

PHP7使用openssl解密易班API中的用户数据一、mcrypt扩展解密自从PHP版本更新到了7.1以上以后,mcrypt扩展被废弃,使用mcrypt扩展会出现如下图的报错。只能使用openssl来代替。然而易班轻应用提供的还是旧版本的mcrypt扩展,这将导致php版本升级…

Spring MVC的DispatcherServlet – Java开发人员应该知道的10件事

如果您使用过Spring MVC,那么您应该知道什么是DispatcherServlet? 它实际上是Spring MVC的心脏,确切地说是MVC设计模式或控制器的C语言。 应该由Spring MVC处理的每个Web请求都通过DispatcherServlet处理。 通常,它是Front Contro…

python123第七章_Python入门第7/10页

Python入门第7/10页更新时间:2007年02月08日 00:00:00 作者:第七章 输入输出有几种办法可以从程序输出;数据可以用可读的形式显示,或保存到文件中以备日后使用。本章讨论一些输入输出的办法。7.1 输出格式控制到现在为止我们已经…

运行时错误7内存溢出_分别从运行时和GC的角度看JAVA8内存管理

运行时区域1.程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里(概念模型,各种虚拟机可能会通过一些更高效的方式实现&#…

php baocuo error,PHP编译报错configure: error: Cannot find libmysqlclient under /usr.

今天编译PHP的时候遇到了几个错误,记录一下第一次编译的时候报错如下:configure: error: mcrypt.h not found. Please reinstall libmcrypt.报这个错是因为没有安装libmcrypt这个包,下载地址如下:wget ftp://mcrypt.hellug.gr/pub…

dart和python哪个好_RedMonk 2020 年 Q1 编程语言排行:Python 冲进前二,Dart 值得关注...

知名软件行业分析公司 RedMonk 发布了 2020 年第一季度编程语言排行榜。RedMonk 编程语言排行榜通过追踪编程语言在 GitHub 和 Stack Overflow 上的代码使用情况与讨论数量,统计分析后进行排序,其旨在深入了解潜在的语言采用趋势。该榜单一年发布两次&am…

jclouds_使用jclouds在S3上分段上传

jclouds1.目标 在上一篇文章中 ,我们研究了如何使用jclouds中的通用Blob API将内容上传到S3。 在本文中,我们将使用jclouds的S3特定的异步API上传内容并利用S3提供的分段上传功能。 2.准备 2.1。 设置自定义API 上传过程的第一部分是创建jclouds API-这…

mysql+表中公共信息,計算mysql中兩個表之間的公共行數

so heres my question...這是我的問題…Hi have two tables in mysql, called go_H and go_J, both looking like this:在mysql中有兩個表,叫做go_H和go_J,它們都是這樣的:go_Hgo_H---------------------------| gene | GoCode |-----------------------…

极域课堂管理系统软件如何取消控制_微缔电子组装业MES系统软件六大功能组成...

电子组装业MES系统软件六大功能组成MES系统软件是制造执行系统的英文简称,MES系统软件在整个企业信息集成系统中承上启下,是生产活动与管理活动信息沟通的桥梁,MES系统软件在产品从工单下发到生产成成品的整个过程中,扮演着促进生…

使用虚拟时间测试基于时间的反应堆堆芯流

Reactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将介绍Reactor Cor…

matlab二维数组排序函数,Matlab 用sort函数排序 二维数组

在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可, 如果排序后还需要保留原来的索引可以用返回值,即[B,ind]sort(A),计算后&am…

多个cuda 被单进程沾满_报名 | 提高GPU利用率,听英伟达专家分享这个CUDA工具

随着 NVIDIA GPU 计算性能的不断提升,如何提升 GPU 利用率是开发者普遍关心的问题之一。从 Kepler 架构开始,NVIDIA GPU 支持多个 CUDA kernels 函数的并发执行,称为 Hyper-Q 技术。Hyper-Q 技术支持多个 CUDA streams、多个 CPU threads 或者…

usb转ttl模块与matlab,USB接口转TTL小板的自检测试

现在电脑基本上都不会配置DB9串行数据端口了,这给一些喜欢折腾刷机和单片机加载程序的朋友带来了诸多的不便。还好,随着技术的发展,USB接口转TTL的产品越来越成熟,而这种产品主要以采用PL-2303HX芯片作为主控器的居多,…