0.前言

好久没写 Python 了,正好有小伙伴有个批量查询保修期得需求,就练习一下:

查询地址:https://consumer.huawei.com/cn/support/warranty-query/

需求就是根据序列号查询到对应的保修截止日期。个人感觉用 selenium 来做更简单点,然后验证码使用的 pytesseract 来识别。

1.准备工作

A:selenium 库及谷歌浏览器、谷歌浏览器驱动

驱动注意要下载浏览器对应版本的,可以从镜像下载:https://npm.taobao.org/mirrors/chromedriver/

环境配置参考:https://blog.csdn.net/Q0717168/article/details/109839985

不过设置环境变量不是必须的,只要能找到这个路径就行。

B:PIL 库和 opencv 库

直接 pip 安装 pillow 和 pyopencv,因为百度验证码识别的时候别人用的这个。

C:pytesseract 库和 tesseract-OCR 软件

主要是识别图片中的文本,opencv 降噪滤波等处理后图像传入 ocr 进行识别,虽然识别率不高,但是多测试几张图总能识别到正确的。注意 tesseract-OCR 软件装最新版本的效果好点(我装的 5.0-20210811)。

pytesseract 配置:https://www.jianshu.com/p/2db541800418

tesseract-ORC 下载:https://digi.bib.uni-mannheim.de/tesseract/

2.代码分享

我的思路是逐个验证码进行查询,每次先 get 查询页面,填上序列号,然后单独请求验证码图片(好在这个图片单独请求不会变内容),拿到验证码图片后使用 opencv 进行预处理,过滤掉验证码图片上的干扰信息,处理完传给 tesseract 进行识别,填上识别得验证码,点击查询。如果验证码错了就刷新查询页面重新识别验证码,如果查询到结果就保存当前的查询结果。

验证码识别参考(转载):https://blog.csdn.net/wade1203/article/details/108786481

待优化:

A.加上 IP 代理池

B.没对异常的序列号进行处理,可能造成死循环一直查询该错误的序列号

测试结果(可以看到有时候会试错很多次验证码):

git 链接:https://github.com/gongjianbo/MyTestCode/tree/master/Py/HuaweiQuery

源码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import requests
from PIL import Image
import cv2 as cv
import pytesseract
import json
import time
import re#selenium + chromedriver安装和配置:https://blog.csdn.net/wade1203/article/details/108786481
#Pytesseract安装参考:https://www.jianshu.com/p/2db541800418
#验证码识别参考:https://blog.csdn.net/wade1203/article/details/108786481#识别验证码def img_ocr(path):#path = 'temp.jpg'image = cv.imread(path)#cv.imshow('raw', image)# 边缘保留滤波  去噪blur = cv.pyrMeanShiftFiltering(image, sp=8, sr=60)#cv.imshow('dst', blur)# 灰度图像gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)# 二值化ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU)#print(f'二值化自适应阈值:{ret}')#cv.imshow('binary', binary)# 形态学操作  获取结构元素  开操作kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 2))bin1 = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)#cv.imshow('bin1', bin1)kernel = cv.getStructuringElement(cv.MORPH_OPEN, (2, 3))bin2 = cv.morphologyEx(bin1, cv.MORPH_OPEN, kernel)#cv.imshow('bin2', bin2)# 逻辑运算  让背景为白色  字体为黑  便于识别cv.bitwise_not(bin2, bin2)#cv.imshow('binary-image', bin2)# 识别test_message = Image.fromarray(bin2)text = pytesseract.image_to_string(test_message, lang='eng', config='--psm 6')# 去掉非字母new_crazy = filter(str.isalpha, text)text = ''.join(list(new_crazy))print('验证码:', text)#cv.waitKey(0)#cv.destroyAllWindows()return text#检测请求结果,判断验证码是否异常class result_check():def __init__(self):passdef __call__(self, driver):try:el = driver.find_element_by_xpath(('//div[@class="end-warrantly-date"]/span[@class="in-span-value"]'))#print('ret', el.text)return elexcept:try:el = driver.find_element_by_xpath(('//li[@class="wic-identify"]/span[@style="display: inline-block;"]'))#print('warn', el.text)return elexcept:return Falsereturn False#读取验证码列表文件def read_snfile(path):ret = []with open(path, 'r', encoding='utf8') as f:for line in f.readlines():linestr = line.strip()ret.append(linestr)return ret#写爬取结果def write_datefile(path, text, clear):flag = 'w+' if clear else 'a+'with open(path, mode=flag, encoding='utf8') as f:f.write(text+'\n')base_url = 'https://consumer.huawei.com/cn/support/warranty-query/'#爬取def test():browser = webdriver.Chrome(r'C:\Users\1992\AppData\Local\Google\Chrome\Application\chromedriver.exe')wait = WebDriverWait(browser, 20)  # 设置几秒超时时间wait_result = WebDriverWait(browser, 10)  # 设置几秒超时时间#sn_arr = [#    "2155030979TV11041409",#    "11111111"#]sn_arr = read_snfile('sn_list.txt')if len(sn_arr) < 1:print('sn list is empty')returnprint('sn count=', len(sn_arr))sn_index = 0flag = True#顺序遍历每个序列号while flag:sn = sn_arr[sn_index]try:browser.get(base_url)print('\n序列号:', sn)#序列号输入input_sn = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@class="s-input ip"]')))input_sn.clear()input_sn.send_keys(sn)#验证码图片img_code = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="fr wiw-img"]/img')))img_response = requests.get(img_code.get_attribute('src'))img = img_response.contentwith open('temp.jpg', 'wb') as f:f.write(img)code = img_ocr('temp.jpg')if len(code) != 4:raise Exception('code len error')#验证码输入input_code = wait.until(EC.presence_of_element_located((By.XPATH, '//input[@class="s-input ip01 ga-page-view"]')))input_code.clear()input_code.send_keys(code)#查询按钮btn_query = wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="s-btn"]')))btn_query.click()#获取查询结果#span_value = wait_result.until(EC.presence_of_element_located(#    (By.XPATH, '//div[@class="end-warrantly-date"]/span[@class="in-span-value"]'))span_value = wait_result.until(result_check())if span_value.text.find('验证码') != -1 or len(span_value.text) < 1:raise Exception('code text error')print('保修截至日期:', span_value.text)write_datefile('date_list.txt', sn_arr[sn_index]+':'+span_value.text, bool(sn_index == 0))except TimeoutException:print('test timeout')except Exception as e:print('test exception:', e)else:sn_index += 1#当前进度print('test success', sn_index, '/', len(sn_arr))if sn_index >= len(sn_arr):#执行结束flag = Falsetime.sleep(5)finally:print('test final')#close只会关闭当前页面,quit会退出驱动并且关闭所关联的所有窗口,最后执行完以后就关闭。browser.quit()print('test browser quit')if __name__ == "__main__":test()

