检查滑动按钮
通过滑动按钮的class样式,确定当前是否加载完成
如果没有的话,会在半秒内进行重试操作。一直到30s超时为止。
while True:
try :
driver.get('http://www.cnbaowen.net/api/geetest/')
element = WebDriverWait(driver, 30, 0.5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'gt_slider_knob')))
if element:
return element
except TimeoutException as e:
print('超时错误,继续')
time.sleep(5)
图片
对以下两个图片进行拼接,通过对比rgb值 ,确认要移动的距离 。
拼接图片
把图片分为上下两个数组,每个小元素是10,然后创建一个新的图片,把上下两部分图片接位移顺序持贝进去。
def get_merge_img(img_content,location_list,num):
'''
拼接图片
:param img_content:
:param location_list:
:param num:
:return:
'''
im = Image.open(img_content) #打开图片
im_list_upper = [] #定义验证码的上方图片数组
im_list_done = [] #定义验证码的下方图片数组
for location in location_list: #循环图片像素数据
# print(location)
if int(location['y']) == -58: #第一行,图片上方,图片取范围是x,58,x+10,116 左上右下
im_list_upper.append(im.crop((abs(int(location['x'])),58,abs(int(location['x']))+10,116)))
if int(location['y']) == 0:
im_list_done.append(im.crop((abs(int(location['x'])),0,abs(int(location['x']))+10,58)))
#create new image
new_im = Image.new('RGB',(260,116)) #创建图片大小
x_offset=0
for im in im_list_upper:
new_im.paste(im,(x_offset,0)) #在新的图片中,把小图片一个一个拷入,拷上方
x_offset +=10
x_offset = 0
for im in im_list_done:
new_im.paste(im, (x_offset, 58)) #拷下方
x_offset += 10
return new_im
判断图片是否不同
获取坐标片的像素值,然后通过rbg三原色去比较,如果两个值大于50,则表示 这里不一样,返回false ,则记录为false情况下的坐标x值 。表示以后拖动图片到x这个点的坐的水平坐标就可以了。
def is_similar(image1,image2,x,y):
pixel1 = image1.getpixel((x,y))
pixel2 = image2.getpixel((x,y))
for i in range(0,3):
if abs(pixel1[i]) - pixel2[i] >=50:
return False
return True
模拟鼠标拖动轨迹
把滑块拖到上面定位取的x的坐标值处。要模拟人体工程学,人拖动鼠标时先快后慢,可能用数学上的匀加速运动来模拟。然后到最后x值片的时候,可以适当进行微调。如一个像素一个像素的移动。
要注意最后一点一点的平移。尽量算好距离进行平移。否则会一直提示被吃掉的。
def get_track(x):
'''
滑块移动轨迹
初速度 v =0
单位时间 t = 0.2
位移轨迹 tracks = []
当前位移 ccurrent = 0
:param x:
:return:
'''
v = 0
t = 0.2
tracks = []
current = 0
# mid = x*5/8#到达mid值开始减速
# x = x+10
while current < x:
# if current < mid:
# a = random.randint(1,3)
# else:
# a = -random.randint(2,4)
a = 2
v0 = v
#单位时间内位移公式
s =v0*t+0.5*a*(t**2)
#当前位移
current = current+s
tracks.append(round(s))
v = v0+a*t
for i in range(3):
tracks.append(-1)
for i in range(3):
tracks.append(-2)
return tracks
所需知识摘要
BytesIO
BytesIO实现了在内存中读写bytes
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
f.write('hello world'.encode('utf-8'))
print(f.getvalue())
=>输出结果:b'\xe4\xb8\xad\xe6\x96\x87hello world'
StringIO
在内存中读写文件
from io import StringIO
f = StringIO()
f.write('hello')
f.write('中文')
print(f.getvalue())
=》输出:hello中文
Image.crop
region = im.crop(100, 100, 400, 400)
表示为坐标是 (left, upper, right, lower)。
Image.paste
paste()函数可以给图片添加水印,也可以叠加函数,拼接图像,做到多张图片结果的可视化
getpixel(x,y)
返回坐标处的像素值
还不快抢沙发