python模拟登录网站(带图形验证码)

往期回顾:上一次说了 python模拟登录不带验证码的网站,现在来说说如果带验证码的网站怎么办

验证码也是一种反爬机制,如果登陆地方存在验证码我们有两种思路对验证码进行识别

  • 肉眼识别,即我们将验证码下载下来自己进行识别然后手动输入,这个适合咱们网络安全的人
  • 第三方识别平台——如云打码,斐斐打码等,适合专业python人员

因为本人从事的是渗透测试,爬虫只是用来简单的爬取一些漏洞数据,所以这里我就只演示利用肉眼识别验证码的方式。每次请求登录页面验证码都会刷新,所以还是需要用到session对象。

代码编写

如下这个小说网,登录需要验证码

python模拟登录网站(带图形验证码)_第1张图片

模拟流程大致如下:

  • 利用session发起请求然后xpath获取验证码图的下载地址,将验证码保存
  • 封装post数据包,将识别的验证码手动输入
  • session发起post登陆请求
  • 请求个人信息,验证是否登陆成功
import requests
from lxml import etree
from requests.packages import urllib3
urllib3.disable_warnings()

url = "https://www.qb5.tw/login.php"
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}

# 1.创建session对象
session = requests.session()
pag_text = session.get(url=url,headers=headers).text

# 2.实例化一个etree对象,方便后面对页面进行数据解析
tree = etree.HTML(pag_text)

# 3.提取验证码下载地址
img_path = "https://www.qb5.tw" + tree.xpath('//*[@id="main"]/div[1]/form/fieldset/p[3]/img/@src')[0]
print(img_path)

# 4.下载验证码,以二进制的方式进行保存
img_content = session.get(img_path,headers=headers,verify=False).content
with open('./img.png','wb') as f:
    f.write(img_content)
    print('验证码图片下载成功')

img_code= input('请输入验证码:')

# 5.进行登录,定义post的参数
data = {
    'username': 'test123',
    'password': 'admin@123',
    'checkcode': img_code,
    'usecookie': '315360000',
    'action': 'login',
    'submit': '立即登陆'
}
# 判断是否登录成功
response = session.post(url=url,data=data,headers=headers,verify=False)
response.encoding = 'gbk'      #编码防止乱码
response_text = response.text
if "登录成功"  in response_text:
    print("登陆成功")
# 请求个人信息页
ge = session.get(url='https://www.qb5.tw/userdetail.php',headers=headers,verify=False)
with open('xs.html','w',encoding='gbk') as f:
    f.write(ge.text)

成功登录,并获取到登录后的个人信息页 

python模拟登录网站(带图形验证码)_第2张图片

你可能感兴趣的:(python技术,python,python登录带验证码的网站)