requests_模拟登录知乎
如何登录知乎?
首先要分析,进行知乎验证的时候,知乎服务器需要我们提交什么数据,提交的地址。先进行几次登录尝试,通过浏览器中network中查看数据流得知,模拟登录知乎需要提供5个数据,分别是_xsrf、password、captcha_type、captcha、phone_num,这个是手机号码进行验证登录,提交地址 https://www.zhihu.com/login/phone_num ,那,开始获取这些个数据,其中那个图片验证码是最难得,通过第三方插件zheye进行验证码解析,就可以解决问题
如何做?
1. 请求知乎登录页面,并解析获得_xsrf值
2. 请求验证码url获得验证码图片,交个zheye解析出结果并拼接出知乎想要的captcha值
3. 从知乎验证提交表单中获取captcha_type的值,并获取表单提交地址
4. captcha_type、password 对应用户名和密码
5. 提交数据,获取返回的response,通过判断response数据获取是否登录成功
#!/usr/bin/python3 __author__ = 'beimenchuixue'
__blog__ = 'http://www.cnblogs.com/2bjiujiu/' import requests
import re
import json
from time import sleep
from random import choice, randint
from zhihu_yanzheng.zheye import zheye headers = {
'pragma': 'no-cache',
'Referer': 'https://www.zhihu.com/signin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
# 生成全局的session值
session = requests.session() def random_sleep():
# 随机暂停,模拟人访问
while choice([0, 1]):
sleep(choice([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8])) def get_xsrf():
"""
获取知乎页面_xsrf的值
:param url:
:return:
"""
zhihu_url = 'https://www.zhihu.com/signin'
# 建立映射,增加程序的可阅读性
xsrf_value = 1
while True: random_sleep() resp = session.get(zhihu_url, headers=headers)
# 检查是否返回正确
resp.raise_for_status()
# 设置网页编码
resp.encoding = resp.apparent_encoding
# 获取_xsrfde值
_xsrf = re.match(r'.*name="_xsrf" value="(.*?)"', re.sub(r'[\r\t\n]', '', resp.text)).group(xsrf_value)
# 保证有_xsrf数据
if _xsrf:
break
return _xsrf def get_img_data():
"""
获取图片并且获得图片的验证码数据
:return:
"""
while True:
random_int = str(randint(1, pow(10, 13)))
# 获取图片的值
img_url = 'https://www.zhihu.com/captcha.gif?r=%s&type=login&lang=cn' % random_int random_sleep()
# 获取图片
img_resp = session.get(img_url, headers=headers)
with open('zhihu_img.jpg', 'wb') as f:
f.write(img_resp.content)
# 解析图片
z = zheye()
img_yanzhe = z.Recognize('zhihu_img.jpg')
# 把获得的坐标按x进行排序 [(48.647850377664284, 315.97586850515023), (49.944977855563351, 146.27730894630022)]
img_yanzhe.sort(key=lambda x: x[1])
# 知乎提交的位置数据和zheye解析的数据位置相反,置换成知乎要求的数据
img_data = []
for y, x in img_yanzhe:
# zheye中图片为400*88像数,知乎要求为200*44,所有每个值都要除以2
img_data.append((x / 2, y / 2))
# 有数据表示解析成功,没数据重新请求数据再次解析
if img_data:
break
return img_data def get_captcha_data(img_data):
"""通过字符串格式化得到知乎想要的captcha值"""
# captcha:{"img_size":[200,44],"input_points":[[120.375,34],[160.375,36]]}
# first, second, third分别对应第一、第二、第三值,x,y 对应其中x,y坐标值
first, second, third, x, y = 0, 1, 2, 0, 1
if len(img_data) == 1:
captcha = '{"img_size":[200,44],"input_points":[[%.2f,%.2f]]}' \
% (img_data[first][x], img_data[first][y])
elif len(img_data) == 2:
captcha = '{"img_size":[200,44],"input_points":[[%.2f,%.2f],[%.2f,%.2f]]}' \
% (img_data[first][x], img_data[first][y], img_data[second][x], img_data[second][y])
elif len(img_data) == 2:
captcha = '{"img_size":[200,44],"input_points":[[%.2f,%.2f],[%.2f,%.2f],[%.2f,%.2f]]}' \
% (
img_data[first][x], img_data[first][y], img_data[second][x], img_data[second][y], img_data[third][x],
img_data[third][y])
return captcha def get_form_data():
"""获取知乎想要的表单数据"""
_xsrf = get_xsrf()
img_data = get_img_data()
captcha = get_captcha_data(img_data)
form_data = {
'_xsrf': _xsrf,
'password': 'password',
'captcha_type': 'cn',
'captcha': captcha,
'phone_num': 'phone_num',
}
return form_data def go_login(post_url):
"""提交表单并获取返回值"""
from_data = get_form_data() random_sleep()
# 提交验证信息,不允许重定向
resp_yan = session.post(post_url, headers=headers, data=from_data, allow_redirects=False)
# 获取返回的值
result = resp_yan.text
return json.loads(result) if __name__ == '__main__':
post_url = 'https://www.zhihu.com/login/phone_num'
result = go_login(post_url)
print(result)
requests_模拟登录知乎的更多相关文章
- Python爬虫初学(三)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- 利用scrapy模拟登录知乎
闲来无事,写一个模拟登录知乎的小demo. 分析网页发现:登录需要的手机号,密码,_xsrf参数,验证码 实现思路: 1.获取验证码 2.获取_xsrf 参数 3.携带参数,请求登录 验证码url : ...
- 【爬虫】python requests模拟登录知乎
需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题? 前期准备: 环境:ubuntu,python2. ...
- Python爬虫入门(基础实战)—— 模拟登录知乎
模拟登录知乎 这几天在研究模拟登录, 以知乎 - 与世界分享你的知识.经验和见解为例.实现过程遇到不少疑问,借鉴了知乎xchaoinfo的代码,万分感激! 知乎登录分为邮箱登录和手机登录两种方式,通过 ...
- 2020.10.20 利用POST请求模拟登录知乎
前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...
- Java爬虫——模拟登录知乎
登录界面,首先随意输入一个账号,登录查看发送表单的请求 可以发现请求是Post : https://www.zhihu.com/login/phone_num 发送的表单是 _xsrf: passwo ...
- 使用selenium模拟登录知乎
网上流传着许多抓取知乎数据的代码,抓取它的数据有一个问题一定绕不过去,那就是模拟登录,今天我们就来聊聊知乎的模拟登录. 获取知乎内容的方法有两种,一种是使用request,想办法携带cookies等必 ...
- 2019年最新 Python 模拟登录知乎 支持验证码
知乎的登录页面已经改版多次,加强了身份验证,网络上大部分模拟登录均已失效,所以我重写了一份完整的,并实现了提交验证码 (包括中文验证码),本文我对分析过程和代码进行步骤分解,完整的代码请见末尾 Git ...
- Android(Java) 模拟登录知乎并抓取用户信息
前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...
随机推荐
- iOS 中使用 XIB 自定义cell 的两种方法 以及 编译出现常见 的错误 ++++(xcode6.0之后)
一. 注册cell 1.创建自定义cell并勾选 xib :(勾选xib就会自动生成与cell文件关联的xib) 2.在 tableViewController里注册自定义Cell (或者遵守tabl ...
- SLAM入门之视觉里程计(5):单应矩阵
在之前的博文OpenCV,计算两幅图像的单应矩阵,介绍调用OpenCV中的函数,通过4对对应的点的坐标计算两个图像之间单应矩阵\(H\),然后调用射影变换函数,将一幅图像变换到另一幅图像的视角中.当时 ...
- [PHP] 编译构建最新版PHP源码
获取最新PHP代码git clone https://git.php.net/repository/php-src.git构建编译环境apt-get install build-essential 编 ...
- Java入门篇(一)——如何编写一个简单的Java程序
最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...
- 2017 年“认证杯”数学中国数学建模网络挑战赛 C题思路讲解
之前有小伙伴私信我叫我说说这次比赛C题的思路,怎么写的,我就写篇博客说说吧,仅供参考! 针对C题,该题目比较综合,是一个成熟的数模赛题,与国赛的相似性较高.一般而言,第一问难度较低,题目要求进行数据挖 ...
- CTF---Web入门第十六题 天下武功唯快不破
天下武功唯快不破分值:10 来源: 北邮天枢战队 难度:易 参与人数:10787人 Get Flag:2264人 答题人数:3373人 解题通过率:67% 看看响应头 格式:CTF{ } 解题链接: ...
- bzoj:2331: [SCOI2011]地板
Description lxhgww的小名叫“小L”,这是因为他总是很喜欢L型的东西.小L家的客厅是一个的矩形,现在他想用L型的地板来铺满整个客厅,客厅里有些位置有柱子,不能铺地板.现在小L想知道,用 ...
- Uva - 12050 Palindrome Numbers【数论】
题目链接:uva 12050 - Palindrome Numbers 题意:求第n个回文串 思路:首先可以知道的是长度为k的回文串个数有9*10^(k-1),那么依次计算,得出n是长度为多少的串,然 ...
- Uva 10339 - Watching Watches【数论,暴力】
题目链接:10339 - Watching Watches 题意:两个时钟,一个每天慢a秒,一个每天慢b秒,问两钟重新相遇的时刻 1圈有12 * 60 * 60秒,然后1圈 / abs(a - b), ...
- NYoj_104最大和
最大和 时间限制:1000 ms | 内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩 ...