養成好習慣:文中文末小廣告幫忙點一點python
目錄
推薦web
1、小小課堂chrome
2、模擬勻加速和勻減速微信
3、分析登陸頁面app
3.1 分析網頁結構ide
3.2 代碼實現工具
3.3 登陸過程測試學習
4、完整代碼測試
1、小小課堂ui
步驟:
(1)計算滑動距離
(2)模擬人滑動(整體思路是先快再慢)
下面咱們先來看下豆瓣登陸界面
這個時候咱們經過輸錯密碼的方法,使其出現驗證碼。
多滑動和刷新幾回,發現一些規律,y軸不變,x軸在變化,豆瓣這個滑動驗證碼,x軸距離大概207左右,若是須要精確測量,須要使用像素對比。
接來下經過selenium找到滑塊,移動就好了,可是有一個問題,若是直接(x1,y1)移動到(x2,y2),至關於瞬移的效果,時間很是短,可能會被對方檢測到。
接下來須要使用模擬真實人的點擊滑動軌跡,通常是先加速再加速,假設是勻加速和勻減速。
滑動以後,若是不經過,能夠刷新按鈕,再進行滑動,直到經過(由於經過後通常頁面開始跳轉title不一樣或找其餘的對比找到不一樣)
2、模擬勻加速和勻減速
代碼實現:
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))
下面咱們來看下運行結果:
咱們能夠看到已經完成了模擬勻加速與勻減速的操做。
3、分析登陸頁面
首先經過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)
# 切換iframedriver.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 登陸過程測試
4、完整代碼
# encoding: utf-8import requestsimport timefrom selenium import webdriverfrom 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/
本文分享自微信公衆號 - Python爬蟲數據分析挖掘(zyzx3344)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。