Python模拟登录,python模拟个人用户登录
本文主要介绍如何在知乎中使用Python实现模拟登陆的功能。文中的样例代码讲解的很详细,对我们学习很有帮助,有需要的可以参考一下。
00-1010环境与开发工具模拟过程概述参数探索模拟源代码运行结果结果1:密码错误结果2:验证码错误结果3:登录成功
目录
抢包的时候开始用Chrome开发工具里的网络,没抓到。后来我用Fiddler成功抓取了数据。让我们一步一步细化上面的流程。
在知乎登录之前,先看看这个案例中使用的环境和工具:
windows Python 2.75 Chrome Fiddler 3360用于监控客户端和服务器之间的通信,并找到相关参数的位置。Github源代码下载
环境与开发工具
使用Google浏览器结合Fiddler监控客户端与服务器的通信过程;根据监控结果,构造请求服务器过程中传递的参数;用Python模拟参数传递过程。客户端和服务器之间通信过程中的几个关键点:
登录时的Url地址。登录时提交的参数[params]可以通过两种方式获取:一是分析页面的源代码,找到表单标签和属性。适应更简单的页面。第二,使用包捕获工具检查提交的url和参数,通常使用Network、Fiddler等。在Chrome的开发者工具中。登录后跳转的Url。
模拟过程概述
先看这个登录页面,这是我们登录时的url地址。
看到这个页面,我们也能大致猜出请求服务器时传递了多少字段。很明显,有:用户名、密码、验证码和“记住我”值。那么实际的有哪些呢?下面我们来分析一下。
首先,检查HTML源代码。可以用CTRL U在Google里查一下,然后用CTRL F输入输入,看看有哪些字段值。详情如下:
通过源代码我们可以看到,在请求服务器的过程中还携带了一个隐藏字段“_xsrf”。所以现在的问题是:这些参数在传递的时候是以什么名字传递的?有必要借用其他工具来捕获包进行分析。作者是Windows系统,这里用的是Fiddler(当然也可以用其他)。
抓包的过程比较复杂,因为抓到的东西很多,很难快速找到需要的信息。关于fiddler,很好用。如果没有,可以百度一下。为了防止其他信息的干扰,我们先清除fiddler中的记录,然后输入用户名(我用邮箱登录)、密码等信息登录。fiddler中相应的结果如下:3360
注意:如果使用手机登录,fiddler中对应的网址是“/login/phone_num”。
为了查看详细的请求参数,我们可以点击"/登录/电子邮件"来查看以下信息:
请求方法是POST,从数据中可以看出请求的url是https://www.zhihu.com/login/email.对应的字段名如下:
_ xsrfcaptchaemailpassword remember对于这五个字段,代码中的email、password、captcha都是手工输入的,remember初始化为true。剩下的_xsrf可以基于登录页面的源文件,输入可以是_xsrf的值。
对于验证码,您需要进行额外的请求。这个链接可以通过在固定点检查源代码来看到:
链接到https://www.zhihu.com/captcha.gif?类型=登录,其中ts(
经测试,可省略掉)。现在,可以使用代码进行模拟登录。
温馨提示:如果使用的是手机号码进行登录,则请求的url为https://www.zhihu.com/login/phone_num
,同时email字段名称将变成phone_num。
模拟源码
在编写代码实现知乎登录的过程中,笔者将一些功能封装成了一个简单的类WSpider,以便复用,文件名称为WSpider.py。
# -*- coding: utf-8 -*-"""
Created on Thu Nov 02 14:01:17 2016
@author: liudiwei
"""
import urllib
import urllib2
import cookielib
import logging
class WSpider(object):
def __init__(self):
#init params
self.url_path = None
self.post_data = None
self.header = None
self.domain = None
self.operate = None
#init cookie
self.cookiejar = cookielib.LWPCookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookiejar))
urllib2.install_opener(self.opener)
def setRequestData(self, url_path=None, post_data=None, header=None):
self.url_path = url_path
self.post_data = post_data
self.header = header
def getHtmlText(self, is_cookie=False):
if self.post_data == None and self.header == None:
request = urllib2.Request(self.url_path)
else:
request = urllib2.Request(self.url_path, urllib.urlencode(self.post_data), self.header)
response = urllib2.urlopen(request)
if is_cookie:
self.operate = self.opener.open(request)
resText = response.read()
return resText
"""
Save captcha to local
"""
def saveCaptcha(self, captcha_url, outpath, save_mode=wb):
picture = self.opener.open(captcha_url).read() #用openr访问验证码地址,获取cookie
local = open(outpath, save_mode)
local.write(picture)
local.close()
def getHtml(self, url):
page = urllib.urlopen(url)
html = page.read()
return html
"""
功能:将文本内容输出至本地
@params
content:文本内容
out_path: 输出路径
"""
def output(self, content, out_path, save_mode="w"):
fw = open(out_path, save_mode)
fw.write(content)
fw.close()
"""#EXAMPLE
logger = createLogger(mylogger, temp/logger.log)
logger.debug(logger debug message)
logger.info(logger info message)
logger.warning(logger warning message)
logger.error(logger error message)
logger.critical(logger critical message)
"""
def createLogger(self, logger_name, log_file):
# 创建一个logger
logger = logging.getLogger(logger_name)
logger.setLevel(logging.INFO)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(log_file)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
# 定义handler的输出格式formatter
formatter = logging.Formatter(%(asctime)s %(name)s %(levelname)s %(message)s)
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
return logger
关于模拟登录知乎的源码,保存在zhiHuLogin.py文件,内容如下:
# -*- coding: utf-8 -*-"""
Created on Thu Nov 02 17:07:17 2016
@author: liudiwei
"""
import urllib
from WSpider import WSpider
from bs4 import BeautifulSoup as BS
import getpass
import json
import WLogger as WLog
"""
2016.11.03 由于验证码问题暂时无法正常登陆
2016.11.04 成功登录,期间出现下列问题
验证码错误返回:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码错误"}, "msg": "验证码错误" }
验证码过期:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码回话无效 :(","name":"ERR_VERIFY_CAPTCHA_SESSION_INVALID"}, "msg": "验证码回话无效 :(" }
登录:{"r":0, "msg": "登录成功"}
"""
def zhiHuLogin():
spy = WSpider()
logger = spy.createLogger(mylogger, temp/logger.log)
homepage = r"https://www.zhihu.com/"
html = spy.opener.open(homepage).read()
soup = BS(html, "html.parser")
_xsrf = soup.find("input", {type:hidden}).get("value")
#根据email和手机登陆得到的参数名不一样,email登陆传递的参数是‘email,手机登陆传递的是‘phone_num
username = raw_input("Please input username: ")
password = getpass.getpass("Please input your password: ")
account_name = None
if "@" in username:
account_name = email
else:
account_name = phone_num
#保存验证码
logger.info("save captcha to local machine.")
captchaURL = r"https://www.zhihu.com/captcha.gif?type=login" #验证码url
spy.saveCaptcha(captcha_url=captchaURL, outpath="temp/captcha.jpg") #temp目录需手动创建
#请求的参数列表
post_data = {
_xsrf: _xsrf,
account_name: username,
password: password,
remember_me: true,
captcha:raw_input("Please input captcha: ")
}
#请求的头内容
header ={
Accept:*/* ,
Content-Type:application/x-www-form-urlencoded; charset=UTF-8,
X-Requested-With:XMLHttpRequest,
Referer:https://www.zhihu.com/,
Accept-Language:en-GB,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,
Accept-Encoding:gzip, deflate, br,
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36,
Host:www.zhihu.com
}
url = r"https://www.zhihu.com/login/" + account_name
spy.setRequestData(url, post_data, header)
resText = spy.getHtmlText()
jsonText = json.loads(resText)
if jsonText["r"] == 0:
logger.info("Login success!")
else:
logger.error("Login Failed!")
logger.error("Error info ---> " + jsonText["msg"])
text = spy.opener.open(homepage).read() #重新打开主页,查看源码可知此时已经处于登录状态
spy.output(text, "out/home.html") #out目录需手动创建
if __name__ == __main__:
zhiHuLogin()
关于源码的分析,可以参考代码中的注解。
运行结果
在控制台中运行python zhiHuLogin.py,然后按提示输入相应的内容,最后可得到以下不同的结果(举了三个实例):
结果一:密码错误
结果二:验证码错误
结果三:成功登录
通过代码,可以成功的登录到知乎,接着如果要爬取知乎里面的内容,就比较方便了。
以上就是利用Python实现模拟登录知乎的详细内容,更多关于Python模拟登录知乎的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。