背景:在互联网中,一些网页无需登录即可访问,但有些网页需要登录才能够访问,
这里主要说明表单登录和cookie登录两种模拟登录的方法。
表单登录是指通过编写程序模拟浏览器像服务器端发送POST请求,提交登录需要的表单数据,获得服务器端的认可,返回需要的结果,从而实现模拟登录。
提交入口指的是登录网页的表单数据(用户名,密码等)的真实提交地址
在网址的登录页面,F12,打开网络NETwork面板,勾选“Preserve log”,F5刷新页面,登录页面账号密码验证码等进入成功登录页面,在网络NETwork面板里找到"login.jspx"资源包单击,在里面的Headers标签下的General信息中,可以看到请求方法为POST,可以找到,requests url的网址为 提交入口,保存下来留着接下来用,其次
还是在上面的资源包中的 From Data信息中,可以看到我们登录的账号密码等信息,也需要留下来备用
验证码的目的是区分正常人和机器的操作,他是表单登录的障碍,所以要必须获取他,要获取必须选识别他,需要获取验证码的地址,在刚才的面板中找的“captcha.svl”资源并单击,如果其中的Preview标签显示了验证码,则Headers标签下的url地址就是验证码的地址。获取验证码的地址后,下一步需要对验证码地址发送请求,然后将验证码图片下载到本地,最后人工打开图片识别验证码。
扩展库PIL(pillow库)的Image模块可以自动调用本机的图片查看程序打开验证码图片:
Image.open(fp,mode=‘r’)
Image.show(title=None,command=None)
方法 | 参数名称 | 说明 |
---|---|---|
open fp | 接受str。 | 表示图片路径地址。无默认值 |
show title | 接受str。 | 表示图片标题。默认为None |
用法:
import requests #导入requests库
from PIL import Image #导入PIL库的Image模块
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'} #请求头
captcha_url='http://***********' #验证码地址
r=requests.get(captcha_url,headers=headers) #向验证码地址发起请求
#将图片保存到本地
with open('./位置/取个名字','wb') as f:
f.write(r.content)
#创建Image对象
im=Image.open('./位置/取个名字')
#调用本机图片查看程序打开图片
im.show()
captcha=input('请输入入验证码:')
print('获取的验证码为:',captcha)
POST请求方法能够保障用户端用户端提交数据的安全性,因此他被一般需要登录的网站所采用,Requests库的post函数能够以POST请求方法向服务器客户端发送请求,他会返回一个Respose对象。post语法格式如下:
requests.post(url,data=None,json=None,**kwargs)
参数 | 说明 |
---|---|
url | 接受str。表示提交入口。无默认值 |
data | 接受dict。表示需要提交的表单数据。无默认值 |
用法:
import requests
login_data={'username':***,'password':***·····} #本为举例,具体根据"login.jspx"资源的内容
# 发送请求
r=requests.post('登录页面的网址',data=login_data)
print('发送请求后返回的状态码:',r.status_code)
发送请求的客户端与POST请求的必须是同一个,cookie可用于服务器识别客户端,发送请求的客户端有同样的cookie时,可认定客户端是同一个。requests库的会话对象Session能够跨请求的保持某些参数。
用法:
import requests
login_data={'username':***,'password':***·····} #本为举例,具体根据"login.jspx"资源的内容
s=requests.Session()
r=s.post('登录页面的网址',data=login_data)
print('发送请求返回的状态码:',r.status_code)
怎么判断模拟登陆是否登录成功,则判断发送请求之后获取的url地址是否为登录之后的网址地址,如果是则登陆成功,不是则登陆失败。
import requests
from PIL import Image
s=requests.Session()
login_url='登录页面的网址'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
def get_captcha():
captcha_url="验证码的网址"
r=s.get(captcha_url,headers=headers) #向验证码发送请求,获取图片
with open('./位置/取个名字','wb') as f: #将图片保存到本地
f.write(r.content)
im=Image.open('./位置/取个名字') #创建Image对象
im.show() #调用本机图片查看程序打开图片
captcha=input('请输入入验证码:')
return captcha
login_data={'username':***,'password':***·····,'captch':get_captcha()} #构建需要提交的表单数据
r=s.post(login_url,data=login_data,headers=headers) #提交表单数据,使用POST请求方法向提交入口发送请求
#测试是否成功登录
print('发送请求后返回的网址:',r.url) #网址变了则成功登录进去
服务端使用cookie来区分不同的客户端,cookie成为服务器识别客户端身份,保存客户端信息的重要工具。
特别注意的是,cookie具有时效性,失效的cookie会导致登陆失败。如果客户端退出登录,也会导致登陆失败。
登录页面输入账号密码等 登录进去,F12,再F5刷新页面找到“index.html”资源,headers标签下 可以找到cookie信息。
使用Requests库的get函数设置发送请求携带cookie的参数是cookies,他接收dict或者cookiejar。从浏览器获取的cookie为str类型,需要处理为dict类型。
import requests
login_url='登录页面的网址'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
cookie_str='获取的cookie信息' #cookie 必须为最新登录进去产生的cookie
cookies={}
for line in cookie_str.split(';'):
key,value=line.split('=',1)
cookie[key]=value
#携带cookie发送请求
r=requests.get(login_url,cookies=cookies,headers=headers)
#测试是否成功登录
print('发送请求后返回的网址:',r.url)
实现第一次表单登录后,可以将cookie保存下来以便下次直接使用,表单登录后的cookie无需处理。此外,cookie失效后再次进行表单登录即可获取最新的cookie。
基于表单登录的cookie登录,首先需要存储首次登录后的cookie,然后加载已保存的cookie
import requests
from http import cookiejar
s=requests.Session()
#创建LWPCookieJar对象,若cookie不存在,则建立cookie文件,命名为cookie
s.cookies=cookiejar.LWPCookieJar('cookie')
login_url='登录页面的网址'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/65.0.3325.181'}
def get_captcha():
captcha_url="验证码的网址"
r=s.get(captcha_url,headers=headers) #向验证码发送请求,获取图片
with open('./位置/取个名字','wb') as f: #将图片保存到本地
f.write(r.content)
im=Image.open('./位置/取个名字') #创建Image对象
im.show() #调用本机图片查看程序打开图片
captcha=input('请输入入验证码:')
return captcha
login_data={'username':***,'password':***·····,'captch':get_captcha()} #构建需要提交的表单数据
r=s.post(login_url,data=login_data,headers=headers) #提交表单数据,使用POST请求方法向提交入口发送请求
#测试是否成功登录
print('发送请求后返回的网址:',r.url) #网址变了则成功登录进去
#保存cookie
s.cookies.save(ignore_discard=True,ignore_expries=True)
LWPCookieJar对象load方法用于加载cookie,基本语法格式如下:
__http.cookiejar.LWPCookieJar.load(filename=None,ignore_discard=False,ignore_expires=False)
load方法常用参数及其说明
参数 | 说明 |
---|---|
filename | 接收str。表示需要加载的cookie文件名。 |
ignore_discard | 接收bool。表示即使cookie不存在,也要加载。默认为False |
ignore_expires | 接收bool。表示覆盖原有的cookie。默认为False |
#判断保存的cookie文件是否存在,存在则加载
try:
s.cookies.load(ignore_discard=True)
export:
print('cookie 未能加载!')
#携带cookie提交请求
r=s.get(login_url,headers=headers)
#测试是否成功登录
print('发送请求后返回的网址为:',r.url)