翼度科技»论坛 编程开发 python 查看内容

一个完整Python实战项目:selenium识别验证码实现自动登录,自动操作浏览器

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
最近都没啥时间,很久没更新了。
今天分享一下,如何用selenium识别验证码,实现自动登录以及获取数据。
目标:某东
话不多说直接开始
准备工作

环境

  • Python 3.10
  • Pycharm
模块使用

  • import random
  • import time
  • from selenium import webdriver
  • import pyautogui
  • import base64
  • import ddddocr
  • import csv
win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安装速度比较慢, 你可以切换国内镜像源)
selenium: 自动化测试模块,模拟人的行为去操作浏览器 (获取网页相关数据内容)
正常浏览网站流程

  • 打开浏览器 访问网站
  • 输入商品名称, 回车/点击搜索
  • 输入账号密码
  • 浏览器商品数据信息 (第一页)
  • 继续浏览下一页
浏览器

  • webdriver.Chrome() # 谷歌
  • webdriver.Edge() # Edge
  • webdriver.Firefox() # 火狐
建议大家用谷歌
打开浏览器可能会出现问题

  • 报错大概率原因是因为浏览器驱动问题
    - 驱动路径
    I. 当你驱动文件和你代码放在一起 / 你驱动文件在python目录下面 (可以不用写路径)
    II. 给驱动文件路径
    - 驱动版本
    浏览器可能自动更新 --> 驱动文件版本也要更新
    大版本一样, 小版本最相近的即可
  • 打开浏览器之后闪退
    原因: 你的selenium版本是4.0的 需要加阻塞
    运行完成程序之后, 自动结束程序…
代码展示

获取数据部分

selenium自动操作浏览器
  1. # 打开浏览器
  2. driver = webdriver.Chrome() # 谷歌
  3. # 最大化浏览器窗口
  4. driver.maximize_window()
  5. # 访问网站
  6. driver.get('https://www.jd.com/')
复制代码
 
输入商品名称, 回车/点击搜索按钮
通过元素定位, 找到搜索框/输入框, 然后输入内容
  1. driver.find_element_by_id() 按 ID 查找元素
  2. driver.find_element_by_class_name() 按类名查找元素
  3. driver.find_element_by_css_selector() 通过 CSS 选择器查找元素
  4. driver.find_element_by_xpath() 通过 XPath 查找元素
  5. driver.find_element_by_id('key').send_keys('口红') # 输入关键字
  6. driver.find_element_by_class_name('button').click() # 点击搜索按钮
  7. # 设置等待元素加载
  8. driver.implicitly_wait(10)
  9. # 文章不理解的话,我还专门录制了视频讲解
  10. # 和源码一起打包好了,都放在这个抠裙了:708525271
复制代码
 
输入账号密码, 登陆
  1. driver.find_element_by_id('loginname').send_keys(account) # 输入账号
  2. driver.find_element_by_id('nloginpwd').send_keys(password) # 输入密码
  3. driver.find_element_by_id('loginsubmit').click() # 点击登陆
复制代码
 
获取商品的数据信息
找到商品数据对应标签位置

  • find_element 定位获取一个
  • find_elements 定位获取多个
执行页面滚动的操作
  1. def drop_down():
  2.     """执行页面滚动的操作"""  # javascript
  3.     for x in range(1, 12, 2):# 1 3 5 7 9  在你不断的下拉过程中, 页面高度也会变的
  4.         time.sleep(1)
  5.         j = x / 9  # 1/9  3/9  5/9  9/9
  6.         # document.documentElement.scrollTop  指定滚动条的位置
  7.         # document.documentElement.scrollHeight 获取浏览器页面的最大高度
  8.         js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
  9.         driver.execute_script(js)
  10. #设置等待元素加载过程
  11. driver.implicitly_wait(10)
  12. #下滑网页页面操作 通过selenium执行JS代码
  13. drop_down()
  14. # 返回列表
  15. lis = driver.find_elements_by_class_name('gl-item')
  16. # for循环遍历, 提取列表里面元素
  17. for li in lis:
  18.     title = li.find_element_by_css_selector('.p-name em').text
  19.     price = li.find_element_by_css_selector('.p-price strong i').text
  20.     commit = li.find_element_by_css_selector('.p-commit strong a').text
  21.     shop = li.find_element_by_css_selector('.p-shop span a').text
  22.     dit = {
  23.         '标题': title,
  24.         '价格': price,
  25.         '评价': commit,
  26.         '店铺': shop,
  27.     }
  28.     print(dit)
复制代码
 
验证码识别

模块
  1. from selenium import webdriver
  2. import base64
  3. import time
  4. import ddddocr
  5. import pyautogui
  6. import random
  7. from password import account, password
复制代码
 
模拟登录
  1. driver = webdriver.Edge(r'D:\自游\京东商品\msedgedriver.exe')driver.get('https://passport.jd.com/new/login.aspx')driver.maximize_window()driver.find_element_by_id('loginname').send_keys(account) # 输入账号
  2. driver.find_element_by_id('nloginpwd').send_keys(password) # 输入密码
  3. driver.find_element_by_id('loginsubmit').click() # 点击登陆time.sleep(1)
复制代码
 
获取验证码图片
  1. # 滑块
  2. img_base6_1 = driver.find_element_by_css_selector('.JDJRV-smallimg img').get_attribute('src').split(',')[-1]
  3. # 缺口
  4. img_base6_2 = driver.find_element_by_css_selector('.JDJRV-bigimg img').get_attribute('src').split(',')[-1]
  5. img_content_1 = base64.b64decode(img_base6_1)
  6. with open('yzm_1.png', mode='wb') as f:
  7.     f.write(img_content_1)
  8. img_content_2 = base64.b64decode(img_base6_2)
  9. with open('yzm_2.png', mode='wb') as f:
  10.     f.write(img_content_2)
复制代码
 
识别验证码 滑块到缺口距离
  1. det = ddddocr.DdddOcr(det=False, ocr=False)
  2. res = det.slide_match(img_content_1, img_content_2, simple_target=True)
  3. target = res['target'][0] * 0.67
复制代码
 
滑动滑块识别验证
  1. pyautogui.click(x=1502, y=482, button='left') # 按住鼠标
  2. pyautogui.dragTo(x=1502+target, y=482, duration=1.5)
  3. print(res)
  4. # 代码自取扣裙 708525271
复制代码
 
文章不理解的话,我还专门录制了视频讲解,和源码一起打包好了,上方自取

 

今天的分享就到这里,溜了溜了~

来源:https://www.cnblogs.com/hahaa/p/17930808.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具