Python模拟登录,python模拟个人用户登录

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: