项目滑动模块代码

import time,random
from PIL import Image
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取图片
from selenium.webdriver.support.wait import WebDriverWait


def get_captcha():
    # 隐藏滑块图片
    js_hide_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display="none"'
    driver.execute_script(js_hide_slice)
    # 截取背景图片
    bg_path = './bg.png'
    driver.find_element_by_class_name("geetest_canvas_bg").screenshot(bg_path)
    # 显示滑块隐藏背景图
    js_display_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display="block"'
    js_hide_bg = 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display="none"'
    driver.execute_script(js_display_slice + ";"+ js_hide_bg)
    # 截取滑块图片
    slice_path = './slice.png'
    driver.find_element_by_class_name("geetest_canvas_slice").screenshot(slice_path)
    # 显示完整图片
    js_display_full = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block"'
    driver.execute_script(js_display_full)
    # 截取完整图片
    full_path = './full.png'
    driver.find_element_by_class_name("geetest_canvas_fullbg").screenshot(full_path)

    # 还原所有的样式
    js_slice = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.display=""'
    js_bg = 'document.getElementsByClassName("geetest_canvas_bg")[0].style.display=""'
    js_full = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="none"'
    driver.execute_script(js_slice+";"+js_bg+";"+js_full)

    return bg_path, slice_path, full_path

# 滑块x坐标
def get_slice_x(img_slice):
    img = Image.open(img_slice)
    w, h = img.size
    for x in range(w):
        for y in range(h):
            rgb = img.getpixel((x, y))
            if rgb[0] + rgb[1] + rgb[2] < 570:
                print("滑块坐标", x)
                return x

# 缺口x坐标
def get_bg_x(img_bg, img_full):
    bg = Image.open(img_bg)
    full = Image.open(img_full)
    w,h = bg.size
    for x in range(w):
        for y in range(h):
            bg_point = bg.getpixel((x, y))
            full_point = full.getpixel((x, y))
            r = bg_point[0] -full_point[0]
            g = bg_point[1] - full_point[1]
            b = bg_point[2] - full_point[2]
            abs_value = abs(r)+abs(g)+abs(b)
            if abs_value >180:
                print("缺口坐标", x)
                return x

# 计算距离
def get_distance(img_slice, img_bg, img_full):
    slice_x = get_slice_x(img_slice)
    bg_x = get_bg_x(img_bg, img_full)
    print("距离计算", abs(slice_x-bg_x))
    return abs(slice_x-bg_x)


# 模拟人工移动
def get_track(distance):
    v = 0 # 初速度
    tracks = [] # 运动轨迹

    current = 0 # 当前的距离
    mid = distance * 5/8
    distance += 10
    while current < distance:
        t = random.randint(1, 4)/10
        if current < mid:
            a = random.randint(1, 3)
        else:
            a = -random.randint(2,4)
        v0 = v
        # 位移和时间的关系
        s = v0*t + 0.5 * a * t**2
        # 当前的位置
        current += abs(s)
        # 记录位移量
        tracks.append(round(s))
        v= v0 + a* t
    temp=10+(current-distance)
    for i in range(4):
        num = -random.randint(2,3)
        tracks.append(num)
        temp +=num
    tracks.append(abs(temp)) if temp < 0 else tracks.append(-temp)

    return tracks
# 移动滑块
def move_slider(tracks):
    element = driver.find_element(by=By.CLASS_NAME, value='geetest_slider_button')
    ActionChains(driver).click_and_hold(element).perform()
    for x in tracks:
        ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
    ActionChains(driver).release(element).perform()

if __name__ == '__main__':
    driver = webdriver.Chrome()
    url = "https://captcha1.scrape.center/"
    driver.get(url)
    time.sleep(6)
    driver.find_element(by=By.CLASS_NAME, value='el-button').click()
    time.sleep(2)
    img_bg, img_slice, img_full = get_captcha()
    time.sleep(1)
    distance = get_distance(img_slice, img_bg, img_full)

    count = 6
    while count > 0:
        tracks = get_track(distance)
        move_slider(tracks)

        locator = (By.CLASS_NAME,'geetest_panel_error_title') # 判断是否滑动成功的一个依据
        try:
            WebDriverWait(driver=driver, timeout=2, poll_frequency=0.2).until(EC.element_to_be_clickable(locator), message="") # 判断提示语是否出现,如果出现就点击下一步重试按钮
            driver.find_element_by_class_name('geetest_panel_error_content').click()
            time.sleep(2)
            # 获取缺口图,滑块图,完整图
            img_bg, img_slice, img_full = get_captcha()
            # 获取距离
            distance = get_distance(img_slice, img_bg, img_full)
            print(distance)
            time.sleep(1)
            count -= 1
            continue
        except Exception as e:
            pass

        locator = (By.XPATH,'//div[@class="geetest_wrap"]')
        try:
            WebDriverWait(driver=driver, timeout=2, poll_frequency=0.2).until_not(EC.visibility_of_element_located(locator),
                                                                              message="")  # 判断  如果这个可见然后取反 就是不可见,验证码不可见,就证明已经成功了
            print("校验成功了")
            time.sleep(3)
            break
        except TimeoutException as e:
            count -= 1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫登录https://captcha8.scrape.center/的过程可以分为以下几个步骤: 1. 首先需要分析登录页面的HTML代码,找到用户名和密码的输入框以及登录按钮的位置。 2. 使用requests库向登录页面发送POST请求,将用户名和密码作为参数传递给服务器。 3. 服务器会验证用户名和密码的正确性,如果验证通过,会返回一个包含登录凭证的响应。 4. 使用登录凭证向目标页面发送请求,获取需要的数据。 在具体实现中,需要注意以下几点: 1. 需要使用session对象来保持登录状态,否则每次请求都需要重新登录。 2. 需要处理验证码,可以使用第三方库或手动输入验证码的方式。 3. 需要处理登录失败的情况,例如用户名或密码错误等。 以下是一个简单的爬虫登录https://captcha8.scrape.center/的示例代码: ```python import requests def login(): # 创建session对象 session = requests.Session() # 构造登录请求参数 data = { 'username': 'your_username', 'password': 'your_password', 'captcha': 'your_captcha' } # 发送登录请求 response = session.post('https://captcha8.scrape.center/login', data=data) # 检查登录是否成功 if response.status_code == 200 and 'Welcome' in response.text: print('登录成功!') else: print('登录失败!') # 使用登录凭证向目标页面发送请求 response = session.get('https://captcha8.scrape.center/dashboard') print(response.text) if __name__ == '__main__': login() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值