識別豆瓣登錄滑動驗證碼(附源碼)


養成好習慣:文中文末小廣告幫忙點一點

目錄

  • 推薦

  • 一、小小課堂

  • 二、模擬勻加速和勻減速

  • 三、分析登錄頁面

    • 3.1 分析網頁結構

    • 3.2 代碼實現

    • 3.3 登錄過程測試

  • 四、完整代碼

一、小小課堂

步驟:
(1)計算滑動距離
(2)模擬人滑動(總體思路是先快再慢)

下面我們先來看下豆瓣登錄界面

這個時候我們通過輸錯密碼的方法,使其出現驗證碼。

多滑動和刷新幾次,發現一些規律,y軸不變,x軸在變化,豆瓣這個滑動驗證碼,x軸距離大概207左右,如果需要精確測量,需要使用像素對比。

接來下通過selenium找到滑塊,移動就行了,但是有一個問題,如果直接(x1,y1)移動到(x2,y2),相當於瞬移的效果,時間非常短,可能會被對方檢測到。

接下來需要使用模擬真實人的點擊滑動軌跡,一般是先加速再加速,假設是勻加速和勻減速。
滑動之后,如果不通過,可以刷新按鈕,再進行滑動,直到通過(因為通過后一般頁面開始跳轉title不同或找其他的對比找到不同)

二、模擬勻加速和勻減速

代碼實現:

def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    將distance分割成小段的距離
    :param distance: 總距離
    :param rate: 加速減速的臨界比例
    :param a1: 加速度
    :param a2: 減速度
    :param t: 單位時間
    :param t: 初始速度
    :return: 小段的距離集合
    """
    tracks = []
    # 加速減速的臨界值
    mid = rate * distance
    # 當前位移
    s = 0
    # 循環
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 計算當前t時間段走的距離
        s0 = v0 * t + 0.5 * a * t * t
        # 計算當前速度
        v = v0 + a * t
        # 四舍五入距離,因為像素沒有小數
        tracks.append(round(s0))
        # 計算當前距離
        s += s0


    return tracks


if __name__ == '__main__':
    tracks = get_tracks(100)
    print(tracks)
    print(sum(tracks))


下面我們來看下運行結果:

我們可以看到已經完成了模擬勻加速與勻減速的操作。

三、分析登錄頁面


首先通過URL,我們找到了https://accounts.douban.com/passport/login

打開之后的頁面如下:

下面我們先來看下正常人是怎樣登錄豆瓣的。

????,下面我們就開始分析頁面,通過selenium完成這些操作。

3.1 分析網頁結構

1. 密碼登錄

//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]

2.用戶賬號

 3.用戶密碼

4. 登錄豆瓣

 5. 找到滑塊

刷新按鈕

分析完成,下面就開始代碼實現了

3.2 代碼實現

url = "https://accounts.douban.com/passport/login"
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
driver.get(url)
print("當前的title:",driver.title)


driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
driver.find_element_by_xpath('//*[@id="username"]').send_keys("賬號")
driver.find_element_by_xpath('//*[@id="password"]').send_keys("密碼")
driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
# 停一下,等待出現
time.sleep(2)


# 切換iframe
driver.switch_to.frame(1)
block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
reload = driver.find_element_by_xpath('//*[@id="reload"]')


# 滑動操作時需要動作鏈
# 摁下滑塊
ActionChains(driver).click_and_hold(block).perform()
# 移動
ActionChains(driver).move_by_offset(180, 0).perform()
# 獲取位移
tracks = get_tracks(30)
# 循環
for track in tracks:
    # 移動
    ActionChains(driver).move_by_offset(track, 0).perform()
# 釋放
ActionChains(driver).release().perform()
# 判斷
if driver.title == "登錄豆瓣":
    print("失敗...再來一次...")
    # 單擊刷新按鈕刷新
    reload.click()
    # 停一下
    time.sleep(2)
else:
    print("成功!")


time.sleep(5)
driver.quit()


3.3 登錄過程測試

四、完整代碼

# encoding: utf-8
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains




def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    將distance分割成小段的距離
    :param distance: 總距離
    :param rate: 加速減速的臨界比例
    :param a1: 加速度
    :param a2: 減速度
    :param t: 單位時間
    :param t: 初始速度
    :return: 小段的距離集合
    """
    tracks = []
    # 加速減速的臨界值
    mid = rate * distance
    # 當前位移
    s = 0
    # 循環
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 計算當前t時間段走的距離
        s0 = v0 * t + 0.5 * a * t * t
        # 計算當前速度
        v = v0 + a * t
        # 四舍五入距離,因為像素沒有小數
        tracks.append(round(s0))
        # 計算當前距離
        s += s0


    return tracks




def slide(driver):
    """滑動驗證碼"""
    # 切換iframe
    driver.switch_to.frame(1)
    #找到滑塊
    block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
    #找到刷新
    reload = driver.find_element_by_xpath('//*[@id="reload"]')
    while True:
        # 摁下滑塊
        ActionChains(driver).click_and_hold(block).perform()
        # 移動
        ActionChains(driver).move_by_offset(180, 0).perform()
        #獲取位移
        tracks = get_tracks(30)
        #循環
        for track in tracks:
            #移動
            ActionChains(driver).move_by_offset(track, 0).perform()
        # 釋放
        ActionChains(driver).release().perform()
        #停一下
        time.sleep(2)
        #判斷
        if driver.title == "登錄豆瓣":
            print("失敗...再來一次...")
            #單擊刷新按鈕刷新
            reload.click()
            # 停一下
            time.sleep(2)
        else:
            break


def main():
    """主程序"""
    url = "https://accounts.douban.com/passport/login"
    driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
    driver.get(url)
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
    driver.find_element_by_xpath('//*[@id="username"]').send_keys("賬號")
    driver.find_element_by_xpath('//*[@id="password"]').send_keys("密碼")
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
    # 停一下,等待出現
    time.sleep(2)
    #滑動驗證碼
    slide(driver)


    print("成功")
    driver.quit()




if __name__ == '__main__':
    main()


正文結束!!!!

歡迎關注公眾號:Python爬蟲數據分析挖掘,方便及時閱讀最新文章

記錄學習python的點點滴滴;

回復【開源源碼】免費獲取更多開源項目源碼;

公眾號每日更新python知識和【免費】工具;

本文已同步到【開源中國】、【騰訊雲社區】、【CSDN】;

文章源:buwenbuhuo.blog.csdn.net/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM