Python selenium练习:华为保修查询
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练习:华为保修查询相关推荐
- Python+selenium 自动化-基本环境搭建,调用selenium库访问百度查询天气实例演示
Python+selenium 自动化 第一章:基本环境搭建 ① 安装 selenium 库 ② 下载对应版本的浏览器驱动 ③ 调用百度查天气演示 第一章:基本环境搭建 ① 安装 selenium 库 ...
- python selenium定位元素方法,python + selenium 练习篇 - 定位元素的方法
1.利用ID定位元素(能直接通过ID来定位的元素比较少) # coding=utf-8 from selenium import webdriver driver = webdriver.Chrome ...
- python selenium爬虫_详解基于python +Selenium的爬虫
详解基于python +Selenium的爬虫 一.背景 1. Selenium Selenium 是一个用于web应用程序自动化测试的工具,直接运行在浏览器当中,支持chrome.firefox等主 ...
- 快速搭建Python+Selenium+Sublime 自动化测试环境方法
随着业内越来越多的公司对自动化测试的大力推行,对测试人员能够使用自动化工具的要求也随之增多.为了能让更多的同事在学习selenium的初期,能够顺利的迈出第一步,即可以通过代码操作selenium d ...
- python selenium 下载文件_Python Selenium —— 文件上传、下载,其实很简单
很多selenium学习者被浏览器弹出的文件上传.下载框折磨的痛不欲生,今天博主就带你们轻松搞定上传和下载问题. 上传 上传弹框 文件上传是所有UI自动化测试都要面对的一个头疼问题,要处理这个问题,我 ...
- python+selenium+pycharm安装
在windows下安装python3.6.5 Python+Selenium安装及环境配置 - 程序员大本营 安装教的很好 下载python安装包 进入https://www.python.or ...
- Python+Selenium自动化测试——126邮箱自动登录脚本(登录首页是二维码,切入账号密码输入框)
Python+Selenium自动化测试--126邮箱自动登录脚本 版权声明:本文为博主原创文章,未经允许不得转载.https://blog.csdn.net/qiao_wan/article/det ...
- Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库...
Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...
- 百度快排探究(一),Python selenium 实现自然搜索访问目标网站
快排是现在比较火热的seo手段,快排即快速排名,相比传统的优化手段,尤其是企业站而言,快排能够快速占据排名,获取流量及客户,也是最热门的韭菜项目,可谓酸爽至极. 快排有没有用,据观察,应该是有用的,不 ...
- 使用python+selenium爬取同城旅游网机票信息
最近使用python+selenium爬取了同城旅游网机票信息 相关主要代码如下,通过模拟人为操作,拿下了这个机票列表的html代码,然后就可以使用xpath或者re等方式从中提取需要的字段信息了. ...
最新文章
- 完胜BERT!NLP预训练利器:小模型也有高精度,单个GPU就能训练
- iOS - MySQL 的安装配置
- ExtJS 表单 submit时错误处理
- Our Proof : Page Scraping : Website Data Extraction : Data Mining Analytics : Connotate.com
- Keras【Deep Learning With Python】—Keras基础
- 【spring 配置文件】spring配置文件的解析
- Matlab | Matlab从入门到放弃(16)——二维图和三维图
- Luogu4022 CTSC2012 熟悉的文章 广义SAM、二分答案、单调队列
- iptables 手册
- iis php mysql 集成_如何在IIS上集成php(iis+mysql+php+zend)
- 4 linux编辑器
- Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题
- 哪所985计算机专业招文科,4张表看透36所985大学自主招生专业
- cache 的设计与实现
- 阿里云国际版虚拟主机上设置网站和域名教程
- 轻松理解java前期绑定(静态绑定)与后期绑定(动态绑定) 的区别。
- 团队展示网页 HTML模版
- 腾讯太极文生图大模型,带你一起感受祖国大好河山
- dos命令批量修改图片名称
- 【MVC、Spring MVC介绍、区别、执行流程】
热门文章
- u盘插上显示计算机限制,U盘插到电脑上不显示图标的解决方法(以金士顿8GU盘为例)...
- 【科研人应该知道的网站】查阅文献+学习+代码+开发+其他——研究生必备学习网站,研究生应该知道的学习网站
- 智能人物画像综合分析系统——Day3
- 图像校色 白平衡调整
- pyspark groupby 后将遍历的每一行转成pandas df
- 由边际成本引发的思考
- 一张电影票引发的思考,谈谈边际成本和机会成本
- 2013 腾讯实习生招聘 武汉 一面
- B - Relatively Prime Graph -CodeForces - 1009D-csdn博客
- windows server 2012设置桌面图标