??大家好,我是不溫卜火,是一名計算機學院大資料專業大三的學生,昵稱來源于成語—
不溫不火,本意是希望自己性情溫和,作為一名互聯網行業的小白,博主寫博客一方面是為了記錄自己的學習程序,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新,但由于水平有限,博客中難免會有一些錯誤出現,有紕漏之處懇請各位大佬不吝賜教!暫時只在csdn這一個平臺進行更新,博客主頁:https://buwenbuhuo.blog.csdn.net/,
PS:由于現在越來越多的人未經本人同意直接爬取博主本人文章,博主在此特別宣告:未經本人允許,禁止轉載!!!
目錄
- 推薦
- 一、小小課堂
- 二、模擬勻加速和勻減速
- 三、分析登錄頁面
- 3.1 分析網頁結構
- 3.2 代碼實作
- 3.3 登錄程序測驗
- 四、完整代碼

推薦

???各位如果想要交流的話,可以加下QQ交流群:974178910,里面有各種你想要的學習資料,?
???歡迎大家關注公眾號【不溫卜火】,關注公眾號即可以提前閱讀又可以獲取各種干貨哦,同時公眾號每滿1024及1024倍數則會抽獎贈送機械鍵盤一份+IT書籍1份喲~?

一、小小課堂
在上篇博文中已經完成了破解文字驗證碼,接下來我們完成滑動驗證碼,在此以豆瓣登錄驗證為例,

滑塊驗證的步驟,其實上一篇博文已經講解了,不知道各位同學有沒有印象,如果沒有也沒有關系,下面博主會在此寫出步驟:
步驟:
(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
'''
@author 李華鑫
@create 2020-10-10 14:41
Mycsdn:https://buwenbuhuo.blog.csdn.net/
@contact: 459804692@qq.com
@software: Pycharm
@file: 豆瓣登錄.py
@Version:1.0
'''
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()

美好的日子總是短暫的,雖然還想繼續與大家暢談,但是本篇博文到此已經結束了,如果還嫌不夠過癮,不用擔心,我們下篇見!

??好書不厭讀百回,熟讀課思子自知,而我想要成為全場最靚的仔,就必須堅持通過學習來獲取更多知識,用知識改變命運,用博客見證成長,用行動證明我在努力,
??如果我的博客對你有幫助、如果你喜歡我的博客內容,請“點贊” “評論”“收藏”一鍵三連哦!聽說點贊的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看,
??碼字不易,大家的支持就是我堅持下去的動力,點贊后不要忘了關注我哦!


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/212561.html
標籤:java
上一篇:小說瓦爾登湖單詞詞頻統計
下一篇:網路編程匯總

