Python爬虫 | selenium 模拟登陆网站(模拟登陆12306购票平台)

在这里插入图片描述

一、准备工作

  1. 下载 selenium 包
pip install selenium
  1. 下载浏览器自动化测试工具 webdriver(点击跳转下载)

二、 selenium 访问页面获取验证码图片

  1. 通过 selenium 爬取 12306 登录页并截图
import requests
from selenium import webdriver
from PIL import Image

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
bro = webdriver.Chrome(executable_path='./chromedriver.exe')  # 打开一个自动化谷歌浏览器
bro.maximize_window() # 浏览器全屏
bro.get('https://kyfw.12306.cn/otn/login/init')  # 在谷歌浏览器中访问网站
bro.save_screenshot('12306_login.png')  # 截取浏览器并保存

12306_login.png :

在这里插入图片描述

  1. 获取图片验证码位置
img_tag = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
location = img_tag.location  # 左下角坐标
size = img_tag.size # 图片尺寸
rangle = [location['x'],location['y'],location['x']+size['width'],location['y']+size['height']]  # 截图坐标
i = Image.open('./12306_login.png')
frame = i.crop(rangle)#根据裁剪的范围进行裁剪
frame.save('code.png')

code.png :

在这里插入图片描述

截图之后才发现怪怪的,跟验证码图片的位置对不上,反复试了几次都这样,查了半天发现是电脑的显示比例是125%

在这里插入图片描述
查了一种可以自动获取电脑缩放比例的方法(传送门:获取屏幕真实分辨率、缩放后的分辨率以及缩放比例),需要的可以按照该操作处理一下,我直接将缩放比例写在代码里。

screen_scale_rate = 1.25  # 屏幕缩放率
img_tag = bro.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img')
location = img_tag.location  # 左下角坐标
size = img_tag.size  # 图片尺寸
# rangle = [location['x'],location['y'],location['x']+size['width'],location['y']+size['height']]  # 100%显示率截图坐标
rangle = [int(i*screen_scale_rate) for i in [location['x'],location['y'],location['x']+size['width'],location['y']+size['height']]]  # 增加屏幕缩放率截图坐标
i = Image.open('./12306_login.png')
frame = i.crop(rangle)  # 根据裁剪的范围进行裁剪
frame.save('code.png')

code.png :

在这里插入图片描述

三、将验证码图片发送给验证码识别平台

传送门:调用验证码识别平台接口

# 验证码识别,返回点击坐标
result = getCode_text('code.png',9004)
print(result) #:x1,y1|x2,y2|x3,y3
#将result转换成[[x1,y1],[x2,y2]]
all_list = []
if '|' in result:
    list_1 = result.split('|')
    count_1 = len(list_1)
    for i in range(count_1):
        xy_list = []
        x = int(list_1[i].split(',')[0])
        y = int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_list = []
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)
    

四、

# 将返回的坐标在浏览器中点击出来
for loc in all_list:
    x = loc[0]
    y = loc[1]
	ActionChains(bro).move_to_element_with_offset(img_tag,x,y).click().perform()
    sleep(1)
bro.find_element_by_id('username').send_keys('1234567890@qq.com')
sleep(1)
bro.find_element_by_id('password').send_keys('0000000000')
sleep(1)
#验证码的处理
bro.find_element_by_id('loginSub').click()
sleep(3)
bro.quit()  # 关闭浏览器
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿过家家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值