一、常见状态码
表达式 | 说明 |
---|---|
200 | 请求被正确执行 |
301/302 | 永久性重定向/临时性重定向 |
403 | 没有权限访问 |
404 | 没有资源访问 |
500 | 服务器错误 |
503 | 服务器停机或正在维护 |
二、登录分析
在登录界面输入手机号和帐号
Paste_Image.png返回的地址为
Request URL:https://www.zhihu.com/login/phone_num
当输入email地址后返回的地址为
Request URL:https://www.zhihu.com/login/email
并且在formdata中出现
_xsrf:a71f46d549979fa192c09e11e4a463b5
这样的字符串。
Paste_Image.png
三、抓取xsrf的值
正则匹配抓取xsrf需要使用header头来进行源代码的获取
def get_xsrf():
response = requests.get("https://www.zhihu.com", headers=headers)
re_match = re.match('.*name="_xsrf" value="(.*)"/>', response.text, re.S)
return re_match
其中re.S
,可以换行匹配。
四、登录逻辑
import http.cookiejar as cookielib
def get_xsrf():
response = requests.get("https://www.zhihu.com", headers=headers)
re_match = re.match('.*name="_xsrf" value="(.*)"/>', response.text, re.S)
if re_match:
return re_match.group(1)
else:
return ""
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename="cookies.txt")
try:
session.cookies.load(ignore_discard=True)
except:
print("Cookie未能加载")
def zhihu_login(account, password):
if re.match("^1\d{10}", account):
print("手机号码登录")
post_url = "https://www.zhihu.com/login/phone_num"
post_data = {
"_xsrf": get_xsrf(),
"phone_num": account,
"password": password,
"captcha": get_captcha(),
}
else:
print("邮箱登录")
post_url = "https://www.zhihu.com/login/email"
post_data = {
"_xsrf": get_xsrf(),
"email": account,
"password": password,
"captcha": get_captcha(),
}
response_text = session.post(post_url, data=post_data, headers=headers)
session.cookies.save()
以上代码是通过引入requests库,使用它的session方法,进行连接,构造post_data,把自己的用户名密码等信息发送到网站,并通过正则判断发送的是邮箱或是手机进行登录。
引入import http.cookiejar as cookielib
,通过session.cookies.save(),对cookie进行保存。
五、获得验证码
def get_captcha():
import time
t = str(int(time.time()*1000))
captcha_url = "https://www.zhihu.com/captcha.gif?r={}&type=login".format(t)
t = session.get(captcha_url, headers=headers)
with open('captpcha.jpg', 'wb') as f:
f.write(t.content)
f.close()
from PIL import Image
try:
im = Image.open('captpcha.jpg')
im.show()
im.close()
except:
pass
captcha = input("输入验证码")
return captcha
通过 上面的代码获得验证码并使用图片显示的方法查看输入。
六、不重新登录
登录只能一次,如果再次登录,可以直接通过查看cookie来判断是否为登录状态。
session.cookies = cookielib.LWPCookieJar(filename="cookies.txt")
try:
session.cookies.load(ignore_discard=True)
except:
print("Cookie未能加载")
def is_login():
inbox_url = "https://www.zhihu.com/index"
response = session.get(inbox_url, headers=headers, allow_redirects=False)
if response.status_code != 200:
return "失败"
else:
return "成功"
首先把cookie通过session.cookies.load装载进来,执行is_login()函数,如果成功可以访问inbox_url页面,则状态码为200表示成功。这里一定要注意allow_redirects=False,当不允许且登录时会自动跳转到登录页面,则状态码是301或者302。
网友评论