检查滑动按钮

通过滑动按钮的class样式,确定当前是否加载完成

1568617618207

如果没有的话,会在半秒内进行重试操作。一直到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值 ,确认要移动的距离 。

1568619734471

1568619772424

拼接图片

把图片分为上下两个数组,每个小元素是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)

返回坐标处的像素值


本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论