往期回顾:上一次说了python模拟登录不带验证码的网站,现在来说说如果带验证码的网站怎么办
验证码也是一种反爬机制,如果登陆地方存在验证码我们有两种思路对验证码进行识别
肉眼识别,即我们将验证码下载下来自己进行识别然后手动输入,这个适合咱们网络安全的人第三方识别平台——如云打码,斐斐打码等,适合专业python人员
因为本人从事的是渗透测试,爬虫只是用来简单的爬取一些漏洞数据,所以这里我就只演示利用肉眼识别验证码的方式。每次请求登录页面验证码都会刷新,所以还是需要用到session对象。
代码编写
如下这个小说网,登录需要验证码
模拟流程大致如下:
利用session发起请求然后xpath获取验证码图的下载地址,将验证码保存封装post数据包,将识别的验证码手动输入session发起post登陆请求请求个人信息,验证是否登陆成功
import requestsfrom lxml import etreefrom requests.packages import urllib3urllib3.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).contentwith 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.textif "登录成功" 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)
成功登录,并获取到登录后的个人信息页