爬虫之滑块一

一.使用的模块:

1.selenium
2.PIL

二.使用的技术:

没有做任何反模拟滑动的技术

三.代码:

# -*-coding:utf-8-*-
import time
import random
from PIL import Image
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains


class BiLi:
    longin_url = ''
    username = ""
    password = ""

    def __init__(self):
        chrom_options = Options()
        # chrom_options.add_argument("--disable-extensions")
        self.browser = webdriver.Chrome(executable_path="./chromedriver.exe", options=chrom_options)

    def crop_imge(self, image_file_name):
        # 截取验证码图片
        time.sleep(2)
        img = self.browser.find_element_by_css_selector(".geetest_canvas_img.geetest_absolute")
        location = img.location
        print("图片的位置: ", location)
        size = img.size

        top, buttom, left, right = location["y"], location["y"] + size["height"], location["x"], location["x"] + size[
            "width"]
        print("验证码截图坐标: ", left, top, buttom, right)
        screen_shot = self.browser.get_screenshot_as_png()
        screen_shot = Image.open(BytesIO(screen_shot))
        # captcha = screen_shot.crop((int(left * 1.5), int(top * 1.5), int(right * 1.5), int(buttom * 1.5)))
        captcha = screen_shot.crop((int(left ), int(top ), int(right ), int(buttom )))
        captcha.save(image_file_name)
        return captcha

    def check_login(self):
        try:
            self.browser.find_element_by_xpath('//span[contains(text(), "创作中心")]')
            return True
        except Exception as e:
            return False

    def login(self):
        try:
            self.browser.maximize_window()  # 将窗口最大化
            # time.sleep(3)
            # self.browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            # self.browser.execute_script("document.body.style.zoom='67%';")
            # self.browser.set_window_size(1920, 1080)
        except Exception as e:
            print("d")
            pass

        while not self.check_login():
            self.browser.get(self.longin_url)
            username = self.browser.find_element_by_xpath('//input[@id="login-username"]').send_keys(self.username)
            password = self.browser.find_element_by_xpath('//input[@id="login-passwd"]').send_keys(self.password)
            submit = self.browser.find_element_by_xpath('//a[@class="btn btn-login"]').click()
            # 等待验证码出现
            time.sleep(5)
            # 执行js改变css样式,显示没有缺口的图!
            self.browser.execute_script('document.querySelectorAll("canvas")[3].style=""')
            # 截取验证码
            image1 = self.crop_imge("captcha1.png")
            # 执行js改变css样式,显示有缺口的图片,

            self.browser.execute_script('document.querySelectorAll("canvas")[3].style="display: none;"')
            iamge2 = self.crop_imge("captcha2.png")
            # self.browser.close()
            # 两张图片的对比
            img1 = Image.open("captcha1.png")
            img2 = Image.open(("captcha2.png"))
            left = 60
            has_find = False
            for i in range(60, img1.size[0]):
                if has_find:
                    break
                for j in range(img1.size[1]):
                    if not self.compare_pixel(img1, img2, i, j):
                        left = i
                        has_find = True
                        break
            left -= 9
            print(left)
            # left /= 1.5
            # 拖动图片
            # 根据偏移量获取轨迹
            # 一开始加速,然后匀速,生成曲线,且加上点随机变动
            track = []
            # 当前的位移
            current = 0
            # 减速的阀门
            mid = left * 3 / 4
            # 时间间隔
            t = 1
            v = 0
            while current < left:
                if current < mid:
                    a = random.randint(2, 3)
                else:
                    a = - random.randint(6, 7)
                v0 = v
                # 当前的速度
                v = v0 + a * t
                # 移动的距离
                s = v0 * t + 1 / 2 * a * t * t
                # 当前的距离
                current += s
                track.append(round(s))
            slider = self.browser.find_element_by_css_selector(".geetest_slider_button")
            # ActionChains:作用是做一系列的动作
            ActionChains(self.browser).click_and_hold(slider).perform()  # 点击不动
            for x in track:
                ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()  # 移动
            time.sleep(0.5)
            ActionChains(self.browser).release().perform()  # 松开鼠标
            time.sleep(3)

    def compare_pixel(self, img1, img2, x, y):
        pixel1 = img1.load()[x, y]
        pixel2 = img2.load()[x, y]
        threshold = 60
        for i in range(len(pixel1)):
            if abs(pixel1[i] - pixel2[i]) >  threshold:
                return False
        return True


if __name__ == '__main__':
    bili = BiLi()
    bili.login()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值