了解http常见状态码

可以通过输入错误的密码来找到登陆知乎的post:url

把Headers拉到底部,可以看到form data

_xsrf是需要发送的,需要发送给服务端,否则会返回403错误,提示用户没权限访问

获取xsrf的方法:

# -*- coding: utf-8 -*-

import requests,re
#py2里叫cookielib,py3里叫cookiejar
try:
import cookielib
except:
import http.cookiejar as cookielib #拿到浏览器设置的用户代理
User_Agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
#定义header,注意:header里的key是固定的
header = {
"HOST":"www.zhihu.com",
"Referer":"https://www.zhihu.com",
"User-Agent":User_Agent
}
def get_xsrf():
#可以通过自定义请求头来传入User-Agent
response = requests.get("http://www.zhihu.com",headers=header)
print(response.text)
return '' get_xsrf()

接着使用re模块来获取到这一行数值

#如果匹配不到,那可能是中间有换行符的原因,可以加上re.dotall
match_obj = re.match('.*name="_xsrf" value="(.*?)"', response.text, re.DOTALL)

每次查看知乎页面要用get和post创建新连接效率不高,可以使用session,后面使用requests的方法就在session上调用

session = requests.session()
session = requests.session()
#给session的cookies方法重新指定,cookielib类实例出来的LWPCookieJar方法可以很方便的保存文件
#可以指定一个文件名,如果文件不存在会自动创建。
session.cookies = cookielib.LWPCookieJar(filename="cookies.txt") try:
#加载cookies
session.cookies.load(ignore_discard=True)
except:
print("cookie未能加载") def get_index():
"""
前面用session保存了cookie到本地,这里我再用session调用get方法时,会自动把cookie带过去。
:return:
"""
response = session.get("https://www.zhihu.com", headers=header)
with open("index_page.html","wb") as f:
f.write(response.text.encode('utf-8'))
print("OK")

要判断是否已登陆,可以访问一些需要登陆才有权限访问的页面,比如知乎页面的登陆后的我的私信页面,用FireFox可以先看到返回状态:302临时重定向

接着301重定向,不过我用chrome检测,直接从第三行数据开始展示

所以可以获取状态码来判断是否登陆:

PS:get方法有个参数allow_redirects是否允许重定向,默认是True,如果访问的url状态是301/302,则会去访问重定向的url

def is_login():
#通过个人的私信页面判断是否已登陆
inbox_url = "https://www.zhihu.com/inbox"
#allow_redirects参数是否跳转到重定向的url
response = session.get(inbox_url,headers=header,allow_redirects=False)
if response.status_code != 200:
status_code = False
else:
status_code = True
return status_code

测试获取xsrf时服务器返回500错误,这个是因为使用requests模块时,没有设置浏览器的用户代理,不同的浏览器这个值是不一样的,有的服务器会验证这个是否合法的,这是服务器的一种防御策略。

处理方法:

在知乎登陆界面F12,刷新页面,找到Header请求头:

第十二篇 requests模拟登陆知乎的更多相关文章

  1. Requests模拟登陆

    requests模拟登陆知乎网站 实例 # -*- coding: utf-8 -*- __author__ = 'CQ' import requests try: import cookielib ...

  2. 第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  3. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  4. 【译】第十二篇 Integration Services:高级日志记录

    本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...

  5. 跟我学SpringCloud | 第十二篇:Spring Cloud Gateway初探

    SpringCloud系列教程 | 第十二篇:Spring Cloud Gateway初探 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如 ...

  6. 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

    解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...

  7. 第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  8. Python之路【第十二篇】:JavaScrpt -暂无内容-待更新

    Python之路[第十二篇]:JavaScrpt -暂无内容-待更新

  9. 【译】第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

随机推荐

  1. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  2. 慎用margin系列3---IE6下3px bug

    当我们想让一段文字出现在一个布局块的右边的时候,我们会让布局块向左浮动,然后把段落设置左布局块宽度大小的左空白.比如左布局块是.a{float:left;height: 110px;width: 28 ...

  3. 第一记 搭建Java集成开发环境

    一.JDK JDK可以前往oracle官网进行下载并进行安装(我这边使用的是jdk1.8版本,也推荐使用jdk1.8及以上的) 下图是默认路径安装完成后的截图 安装完成会产生这两个文件夹 二.配置环境 ...

  4. 19-python基础-进制之间的转换

    二进制-八进制-十进制-十六进制相互转换 1.十进制转为其他进制 # (1)十进制转二进制 a = 8 bin(a) --->>'0b1000' # (2)十进制转八进制 oct(a) - ...

  5. [ACM] POJ 1218 THE DRUNK JAILER (关灯问题)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sr19930829/article/details/37727417 THE DRUNK JAILE ...

  6. 暴力穷举zip、rar压缩文件的密码

    生成密码的方式类似与时钟,末尾遍历完了第k位所有的字符,就让第k位的前一位到下一位字符,第k位回到第0个字符. 对python还不太熟悉,效率比较低,但是能破解简单的密码. import zipfil ...

  7. Ubuntu14.04.1LTS不能上网解决方法之一

    我们在装好了Ubuntu之后,打开浏览器,显示Server not found. 1.点击网络图标,显示如下: 2.进入etc/NetworkManager,找到 Networkmanager.con ...

  8. Centos6.6安装JDK1.8

    首先从官网下载jdk1.8,地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  9. HDU-3001 TSP+三进制DP

    题意:给出一个无向图,每个点不能被经过超过两次,选择一个起点问经过所有点至少一次的最短路径. 解法:注意此题是每个点不能经过超过两次,这和一般的TSP问题不同.但是也没有使得此题变得很复杂,原来的状态 ...

  10. CFgym100020 Problem J. Uprtof

    题意:给你n个点m无向条边.每个点是黑色或者白色的.m条边第一条边边权为2^m,第二条边边权为2^(m-1)....... .在这个图上选择一些边连起来,使得满足:每个黑点连奇数条边,每个白点连偶数条 ...