Python 爬虫模拟登陆知乎


Posted in Python onSeptember 23, 2016

在之前写过一篇使用python爬虫爬取电影天堂资源的文章,重点是如何解析页面和提高爬虫的效率。由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了一下python模拟登陆,网上关于这部分的资料很多,很多demo都是登陆知乎的,原因是知乎的登陆比较简单,只需要post几个参数,保存cookie。而且还没有进行加密,很适合用来做教学。我也是是新手,一点点的摸索终于成功登陆上了知乎。就通过这篇文章分享一下学习这部分的心得,希望对那些和我一样的初学者有所帮助。

先来说一下,爬虫模拟登陆的基本原理吧,我也是刚开始接触对于一些深层次的东西也不是掌握的很清楚。首先比较重要的一个概念就是cookie,我们都知道HTTP是一种无状态的协议,也就是说当一个浏览器客户端向服务器提交一个request,服务器回应一个response后,他们之间的联系就中断了。这样就导致了这个客户端在向服务器发送请求时,服务器无法判别这两个客户端是不是一个了。这样肯定是不行的。这时cookie的作用就体现出来了。当客户端向服务器发送一个请求后,服务器会给它分配一个标识(cookie),并保存到客户端本地,当下次该客户端再次发送请求时连带着cookie一并发送给服务器,服务器一看到cookie,啊原来是你呀,这是你的东西,拿走吧。所以一个爬虫模拟登陆就是要要做到模拟一个浏览器客户端的行为,首先将你的基本登录信息发送给指定的url,服务器验证成功后会返回一个cookie,我们就利用这个cookie进行后续的爬取工作就行了。

   我这里抓包用的就是chrome的开发者工具,不过你也可以使用Fiddler、Firebug等都可以,只不过作为一名前端er对chrome有一种特殊的喜爱之情。准备好工具接下来就要打开知乎的登陆页面并查看https://www.zhihu.com/#signin 我们可以很容易发现这个请求 发送的就是登录信息,当然我使用手机登陆的 用邮件登陆的是最后结尾是email

Python 爬虫模拟登陆知乎

所以我们只需要向这个地址post数据就行了

Python 爬虫模拟登陆知乎

phone_num 登录名
password 密码
captcha_type 验证码类型(这个参数着这里并没有实质作用)
rember_me 记住密码

_xsrf 一个隐藏的表单元素 知乎用来防御CSRF的(关于CSRF请打开这里) 我发现这个值是固定所以就在这里直接写死了 若果有兴趣的同学可以写一个正则表达式 把这部分的值提取出来 这样更严谨一些。

# -*- coding:utf-8 -*-
import urllib2
import urllib
import cookielib
posturl = 'https://www.zhihu.com/login/phone_num'
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/52.0.2743.116 Safari/537.36',
'Referer':'https://www.zhihu.com/'
}
value = {
'password':'*****************',
'remember_me':True,
'phone_num':'*******************',
'_xsrf':'**********************'
}
data=urllib.urlencode(value)
#初始化一个CookieJar来处理Cookie
cookieJar=cookielib.CookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cookieJar)
#实例化一个全局opener
opener=urllib2.build_opener(cookie_support)
request = urllib2.Request(posturl, data, headers)
result=opener.open(request)
print result.read()

当你看到服务器返回这个信息的时候就说明你登陆成功了

{"r":0,
"msg": "\u767b\u5f55\u6210\u529f"
}#翻译过来就是 “登陆成功” 四个大字

然后你就可以用这个身份去抓取知乎上的页面了

page=opener.open("https://www.zhihu.com/people/yu-yi-56-70")
content = page.read().decode('utf-8')
print(content)

这段代码就是通过实例化一个opener对象保存成功登陆后的cookie信息,然后再通过这个opener带着这个cookie去访问服务器上关于这个身份的完整页面。更复杂的比如微博的登陆这种对请求的数据进行加密了的后面有时间再写出来,与大家分享

Python 相关文章推荐
python更新列表的方法
Jul 28 Python
python利用拉链法实现字典方法示例
Mar 25 Python
tornado 多进程模式解析
Jan 15 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
Python二叉树的镜像转换实现方法示例
Mar 06 Python
python下的opencv画矩形和文字注释的实现方法
Jul 09 Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 Python
一文了解python 3 字符串格式化 F-string 用法
Mar 04 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 Python
python+opencv实现视频抽帧示例代码
Jun 11 Python
python 自动化将markdown文件转成html文件的方法
Sep 23 #Python
Python增量循环删除MySQL表数据的方法
Sep 23 #Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 #Python
Python 制作糗事百科爬虫实例
Sep 22 #Python
Python 使用SMTP发送邮件的代码小结
Sep 21 #Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 #Python
Python中将字典转换为列表的方法
Sep 21 #Python
You might like
黑夜路人出的几道php笔试题
2009/08/04 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)
2007/05/08 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
2017/03/21 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
vue解决跨域路由冲突问题思路解析
2017/11/03 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
angular2 组件之间通过service互相传递的实例
2018/09/30 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
node-red File读取好保存实例讲解
2019/09/11 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
Python中的xlrd模块使用原理解析
2020/05/21 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
python如何爬取动态网站
2020/09/09 Python
Django-silk性能测试工具安装及使用解析
2020/11/28 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
YSL Beauty加拿大官方商城:圣罗兰美妆加拿大
2017/05/15 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
Miller Harris官网:英国小众香水品牌
2020/09/24 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
厨房管理计划书
2014/04/27 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
python实现socket简单通信的示例代码
2021/04/13 Python
vue3获取当前路由地址
2022/02/18 Vue.js