Python + Selenium 实现模拟登录jd实例分享

 更新时间:2023年06月02日 08:19:41   作者:Qiu_0000  
这篇文章主要介绍了Python + Selenium 实现模拟登录jd实例分享的相关资料,需要的朋友可以参考下

1. 前言

最近有点时间,就随便找点东西弄弄,倒也碰到了一些问题,在此记录下

2. 环境

Python3.11.3 + selenium4.9.1 + opencv4.7 + PyAutoGUI0.9.54 + windows11

3. 开始

3.1 账号密码输入

进入登录页面,登录方式有两种,这里直接定位点击账号登录即可

# 进入登入页面
self.driver.get(self.config.login_url)
WebDriverWait(self.driver, 10).until(EC.url_to_be(self.config.login_url))
self.driver.maximize_window()
        
# 点击账号登录
WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="login-tab login-tab-r"]/a')))
self.driver.find_element(By.XPATH, '//*[@class="login-tab login-tab-r"]/a').click()

# 账号密码输入
self.driver.find_element(By.ID, "loginname").send_keys(self.user_info.username)
self.driver.find_element(By.ID, "nloginpwd").send_keys(self.user_info.password)

3.2 通过验证码

3.2.1 验证码图片下载

看到验证码的图片是base64格式的,可以通过src属性来获取,然后直接转成cv图片格式即可

bigimg_b64 = self.driver.find_element(By.XPATH, '//*[@class="JDJRV-bigimg"]/img').get_attribute('src')
bigimg_data = base64.b64decode(bigimg_b64.replace('data:image/png;base64,', ''))
bigimg_array = np.frombuffer(bigimg_data, np.uint8)
bigimg_img = cv2.imdecode(bigimg_array, cv2.COLOR_RGB2BGR)

smallimg_b64 = self.driver.find_element(By.XPATH, '//*[@class="JDJRV-smallimg"]/img').get_attribute('src')
smallimg_data = base64.b64decode(smallimg_b64.replace('data:image/png;base64,', ''))
smallimg_array = np.frombuffer(smallimg_data, np.uint8)
smallimg_img = cv2.imdecode(smallimg_array, cv2.COLOR_RGB2BGR)

3.2.2 滑块需要移动的距离计算




这里可以用opencv来做,正确率还不错,而且还简单,直接把两张验证码图片经过灰度后,进行模板匹配即可,不过最后的结果还需要根据网页元素的尺寸进行调整

# 灰度化
bigimg_gray = cv2.cvtColor(bigimg_img, cv2.COLOR_BGR2GRAY)
smallimg_gray = cv2.cvtColor(smallimg_img, cv2.COLOR_BGR2GRAY)

# 模板匹配
result = cv2.matchTemplate(bigimg_gray, smallimg_gray, cv2.TM_CCOEFF_NORMED)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(result)

# 移动距离对应到网页需要缩放(网页显示的图片和实际图片存在一定的比例差异)
x = minLoc[0] * (278.4 / 360.0)

3.2.3 定位滑动按钮

之前一直使用selenium的ActionChains来操作滑块按钮,但是一直通不过,应该是jd有针对selenium有检测,后面参考了网上可以使用PyAutoGUI来控制鼠标来滑动,那就需要先定位到滑块的坐标,但是通过selenium获取的坐标还需要调整一下PyAutoGUI才能正确的定位到

WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@class="JDJRV-slide-inner JDJRV-slide-btn"]')))
slide_btn = self.driver.find_element(By.XPATH, '//*[@class="JDJRV-slide-inner JDJRV-slide-btn"]')
# TODO 网页元素位置映射到pyautogui会有一定缩放
offset_x = slide_btn.location.get('x') * 1.30
offset_y = slide_btn.location.get('y') * 1.75

3.2.4 模拟滑动

滑的时候发现上面opencv计算的移动距离还是有些偏差,还需要做些调整,而且滑动也得尽量拟人化,不然滑对了也通不过

