利用cookies跳过登陆验证码

前言
在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码。当然,我们可以设计一套机器学习的算法去破解验证码,然而,验证码的形式多种多样,稍微变一下(有些甚至是手机短信验证),整套算法可能就完全无效了,所以去强行破解验证码是一个吃力不讨好的活。本文会以知乎网站为例,利用python中的request模块进行的一个模拟登陆,其中用到了reqeust.session下的cookies来跳过登陆这一环节。

方案详述
下面以模拟登陆知乎为例,利用python3.6进行详细的过程叙述,建议使用pycharm作为IDE。
首先,我们要将headers给设置好

agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
headers = {"HOST": "www.zhihu.com","Referer": "http://www.zhihu.com","User-Agent": agent
}

  接着,用账号成功登陆一次知乎,并按下“F12”(Chrome浏览器),找到Resources下的Cookies,将显示的Cookies全都复制下来,即下图红框中的”Name”和”Value”。 

图1:如何找到Cookies

图中一些个人隐私信息已经擦去,图可能有点看不清,但应该能看明白,凑合一下吧~ 
将复制下来的Cookies写成字典的形式由于隐私问题,下面是不完整的Cookies。

 

cookies = {"cap_id" : "MWQ0Yzk4NGI1Y2M4NG*********","r_cap_id" : "OTUyOTY1YjFjMDQ5NGEx*********","z_c0" : "Mi4xWVduN0FRQUFB**********","q_c1" : "108429c2422245a0********","d_c0" : "ADBCEDC-5guPTr*********","aliyungf_tc" : "AQAAAAaQE*************","_zap" : "92146d2b-**********","_xsrf" : "01124268-4638-***************","__utmz" : "51854390.15038440***********","__utmv" : "51854390.000**************","__utma" : "51854390.4***********"
}

  

然后创建一个session对象,将headers和cookies赋给session

 

import Requestssession = Requests.session()
session.headers = headers
requests.utils.add_dict_to_cookiejar(session.cookies, cookies)

  

 

其中,值得注意的是,session.headers可以是dict,所以直接赋值没问题,而session.cookies必须是<class ‘requests.cookies.RequestsCookieJar’>,所以要利用requests.utils.add_dict_to_cookiejar进行赋值。
好了,现在我们已经完事具备了,可以直接访问知乎了,就是这么简单。

url = "https://www.zhihu.com/"
response = session.get(url)

  

比如这个时候,我们想把访问到的页面给保存下来,我们就可以这么干

  

with open("test.html", "wb") as f:f.write(response.text.encode('utf-8'))

  

 

登陆进去了之后,就是想怎么来,就怎么来了~ 
这里还要补充一点就是,我们如果觉得把cookies写在源代码中不太雅观的话,可以将其保存到本地文件当中

 

import jsondef save_cookies(cookies):cookies_file = 'export.json'with open(cookies_file, 'w') as f:json.dump(cookies, f)

  

保存成Json格式之后,可以在cookies过期之后,直接在文件当中修改cookies,要读取cookies也很方便

def load_cookies():cookie_json = {}try:with open('export.json', 'r') as cookies_file:cookie_json = json.load(cookies_file)except:print ("Json load failed")finally:return cookie_json

  

值得注意的是,这个时候出来的cookies也是dict类型的,别忘了转换成cookiejar。

完整代码

我们可以把上面的代码整理一下,写成下面这样 
文件1:用来存储cookies

 

import jsondef save_cookies(cookies):cookies_file = 'export.json'with open(cookies_file, 'w') as f:json.dump(cookies, f)def main():cookies = {"cap_id" : "MWQ0Yzk4NGI1Y2M4NG*********","r_cap_id" : "OTUyOTY1YjFjMDQ5NGEx*********","z_c0" : "Mi4xWVduN0FRQUFB**********","q_c1" : "108429c2422245a0********","d_c0" : "ADBCEDC-5guPTr*********","aliyungf_tc" : "AQAAAAaQE*************","_zap" : "92146d2b-**********","_xsrf" : "01124268-4638-***************","__utmz" : "51854390.15038440***********","__utmv" : "51854390.000**************","__utma" : "51854390.4***********"}save_cookies(cookies)if __name__ == '__main__':main()

  

 

