养成好习惯:文中文末小广告帮忙点一点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源创计划”,欢迎正在阅读的你也加入,一块儿分享。