养成好习惯:文中文末小广告帮忙点一点
目录
推荐
一、小小课堂
二、模拟匀加速和匀减速
三、分析登录页面
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/