python+selenium 笨方法模拟登陆京东

今天和京东斗智斗勇了一天,终于还是成功了,记录下过程

验证码图片的处理

京东的验证码的完整图实际上只有10张(2019.01.26),我直接把10张图给截出来了,由于PS不过关,我是选的缺口尽量靠右下方的图,然后把滑块移动到缺口处截图。方法基本笨,但基本能行。
效果图如下
效果图

验证码原图的匹配

现在手头有10张验证码原图,在登陆验证时,需要把待滑动的图与原图匹配起来,如需要将下面的带缺口的图与上面的图匹配。
待匹配
这里参考了Pillow实现图片对比

def img_difference(img1, img2):
    """
    比较两图片差异
    :param img1: 图片1
    :param img2: 图片2名称
    :return: 差异大小
    """
    image1 = img1
    image2 = Image.open(img2)
    h1 = image1.histogram()
    h2 = image2.histogram()
    result = math.sqrt(reduce(operator.add, list(map(lambda a, b: (a - b) ** 2, h1, h2))) / len(h1))
    return result

def img_match(image):
    """
    比较两图片差异
    :param image: 带缺口图片 
    :return: 匹配到的图片名称
    """
    image_list = []
    for i in range(1, 11):
        image_list.append('jd' + str(i) + '.png') # 我将图片命名为jd1.png,jd2.png,…,jd10.png
    results = {
   }
    for img in image_list:
        results[img] = self.img_difference(image, img)
    image_match = min(results, key=lambda x: results[x])
    print(image_match)
    return image_match

大概就是先把图像转为影像直方图,计算两张图片亮度累积的像素数量的均方误差,均方误差最小的即为匹配结果。

或者直接一个函数

def img_match(self, image):
    """
    比较两图片差异
    :param image: 带缺口图片
    :return: 匹配到的图片名称
    """
    image_list = []
    for i in range(1, 11):
        image_list.append('jd' + str(i) + '.png')
    results = {
   }
    for img in image_list:
        results[img] = self.img_difference(image, img)
    image_match = min(results, key=lambda x: results[x])
    print(image_match)
    return image_match

最最最最恶心的 滑动轨迹

尝试过各种轨迹,基本都失败了,想说不然查一查别人怎么做的,发现也现在(2019.01.26)也都不能用,自己人工拖了几下,发现,把验证码拉过头停顿一会儿再往回拉,竟然都能成功!

def get_track(distance):
    """
    根据偏移量获取移动轨迹
    这里把距离加长,拉过头
    :param distance: 偏移量
    :return: 移动轨迹
    """
    # 加长距离,拉过头
    distance += 6
    # 移动轨迹
    track = []
    # 当前位移
    current = 0
    # 变速阈值
    if distance > 100:
        mid1 = distance * 1 / 3
        mid2 = distance * 7 / 8
    else:
        mid1 = distance * 1 / 2
        mid2 = distance * 5 / 6
    # 间隔时间
    t = 0.3
    # 初速度
    v = 3
    while current < distance:
        if current < mid1:
            a = random.uniform(3, 5)
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值