# 直接滑到目标位置--会很难通过验证(用来调试移动距离是否正确)
# pyautogui.moveTo(offset_x,offset_y,duration=0.1 + random.uniform(0,0.1 + random.randint(1,100) / 100))
# pyautogui.mouseDown()
# pyautogui.moveTo(offset_x + x * 1.25, offset_y, duration=0.28)
# pyautogui.mouseUp()

# TODO 根据验证码原图计算的移动距离也需要调一下缩放
x = x * 1.25

# 鼠标移动到滑块
pyautogui.moveTo(offset_x,offset_y,duration=0.1 + random.uniform(0,0.1 + random.randint(1,100) / 100))
# 按下鼠标
pyautogui.mouseDown()
offset_y += random.randint(9,19)
# 开始滑动
pyautogui.moveTo(offset_x + int(x * random.randint(15,25) / 20),offset_y,duration=0.28)
offset_y += random.randint(-9,0)
pyautogui.moveTo(offset_x + int(x * random.randint(17,23) / 20),offset_y,
                         duration=random.randint(20,31) / 100)
offset_y += random.randint(0,8)
pyautogui.moveTo(offset_x + int(x * random.randint(19,21) / 20),offset_y,
                         duration=random.randint(20,40) / 100)
offset_y += random.randint(-3,3)
pyautogui.moveTo(x + offset_x + random.randint(-3,3),offset_y,duration=0.5 + random.randint(-10,10) / 100)
offset_y += random.randint(-2,2)
pyautogui.moveTo(x + offset_x + random.randint(-2,2),offset_y,duration=0.5 + random.randint(-3,3) / 100)
# 松开鼠标
pyautogui.mouseUp()

3.2.5 后续处理

到此基本上模拟登陆就完成了,避免失败,可以加个循环,滑块未通过时继续下一张,再做一些是否登录成功的验证就欧克啦。

4. 完整代码

https://github.com/QiuMiMi/Get-jd

到此这篇关于Python + Selenium 实现模拟登录jd实例分享的文章就介绍到这了,更多相关Python + Selenium 模拟登录jd内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pandas combine_first函数处理两个数据集重叠和缺失

    pandas combine_first函数处理两个数据集重叠和缺失

    combine_first是pandas中的一个函数,它可以将两个DataFrame对象按照索引进行合并,用一个对象中的非空值填充另一个对象中的空值,这个函数非常适合处理两个数据集有部分重叠和缺失的情况,可以实现数据的补全和更新,本文介绍combine_first函数的语法及一些案例应用
    2024-01-01
  • wx.CheckBox创建复选框控件并响应鼠标点击事件

    wx.CheckBox创建复选框控件并响应鼠标点击事件

    这篇文章主要为大家详细介绍了wx.CheckBox创建复选框控件并响应鼠标点击事件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python pandas用法最全整理

    Python pandas用法最全整理

    在本篇文章里小编给大家分享的是关于Python pandas用法以及相关实例代码,需要的朋友们可以学习下。
    2019-08-08
  • Python读取xlsx数据生成图标代码实例

    Python读取xlsx数据生成图标代码实例

    这篇文章主要介绍了Python读取xlsx数据生成图标代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • python实现快速排序的示例(二分法思想)

    python实现快速排序的示例(二分法思想)

    本篇文章主要介绍了python实现快速排序的示例(二分法思想),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • python数据分析实战指南之异常值处理

    python数据分析实战指南之异常值处理

    数据预处理是明确分析目标与思路之后进行数据分析的第一步,也是整个项目中最基础、花费时间较长的工作,下面这篇文章主要给大家介绍了关于python数据分析实战指南之异常值处理的相关资料,需要的朋友可以参考下
    2022-01-01
  • Python中的线程操作模块(oncurrent)

    Python中的线程操作模块(oncurrent)

    这篇文章介绍了Python中的线程操作模块(oncurrent),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现

    TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现

    今天小编就为大家分享一篇TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • pandas实现将日期转换成timestamp

    pandas实现将日期转换成timestamp

    今天小编就为大家分享一篇pandas实现将日期转换成timestamp,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python使用timeit时间模块

    python使用timeit时间模块

    这篇文章主要介绍了python之timeit统计运行时间模块,这个技巧非常的实用,感兴趣的小伙伴可以试试
    2021-04-04

最新评论