爬虫小记:利用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”。

Cookies

图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()

注意本文创作时间,如果阅读时已经过了很久,代码可能不起效。
如有不足,还请指正~

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

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

相关文章

IOS的 testflight测试设置

管理员邀请参与者 1、登录开发者账号https://developer.apple.com/account 2、进入后&#xff0c;点击ituns connect 3、点击进入用户和职能 4、在用户栏点击添加按钮 5、输入姓名、邮件 6、勾选职能为“开发人员”&#xff0c;选择所要测试或参与研发的APP 7、不用修改&#x…

Nodejs 中的包、npm 、第三方模块、 package.json 以及 cnpm

一、包与 NPM 包Nodejs 中除了它自己提供的核心模块外&#xff0c;我们可以自定义模块&#xff0c;也可以使用第三方的 模块。Nodejs 中第三方模块由包组成&#xff0c;可以通过包来对一组具有相互依赖关系的模块进行 统一管理。 完全符合 CommonJs 规范的包目录一般包含如下…

神经网络中BP(back propagation)到底在干些什么

前言 想要理解神经网络的工作原理&#xff0c;反向传播(BP)是必须搞懂的东西。BP其实并不难理解&#xff0c;说白了就是用链式法则(chain rule)算算算。本文试图以某个神经网络为例&#xff0c;尽可能直观&#xff0c;详细&#xff0c;明了地说明反向传播的整个过程。 正向传…

TOP 子句

TOP 子句TOP 子句用于规定要返回的记录的数目。对于拥有数千条记录的大型表来说&#xff0c;TOP 子句是非常有用的。注释&#xff1a;并非所有的数据库系统都支持 TOP 子句。SQL Server 的语法&#xff1a;SELECT TOP number|percent column_name(s)FROM table_nameMySQL 和 Or…

Nodejs 新特性 async await 的使用 以及使用 async await 处理异步

1. let 和 var 2. const定义常量 3. 模板字符串 4. 属性简写 5. 方法简写 6. 箭头函数 7. 回调函数 7. Promise 8. async 和 await

leetcode 高薪_LeetCode 第 125 号问题:验证回文串

本文首发于公众号「五分钟学算法」&#xff0c;是图解 LeetCode 系列文章之一。个人网站&#xff1a;https://www.cxyxiaowu.com题目来源于 LeetCode 第 125 号问题&#xff1a;验证回文串。这道题目是 初级程序员 在面试的时候经常遇到的一道算法题&#xff0c;而且面试官喜欢…

从拉格朗日乘子法到SVM

前言 本文主要是讲了如何构建SVM的模型&#xff0c;并利用KKT条件构造其对偶型&#xff0c;从而求解问题&#xff0c;并讲述了SVM的硬间隔&#xff0c;软间隔和核函数三个境界。主要参考了周志华的《机器学习》&#xff0c;并在其中补充了自己的想法。由于内容较多&#xff0c…

nodejs 创建一个静态资源服务器 +路由

0、补充 1、Node.js 创建的第一个应用 1、引入 http 模块 var http require("http"); 2、创建服务器 接下来我们使用 http.createServer() 方法创建服务器&#xff0c;并使用 listen 方法绑定 3000 端口。 函数通过 request, response 参数来接收和响应数据。 co…

python输出字体的大小_Python密码学编程:文件的加密与解密

在之前的章节中&#xff0c;编写的程序只能操作较少的信息&#xff0c;这些信息往往是以字符串的形式直接写在代码中的。但本章中的程序可以对整个文件进行加密和解密&#xff0c;文件的大小可以包括成千上万个字符。本章要点open()方法。读、写文件。write()、close()及read()…

个人工作总结7

时间关系&#xff0c;只能等到编完了程序再做工作总结了&#xff0c;今天是第七天: 一、昨天干了什么&#xff1f; 服务器配置了一大圈&#xff0c;尝试了N1种办法&#xff0c;到最后也没有成功&#xff0c;但好像只差一点点&#xff0c;打算明天上移动应用开发咨询一下老师。 …

电脑k歌软件_金麦客专业k歌app下载|金麦客专业k歌软件 手机安卓版v1.1.5.0 下载...

金麦客专业k歌app能够让用户通过手机直接连接电视&#xff0c;从而在安卓端实现金麦客点歌的目的&#xff0c;平台包含上万高清mv资源&#xff0c;让用户在歌唱时能够更好的代入氛围中&#xff0c;并且还能通过网络直接搜歌&#xff0c;从而在线下载播放&#xff0c;用户在演唱…

python的普通方法、类方法和静态方法

前言 本文主要讲述了python类中的三类常用方法&#xff0c;普通方法、类方法和静态方法。 普通方法会将实例传入方法当中&#xff08;通常用self表示&#xff09;&#xff0c;类方法会将类传入方法当中&#xff08;通常用cls表示&#xff09;&#xff0c;静态方法中传入与类无…

局部内部类和匿名内部类的对比

创建内部类的典型的方式是在一个方法体的里面创建&#xff0c;局部内部类不能有访问说明符&#xff0c;因为它不是外围类的一部分&#xff0c;但是它可以访问当前代码块内的常量,以及此外围类的所有成员。下面的例子对局部内部类与匿名内部类的创建进行了比较。 具体代码实现&a…

Nodejs ejs模板引擎

官方网站&#xff1a;https://www.npmjs.com/package/ejs 我们学的 EJS 是后台模板&#xff0c;可以把我们数据库和文件读取的数据显示到 Html 页面上面。它 是一个第三方模块&#xff0c;需要通过 npm 安装 npm install ejs –save 或者 cnpm install ejs --saveNodejs 中使用…

py2中存储的pickle和py3中pickle无法读取的兼容性问题解决方案

问题描述 在py2.7当中&#xff0c;用以下语句将变量存储到pickle当中 with open(../dataset/m_7800/rf_preds.pickle, wb) as f:pickle.dump(rf_preds, f) 这个时候&#xff0c;用py3.6中的pickle取获取存储好的变量 with open(../dataset/m_7800/rf_preds.pickle, rb) as …

linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

嵌入式设备在电路中交换信息的时候必须通过共享一个通用的协议。现在嵌入式系统中已经定义了数百种通信协议来实现数据交换&#xff0c;一般来说可以将其分为两类&#xff1a;并行或串行。并行传输数据是指同时传输多个数据位&#xff0c;它们通常需要数据线和时钟线配合工作&a…

div里嵌套了img底部会有白块问题和图片一像素问题解决

div里嵌套了img底部会有白块 因为img默认是按基线(baseline)对齐的。对比一下图片和右边的p, q, y等字母&#xff0c;你会发现这三个字母的“小尾巴”和图片下方的空白一样高。下面这张图中的黑线就是那条基线。 解决方案&#xff1a;一&#xff1a;vertical-align: bottom&…

Nodejs 中的Get、Post

Get、Post 超文本传输协议&#xff08;HTTP&#xff09;的设计目的是保证客户端机器与服务器之间的通信。 在客户端和服务器之间进行请求-响应时&#xff0c;两种最常被用到的方法是&#xff1a;GET 和 POST。 GET - 从指定的资源请求数据。&#xff08;一般用于获取数据&#…

利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

问题简述 给定一个 nn的矩阵&#xff0c;矩阵中每行和每列的元素都按升序排列。给定一个 k(k∈[1,n2])&#xff0c; 求再整个矩阵中按从小到大排序为 k的元素。 例如:matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15] ], k = 8,return 13.解题思路该矩阵的行和列都是按从小…

电脑故障扫描修复软件_电脑故障分析:电脑安装软件提示没有权限的解决方法...

我们安装软件时如果没有权限就会导致安装故障&#xff0c;最近就有用户安装软件的时候出现了无法将数值写入键software的错误提示&#xff0c;请验证您对该键拥有足够的访问权限&#xff0c;或者与您的技术支持人员联系。那么遇到这种问题该怎么办呢&#xff1f;接下来就让我们…