#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' Required - requests (必须) - pillow (可选) ''' import requests try: import cookielib except: import http.cookiejar as cookielib import re import time import os.path try: from PIL import Image except: pass #使用验证码识别库 #import pytesseract # 构造 Request headers agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0' headers = { 'User-Agent': agent } # 使用登录cookie信息 session = requests.session() session.cookies = cookielib.LWPCookieJar(filename='cookies') try: session.cookies.load(ignore_discard=True) except: print("Cookie 未能加载") def get_xsrf(): '''_xsrf 是一个动态变化的参数''' index_url = 'https://www.zhihu.com' # 获取登录时需要用到的_xsrf index_page = session.get(index_url, headers=headers) html = index_page.text pattern = r'name="_xsrf" value="(.*?)"' # 这里的_xsrf 返回的是一个list _xsrf = re.findall(pattern, html) return _xsrf[0] # 获取验证码 def get_captcha(): t = str(int(time.time()*1000)) captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login" r = session.get(captcha_url, headers=headers) with open('captcha.jpg', 'wb') as f: f.write(r.content) f.close() # 用pillow 的 Image 显示验证码 # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入 try: im = Image.open('captcha.jpg') #使用验证码识别,系统需要安装tesseract-ocr软件 #下载地址:https://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe #由于验证码识别,测试识别率不高,因此暂时不使用,寻找更好的识别方法再加 #code = pytesseract.image_to_string(im) #print(code) im.show() im.close() #if len(code)!=4: # print('自动识别不出验证码,请手动输入验证码!') #else: # captcha = code # return captchac except: print(u'请到 %s 目录找到captcha.jpg 手动输入' % os.path.abspath('captcha.jpg')) captcha = input("please input the captcha\n>") return captcha def isLogin(): # 通过查看用户个人信息来判断是否已经登录 url = "https://www.zhihu.com/settings/profile" login_code = session.get(url,allow_redirects=False).status_code if int(x=login_code) == 200: return True else: return False def login(secret, account): # 通过输入的用户名判断是否是手机号 if re.match(r"^1\d{10}$", account): print("手机号登录 \n") post_url = 'https://www.zhihu.com/login/phone_num' postdata = { '_xsrf': get_xsrf(), 'password': secret, 'remember_me': 'true', 'phone_num': account, } #可加上邮箱的判断,这里不加了 else: print("邮箱登录 \n") post_url = 'https://www.zhihu.com/login/email' postdata = { '_xsrf': get_xsrf(), 'password': secret, 'remember_me': 'true', 'email': account, } try: # 不需要验证码直接登录成功 login_page = session.post(post_url, data=postdata, headers=headers) login_code = login_page.text print(login_page.status) print(login_code) except: # 需要输入验证码后才能登录成功 postdata["captcha"] = get_captcha() login_page = session.post(post_url, data=postdata, headers=headers) login_code = eval(login_page.text) print(login_code['msg']) return login_code['r'] session.cookies.save() try: input = raw_input except: pass if __name__ == '__main__': while True: if isLogin(): print('您已经登录') else: account = input('请输入你的用户名\n> ') secret = input("请输入你的密码\n> ") result = login(secret, account) if result == 0: #爬取登录成功后的网站内容 conf_url = "https://www.zhihu.com/settings/profile" text = session.get(conf_url,headers=headers).text print(text) break
以上代码在python 2.*中运行时,只需修改代码的print处即可
代码部分参考网友,代码持续更新优化中,如有错误或更优的方法欢迎大家的留言!