Python selenium练习:华为保修查询相关推荐

  1. Python+selenium 自动化-基本环境搭建,调用selenium库访问百度查询天气实例演示

    Python+selenium 自动化 第一章:基本环境搭建 ① 安装 selenium 库 ② 下载对应版本的浏览器驱动 ③ 调用百度查天气演示 第一章:基本环境搭建 ① 安装 selenium 库 ...

  2. python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法

    1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...

  3. python selenium爬虫_详解基于python +Selenium的爬虫

    详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...

  4. 快速搭建Python+Selenium+Sublime 自动化测试环境方法

    随着业内越来越多的公司对自动化测试的大力推行,对测试人员能够使用自动化工具的要求也随之增多.为了能让更多的同事在学习selenium的初期,能够顺利的迈出第一步,即可以通过代码操作selenium d ...

  5. python selenium 下载文件_Python Selenium —— 文件上传、下载,其实很简单

    很多selenium学习者被浏览器弹出的文件上传.下载框折磨的痛不欲生,今天博主就带你们轻松搞定上传和下载问题. 上传 上传弹框 文件上传是所有UI自动化测试都要面对的一个头疼问题,要处理这个问题,我 ...

  6. python+selenium+pycharm安装

    在windows下安装python3.6.5 Python+Selenium安装及环境配置 - 程序员大本营    安装教的很好 下载python安装包 进入https://www.python.or ...

  7. Python+Selenium自动化测试——126邮箱自动登录脚本(登录首页是二维码,切入账号密码输入框)

    Python+Selenium自动化测试--126邮箱自动登录脚本 版权声明:本文为博主原创文章,未经允许不得转载.https://blog.csdn.net/qiao_wan/article/det ...

  8. Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库...

    Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...

  9. 百度快排探究(一),Python selenium 实现自然搜索访问目标网站

    快排是现在比较火热的seo手段,快排即快速排名,相比传统的优化手段,尤其是企业站而言,快排能够快速占据排名,获取流量及客户,也是最热门的韭菜项目,可谓酸爽至极. 快排有没有用,据观察,应该是有用的,不 ...

  10. 使用python+selenium爬取同城旅游网机票信息

    最近使用python+selenium爬取了同城旅游网机票信息 相关主要代码如下,通过模拟人为操作,拿下了这个机票列表的html代码,然后就可以使用xpath或者re等方式从中提取需要的字段信息了. ...

最新文章

  1. 完胜BERT!NLP预训练利器:小模型也有高精度,单个GPU就能训练
  2. iOS - MySQL 的安装配置
  3. ExtJS 表单 submit时错误处理
  4. Our Proof : Page Scraping : Website Data Extraction : Data Mining Analytics : Connotate.com
  5. Keras【Deep Learning With Python】—Keras基础
  6. 【spring 配置文件】spring配置文件的解析
  7. Matlab | Matlab从入门到放弃(16)——二维图和三维图
  8. Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列
  9. iptables 手册
  10. iis php mysql 集成_如何在IIS上集成php(iis+mysql+php+zend)
  11. 4 linux编辑器
  12. Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题
  13. 哪所985计算机专业招文科,4张表看透36所985大学自主招生专业
  14. cache 的设计与实现
  15. 阿里云国际版虚拟主机上设置网站和域名教程
  16. 轻松理解java前期绑定(静态绑定)与后期绑定(动态绑定) 的区别。
  17. 团队展示网页 HTML模版
  18. 腾讯太极文生图大模型,带你一起感受祖国大好河山
  19. dos命令批量修改图片名称
  20. 【MVC、Spring MVC介绍、区别、执行流程】

热门文章

  1. u盘插上显示计算机限制,U盘插到电脑上不显示图标的解决方法(以金士顿8GU盘为例)...
  2. 【科研人应该知道的网站】查阅文献+学习+代码+开发+其他——研究生必备学习网站,研究生应该知道的学习网站
  3. 智能人物画像综合分析系统——Day3
  4. 图像校色 白平衡调整
  5. pyspark groupby 后将遍历的每一行转成pandas df
  6. 由边际成本引发的思考
  7. 一张电影票引发的思考,谈谈边际成本和机会成本
  8. 2013 腾讯实习生招聘 武汉 一面
  9. B - Relatively Prime Graph -CodeForces - 1009D-csdn博客
  10. windows server 2012设置桌面图标