[Python] 模拟知乎登录

前言:最近看到公众号python之禅里面的历史文章,模拟登录知乎,又看到很多人在网上尝试写代码,自己也想试试,最新的验证码是选择倒立的汉字,本文采用手动输入验证码的形式完成验证,最后获取cookie,存入文件中,之后便可以无需登录直接访问了。
所用python的包:requests,BeautifulSoup,json

首先之前使用python请求网页有层出不穷的包,但是用了requests之后才知道它有多方便,详情可以参考这篇文章,也是python之禅公众号的文章,这里帮忙推荐一波--->链接
下面一步步开始讲解如何模拟登录。

1.观察请求参数(FireFox/Chrome)

在向网站发送请求的时候,服务器会对访问用户进行标识,以cookie的形式存放在浏览器,该浏览器下次进行访问时,则可以跳过登陆直接浏览页面,这是我们模拟知乎登陆的主要目的,获取cookie后,使用cookie访问主页面,则可以跳过登陆。在火狐中,先清掉之前保存的cookie,以模拟浏览器首次访问。


清除火狐cookie

清除cookie后,试着登陆知乎,发现有验证码,打开F12,一边发请求,一边观察网络中的变化。
这里故意输错密码,看看发送了什么请求。

登陆请求头

登陆请求参数

_xsrf的参数是用于防止xsrf攻击,如何防止xsrf攻击,可以参考这篇文章,这是一种简单的恶意链接攻击,可以直接让你访问目标网站并且修改你的密码,所以一般在提交的表单中加个_xsrf参数,只有参数正确才可以进行提交。

2.代码模拟请求

可以看到知乎的主要请求参数,还有email,password,captcha,captcha_type。
自己试验过,captcha_type可以不用填写,首先还是找到验证码的链接如下:
https://www.zhihu.com/captcha.gif?r=1503020715890&type=login&lang=cn

获取验证码的链接

很明显,中间的数字是以毫秒为单位的时间戳,因此在代码中很容易模拟这个链接去发送请求获取验证码的图片。

def get_captcha():
    timestamp = str(time.time()*1000).split(".")[0]
    url = "https://www.zhihu.com/captcha.gif?r=%s&type=login&lang=cn" % timestamp
    print(url)
    req = session.get(url,headers=headers)
    with open("img1.png",'wb') as f:
        f.write(req.content)

我采用的方式是人工识别,所以把图片以二进制的形式写入文件,自己点开查看。
得到的内容是一行汉字:


知乎验证码

点击倒立的汉字,获取响应的坐标,放在请求参数中,即可模拟鼠标点击的过程,可以自己点击几个点,大概找到1234567个汉字的坐标,然后根据汉字的个数,匹配响应的坐标点,填入参数中即可。

def get_code():
    get_captcha()
    print("输入倒立汉字的位置,用逗号隔开")
    a = input("input:")
    indexs = a.split(",")
    data=[[16.4,26.9],[33.4,26.9],[60.4,21.9],[84.4,24.9],[108.4,24.9],[130.4,24.9],[156.4,24.9]]
    input_points = []
    for idx in indexs:
        input_points.append(data[int(idx)-1])
    dict = {
        "img_size": [200, 44],
        "input_points": input_points
    }
    return dict

有了xsrf参数和验证码,输入自己的账号密码,即可模拟登录

def login():
    url = "https://www.zhihu.com/login/email"
    data={
        "_xsrf":get_xsrf(),
        "email":'******@qq.com',
        "password":'asfgasdfasf',
        'captcha_type':get_code()
    }
    response = session.post(url, data=data,headers=headers)
    login_code = response.json()
    print(login_code['msg'])
    response = session.get("https://www.zhihu.com/settings/profile",headers=headers)
    #将cookies->dict->json存放在txt|之后再json->dict直接使用
    with open("cookies.txt",'w') as f:
        json.dump(session.cookies.get_dict(),f)
    with open("login.html","wb") as f:
        f.write(response.content)

第一次登录结束后,session.cookie会自动保持登录状态的cookie,下一次进行登录时,使用cookie即可,这里进行持久化,暂时写在txt文件中,下次使用时直接从文件获取。
这里有个小插曲就是session.cookie的类型是RequestCookie不是dict或者str,这里使用get_dict()方法转化成dict,并用json的形式存在txt文件中,取出来的时候,json可以直接提取成dict,放入session.cookie可以直接使用。

#将cookies->dict->json存放在txt|之后再json->dict直接使用
    with open("cookies.txt",'w') as f:
        json.dump(session.cookies.get_dict(),f)

#从txt文件中获取cookies,json->dict存入session.cookies
    with open("cookies.txt",'r') as f:
        cookies = json.load(f)
    session.cookies.update(cookies)

这里也可以温习下,Python中Json的操作->链接
获取cookie后,我尝试登录了(https://www.zhihu.com/settings/profile)这个地址,可以不需登录正常访问。

3.总结

写知乎登录,主要也是练练手,觉得挺有意思,后面可以尝试用phantomjs+selenium模拟下登录爬取,有了登录cookie之后,也可以爬一下知乎的内容,应该有很多有趣的内容,后续会继续更新的,谢谢关注~
github上我也上传了代码,欢迎大家点评,学习。
源码地址
重塑自我

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容