前言
在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码。当然,我们可以设计一套机器学习的算法去破解验证码,然而,验证码的形式多种多样,稍微变一下(有些甚至是手机短信验证),整套算法可能就完全无效了,所以去强行破解验证码是一个吃力不讨好的活。本文会以知乎网站为例,利用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 Requests

session = 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 json

def 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 json

def 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 requests

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 def 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 = headers
requests.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()

  

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

利用cookies跳过登陆验证码的更多相关文章

  1. 利用cookies+requests包登陆微博,使用xpath抓取目标用户的用户信息、微博以及对应评论

    本文目的:介绍如何抓取微博内容,利用requests包+cookies实现登陆微博,lxml包的xpath语法解析网页,抓取目标内容. 所需python包:requests.lxml 皆使用pip安装 ...

  2. 通过cookies跳过验证码登陆页面,直接访问网站的其它URL

    我每次手动访问去NN网的一家酒店,就不需要登陆,一旦我用脚本打开就会让我登陆,而登陆页面又有验证码,不想识别验证码,所以就想:“通过cookies跳过验证码登陆页面,直接访问网站的其它URL”   转 ...

  3. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

  4. 本博文将一步步带领你实现抽屉官网的各种功能:包括登陆、注册、发送邮箱验证码、登陆验证码、页面登陆验证、发布文章、上传图片、form验证、点赞、评论、文章分页处理以及基于tronado的后端和ajax的前端数据处理。

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tronado的后端和ajax的 ...

  5. 如何机智判断页面是刷新还是关闭,背景:vue项目,需求:关闭页面,下次直接跳到登陆页

    最近项目有这么个需求:要在关闭当前系统的窗口的时候,退出登录, 因为如果不退出登录可能存在安全风险,其实我想说,电脑没事别借给别人活着离开工位记得一定要锁屏,其实我们设置了cookie失效时间的,过了 ...

  6. Python3.6下的Requests登录及利用Cookies登录

    利用Python中的Requests模块可以实现Post,Get等发送功能,我以登录某网站为例,记录使用Post发送用户名.密码及图形验证码,以及通过Cookies直接登录的内容. 1.利用POST发 ...

  7. selenium获取cookies并持久化登陆

    selenium获取cookies并持久化登陆 需求背景: ​ 这几天需要写一个接口,用来批量上传数据,最开始考虑的是 UI 自动化,然后选值的时候自动化难以判别,最终选择 接口 自动化. ​ 然后操 ...

  8. 利用 canvas 破解 某拖动验证码

    利用 canvas 破解 某拖动验证码 http://my.oschina.net/u/237940/blog/337194

  9. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

随机推荐

  1. Mac上安装PHP、Apache、MySQL

    Mac自带php5.6版本,要升级到php7.3 步骤如下 1,brew 安装php ,如果没有安装,访问https://brew.sh/index_zh-cn安装在终端输入以下内容,不用指定安装ph ...

  2. Hadoop2.6的DataNode启动不了

    2016-05-04 18:14:51,990 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting 2016-05-04 ...

  3. url传输编码

    首先:协议规范,RFC 1738,定义url地址中不能包含除:0-9,a-zA-Z,- 之外的字符,即,如URL中包含特殊字符,如$-_.+!*’(), 都要编码. 关于为什么如此定义,有如下几个原因 ...

  4. python使用cx_Oracle在Linux和Windows下的一点差异

    1. 主要是线程方面的差异. Windows下,把cx_Oracle.connect(connectedId)得到的handle传给定时器线程,主线程和和定时器可以用同一个handle. 但Linux ...

  5. Windows服务器时间不同步问题

    一台域内的服务器时间不停地被修改,我先向用户收集了一些信息 只有这一台出现此问题,其他服务器均为正常(补充一下,问题快解决完的时候用户告诉我一个重要的消息,就是时间被修改了一段时间后自动会被修改回去) ...

  6. npm 安装React Devtools调试工具

    有时候没有***工具时,怎么安装React DevTool, 其一直接搜索到Chrome的插件安装即可. 其二, 可以通过下载github上的react-devtools, 然后打包,最后导入chro ...

  7. sql 将某一列转成字符串并且去掉最后一个逗号

    ) SET @center_JZHW = ( SELECT DISTINCT STUFF( ( SELECT ','''+ qudao+'''' FROM CreatedType WITH ( NOL ...

  8. armv8 memory system

    在armv8中,由于processor的预取,流水线, 以及多线程并行的执行方式,而且armv8-a中,使用的是一种weakly-ordered memory model, 不保证program or ...

  9. 谈谈html中一些比较"偏门"的知识(map&area;iframe;label)

    说明:这里所说的"偏门"只是相对于本人而言,记录在此,加深印象.也希望有需要的朋友能获得些许收获! 1.空元素(void):没有内容的元素. 常见的有:<br>,< ...

  10. 解决caffe绘制训练过程的loss和accuracy曲线时候报错:paste: aux4.txt: 没有那个文件或目录 rm: 无法删除"aux4.txt": 没有那个文件或目录

    我用的是faster-rcnn,在绘制训练过程的loss和accuracy曲线时候,抛出如下错误,在网上查找无数大牛博客后无果,自己稍微看了下代码,发现,extract_seconds.py文件的 g ...