文件2:用来模拟登陆

import requestsdef load_cookies():cookie_json = {}try:with open('export.json', 'r') as cookies_file:cookie_json = json.load(cookies_file)except:print ("Json load failed")finally:return cookie_jsondef main():agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"headers = {"HOST": "www.zhihu.com","Referer": "http://www.zhihu.com","User-Agent": agent}session = requests.session()session.headers = headersrequests.utils.add_dict_to_cookiejar(session.cookies, load_cookies())url = "https://www.zhihu.com/"response = session.get(url)with open("test.html", "wb") as f:f.write(response.text.encode('utf-8'))print ("Done")if __name__ == '__main__':main()

  

注意本文创作时间,如果阅读时已经过了很久,代码可能不起效。 

 

转载于:https://www.cnblogs.com/pythonClub/p/9866682.html

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

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

相关文章

org.apache.ibatis.reflection.ReflectionException: Error instantiating class with invalid types

大家好&#xff0c;我是烤鸭&#xff0c;记录一个初级异常&#xff0c;百度搜索结果不多&#xff1a; Caused by: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.xxx.xxx with invalid types 。 java.lang.NoSuchMethodException: com.xx…

[css] 你知道css的预处理器和后处理器都有哪些吗?它们有什么区别呢?

[css] 你知道css的预处理器和后处理器都有哪些吗&#xff1f;它们有什么区别呢&#xff1f; 目前最主流的 CSS 预处理器&#xff1a;Sass、LESS、Stylus 。优缺点优点&#xff1a;语言级逻辑处理&#xff0c;动态特性&#xff0c;改善项目结构缺点&#xff1a;采用特殊语法&…

[Swift]八大排序算法(八):基数排序

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/ &#xff09;➤GitHub地址&…

推一波JAVA学习公众号

大家好&#xff0c;我是烤鸭&#xff0c;今天不水了。分享一波java学习公众号。从基础到架构都有&#xff0c;另外说一句&#xff0c;注意身体吧。另外说一句&#xff0c;本文不定时更新。1. JAVA思维导图2. 程序员小灰可爱的小仓鼠3. 码农每日一题4. JAVA后端技…

springmvc限流解决方案

本文采用3中限流方案&#xff1a; 1&#xff0c;谷歌的guava框架 2&#xff0c;使用redis技术 3&#xff0c;使用lua redis 技术 限流方案类型 1&#xff0c;令牌桶限流&#xff08;guava&#xff09; 2&#xff0c;计数器限流&#xff08;redis&#xff09; 各位看官可根…

二叉树的三种遍历(递归与非递归) + 层次遍历

<转载于 >>> > 二叉树是一种非常重要的数据结构&#xff0c;很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式&#xff0c;因为树的本身就是用递归定义的&#xff0c;因此采用递归的方法实现三种遍历&#xff0c;不仅代码简洁…

springboot使用mongodb

大家好&#xff0c;我是烤鸭&#xff1a;这是一篇关于springboot项目中使用mongodb。 环境&#xff1a;jdk 1.8springboot 1.5.6.RELEASEmaven 3.5 1. mongodb在springboot中的配置springboot集成这个三方插件就是简单&#xff0c;只需要引入依赖&#xff0c;在properties或者…

[css] 请使用css画一个圆,方法可以多种

[css] 请使用css画一个圆&#xff0c;方法可以多种 <div class"circle"></div>1.border-radius.cirlce{width:10vw; height:10vw; background:gray;border-radius:50%; }2.clip-path.circle{width:10vw; height:10vw; background:gray;clip-path: circl…

springboot中getOutputStream() has already been called for this response和java.io.FileNotFoundException

这个异常挺多人遇到的&#xff0c;不过我看了一下&#xff0c;跟我们的情况都不一样。 1. 流没关闭。 2. 未设置响应头。 3. jsp页面需要清空流。说一下我们遇到的情况。就是一个简单的sprinboot项目。 用的是springboot 1.5.6&#xff0c;本地启动后用花生壳内网映射…

eclipse搜索框太小

解决方式&#xff1a; Window>Preferences>DevStyle>Inline Search 把 use the inline search 取消勾选

fileinput 加 ftp 加 nginx 加 SpringBoot上传文件

亲测可用 准备linux服务器 https://www.cnblogs.com/shuaifing/p/8268949.html 搭建ftp https://www.cnblogs.com/shuaifing/p/8260532.html Springboot整合fileinput 上传文件https://www.cnblogs.com/shuaifing/p/8274906.html 页面 引入 jquery boostrap fileinput.min.js…

[css] css中最常用的字体有哪些?你是怎么选择字体的?

[css] css中最常用的字体有哪些&#xff1f;你是怎么选择字体的&#xff1f; 总结&#xff1a; win&#xff1a;微软雅黑为Win平台上最值得选择的中文字体&#xff0c;但非浏览器默认&#xff0c;需要设置&#xff1b;西文字体的选择以Arial、Tahoma等无衬线字体为主。 mac&am…

springboot redis shiro 实现 单点登录

大家好&#xff0c;我是烤鸭&#xff1a;今天给大家分享简单的单点登录的实现方式。环境及jar包:springboot 1.5.10 redis 2.9.0 &#xff08;可以用tomcat的session&#xff0c;但是无法解决多个tomcat共享session的问题&#xff09;shiro 1.4.0 lombok …

IntelliJ IDEA 控制台最大化

快捷键一&#xff1a; ctrlshift方向键上下 快捷键二&#xff1a; CtrlShift"

Centos7安装Hadoop教程

一&#xff1a;安装SSH 1&#xff0c;执行下面的命令安装ssh yum install openssh-clients yum install openssh-server 2&#xff0c;执行如下命令测试一下 SSH 是否可用&#xff08;SSH首次登陆提示 yes/no 信息&#xff0c;输入 yes 即可&#xff0c;然后按照提示输入 root…

[css] 请举例说明css有哪些不可继承的属性?

[css] 请举例说明css有哪些不可继承的属性&#xff1f; 1、display&#xff1a;规定元素应该生成的框的类型2、文本属性&#xff1a;vertical-align&#xff1a;垂直文本对齐text-decoration&#xff1a;规定添加到文本的装饰text-shadow&#xff1a;文本阴影效果white-space&…

elasticsearch 6.x (一) 部署 windows入门 spingboot连接

大家好&#xff0c;我是烤鸭&#xff1a;今天分享的是 elasticsearch 6.x 部署 windows服务器。环境&#xff1a;win10elasticsearch-6.2.4springboot 2.0.0.RELEASE1. 官网下载elasticsearch这个是最新版本的es下载地址。https://www.elastic.co/downloads/elasticsearch选择z…

Programming Assignment 5: Burrows–Wheeler Data Compression

Programming Assignment 5: Burrows–Wheeler Data Compression 1. 题目阅读 实现Burrows-Wheeler数据压缩算法。这个革命性的算法产生了gzip和pkzip&#xff0c;并且相对容易实现&#xff0c;还不受任何专利保护。它构成了unix压缩实用程序bzip2的基础。 这个算法由以下三种算…

hadoop Connection refused: no further information原因排查(Centos7)

一&#xff1a;排查防火墙&#xff0c;是否开放9000端口 firewall-cmd --list-ports查看防火墙是否有9000端口&#xff0c;如果没有&#xff0c;通过下面的命令添加端口&#xff1a; firewall-cmd --zonepublic --add-port9000/tcp --permanent systemctl restart firewalld…

[css]你有使用过preload、preconnect、prefetch这些属性吗?说说它们都有什么作用?

[css]你有使用过preload、preconnect、prefetch这些属性吗&#xff1f;说说它们都有什么作用&#xff1f; preload 元素的 rel 属性的属性值preload能够让你在你的HTML页面中元素内部书写一些声明式的资源获取请求&#xff0c;可以指明哪些资源是在页面加载完成后即刻需要的。…