養成好習慣:文中文末小廣告幫忙點一點
目錄
推薦
一、小小課堂
二、模擬勻加速和勻減速
三、分析登錄頁面
-
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/