python 模拟登陆网站

文章目录

  • 网站登陆与会话机制(cookie & session)

    • 简单的cookie模拟登陆
  • 什么是cookie * 使用cookie的模拟登陆

    • 简单的session模拟登陆
  • 什么是session * 使用session的模拟登陆

    • 带有验证码的模拟登陆
  • 问题描述 * 使用cookie模拟验证码登陆

网站登陆与会话机制(cookie & session)

简单的cookie模拟登陆

什么是cookie

cookie和session是什么(传送门)
其实简单的说就是当用户通过http协议访问一个服务器的时候,这个服务器会将一些Name/Value键值对返回给客户端浏览器,并将这些数据加上一些限制条件。在条件符合时,这个用户下次再访问服务器的时候,数据又被完整的带给服务器。

因为http是一种无状态协议,用户首次访问web站点的时候,服务器对用户一无所知。而Cookie就像是服务器给每个来访问的用户贴的标签,而这些标签就是对来访问的客户端的独有的身份的一个标识,这里就如同每个人的身份证一样,带着你的个人信息。而当一个客户端第一次连接过来的时候,服务端就会给他打一个标签,这里就如同给你发了一个身份证,当你下载带着这个身份证来的时候,服务器就知道你是谁了。所以Cookie是存在客户端的,这里其实就是在你的浏览器中。

Cookie中包含了一个由名字=值(name = value)这样的信息构成的任意列表,通过Set-Cookie或Set-Cookie2 HTTP响应(扩展)首部将其贴到客户端身上。如下图例子所示:
在这里插入图片描述

使用cookie的模拟登陆

cookie的使用方式一般来说有两种:

  1. 直接使用浏览器上已有的cookie(这个方法比较简单,但是每次使用都需要去查看cookie)
  2. 用python模拟登陆之后,将cookie保存在变量中。以下讲解的就是这种方法

话不多说,上方法
首先,利用浏览器自带的抓包工具,来查看登陆网页的数据包。
在这里插入图片描述
这里有个小窍门,如果不知道哪一个URL请求是登陆网页的URL,可以随意输一个账号密码让浏览器报错之后就很容易找出来登陆的URL了。
上图可以直接得到URL和请求方式POST了。一般表单都是通过POST方式进行网页请求的。
在这里插入图片描述
除了URL和请求方式,还需要制作表头header。表头一般需要用到的就是上图框框中的四个。(有些时候甚至只需要User-Agent来掩饰,假装请求是通过浏览器来的)
在这里插入图片描述
最后,需要把上传的表单数据data准备好。
二话不说上代码

1 def Brower138(self): 2 #登陆验证网站,获取线路 3 identifyUrl= self.identifyUrl 4 identify = self.identify 5 6 try: 7 #获得一个cookieJar实例 8 cj = cookiejar.CookieJar() 9 #cookieJar作为参数,获得一个opener的实例 10 opener=request.build_opener(request.HTTPCookieProcessor(cj)) 11 #伪装成一个正常的浏览器,避免有些web服务器拒绝访问。 12 opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'),('Connection','keep-alive')] 13 #生成Post数据,含有登陆用户名密码。 14 data = urllib.parse.urlencode({"user":"用户名","password":"密码"}).encode('utf-8') 15 #以post的方法访问登陆页面,访问之后cookieJar会自定保存cookie 16 opener.open(identifyUrl,data) 17 #以带cookie的方式访问页面 18 op=opener.open(url) 19 #读取页面源码 20 data= op.read() 21 return data 22 except Exception as e: 23 print(str(e)) 24 25

简单的session模拟登陆

什么是session

上面我们知道了Cookie可以让服务器端跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,这无形地增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。

同一个客户端每次和服务端交互时,不需要每次都传回所有的Cookie值,而是只要传回一个ID这个ID是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的ID,客户端只要传回这个ID就行了,这个ID通常是NANE为JSESIONID的一个Cookie。所以Session其实是利用Cookie进行信息处理的。

cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
cookie 和session的区别是:cookie数据保存在客户端,session数据保存在服务器端。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session,当然也没有绝对的安全,只是相对cookie,session更加安全
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
cookie和session各有优缺点,所以将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

使用session的模拟登陆

seesion的模拟登陆,同样需要准备好URL,请求方式,表头header,还有表单数据data。方法上面讲过了,就不讲了。
二话不说上代码

1#输入账号密码验证码 2user = '' 3password= '' 4url = '' 5#登陆 6headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36', 7 'Origin': 'https://4910179829-cj.cp168.ws', 8 'Referer': 'https://4910179829-cj.cp168.ws/login', 9 'Upgrade-Insecure-Requests': '1', 10 'Content - Type': 'application / x - www - form - urlencoded',} 11form_data = {'type': '1', 12 'account': user, 13 'password': password,} 14form_data = parse.urlencode(form_data).encode('utf-8') 15loginRes = session.post(url,header=headers, data=form_data) 16#登陆后访问其他网页,就可以直接用session进行post或者get了 17 18

带有验证码的模拟登陆

很多网站的登陆,除了需要账号密码验证之外,还需要验证码验证。加了验证码之后,代码变化还是相当大的,并不是直接在表单数据data中添加一个验证码code,就可以直接使用了。

问题描述

验证码有一个特点,在我们每次访问登陆网页的时候,验证码都是不同的。也就是说,验证码是实时生成的。一般,我们会把验证码图片下载下来,保存到本地。然后在表单中添加一个验证码字段。问题就出现在这里了:为了获取验证码图片,我们需要用一个get请求访问登陆URL。后边登陆的时候,我们用POST请求,将表单上传进行登陆。实际上,是两次请求。如果不经过处理,两次请求是对应不上的。 换句话说,登陆的时候,验证码会不匹配。
通过前面的说明,我们知道,通过cookie,可以让服务器知道,两次请求是同一个回话。所以,实际上,就是通过cookie来使得两次请求对应上。

所以,验证码模拟登陆的流程就很清晰了。

  1. get请求,获得验证码图片并保存。这个请求的URL,是验证码托图片的URL,不是LoginURL,别弄混了。
  2. 保存get请求的cookie。
  3. 用该cookie,POST请求模拟登陆。

使用cookie模拟验证码登陆

1import requests 2from bs4 import BeautifulSoup 3 4url = "https://XXX.XXX/" 5#获取验证码图片 6loginpage = requests.get(url).text 7soup = BeautifulSoup(loginpage,"lxml") 8code_url = soup.find(class_='info code').img.get('src') 9code = requests.get(url+code_url) 10f_code = open('code.jpg','wb') #存储图片,多媒体文件需要参数b(二进制文件) 11f_code.write(code.content) #多媒体存储content 12f_code.close() 13ck = code.cookies.get_dict() 14print("code的cookie", ck) 15 16#输入账号密码验证码 17user = 'XXX' 18password= 'XXX' 19code_no = input('输入验证码:') 20 21#登陆 22headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36', 23 'Host': 'https://XXX', 24 'Origin': 'https://XXX', 25 'Referer': 'https://XXX', 26 'Upgrade-Insecure-Requests': '1', 27 } 28form_data = {'type': '1', 29 'account': user, 30 'password': password, 31 'code': code_no,} 32res = requests.post("https://XXX.XXX/login",headers=headers, data=form_data, cookies=ck) 33print(res.text) 34 35 36

代码交流 2021