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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
python操作列表的函数使用代码详解
Dec 28 Python
Python命令行解析模块详解
Feb 01 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
Python读取二进制文件代码方法解析
Jun 22 Python
selenium+headless chrome爬虫的实现示例
Jan 08 Python
python爬虫selenium模块详解
Mar 30 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获取网页中图片、DIV内容的简单方法
2014/06/19 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
PHP命名空间与自动加载类详解
2018/09/04 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
xtree.js 代码
2007/03/13 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
地址栏传递中文参数乱码在js里用escape转码
2013/08/28 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
关于Function中的bind()示例详解
2016/12/02 Javascript
vue中路由参数传递可能会遇到的坑
2017/12/07 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
生成无限制的微信小程序码的示例代码
2019/09/20 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
2019/10/28 jQuery
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
python实现高斯投影正反算方式
2020/01/17 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
python 爬取小说并下载的示例
2020/12/07 Python
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
机械设计专业应届生求职信
2013/11/21 职场文书
挂牌仪式主持词
2014/03/20 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
升学宴家长致辞
2015/07/27 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android