一、准备
话不多说,咋们先来看看淘宝登陆页面,可以看到登陆网址太长了,但其实"?"后面的可以是舍弃的,得到https://login.taobao.com/member/login.jhtml
就登陆而言页面默认是密码登录,也给我们少去了一些麻烦,目前来说只要找到使用Selenium找到账号和密码框赋值后,再点击登录按钮就可以实现淘宝模拟登录了,但事实并非如此,我们接着往下看。
在我使用如下代码进行测试登陆的时候,惊奇的发现多出来了滑块验证码。
区区滑块验证码算啥,撸起袖子就是干!!!
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver import ActionChains
#初始
def main():
bro = webdriver.Chrome()
bro.maximize_window()
bro.get("https://login.taobao.com/member/login.jhtml")
time.sleep(1)
bro.find_element_by_name("fm-login-id").send_keys("淘宝账号")
time.sleep(1)
bro.find_element_by_name("fm-login-password").send_keys("淘宝密码")
time.sleep(1)
time.sleep(10)
if __name__ == "__main__":
main()
想要破解滑块验证码其实不难,大体来说肯定是要找到滑块验证码然后使用动作链进行点击滑动,然后再点击登录就OK了。
那接下来开始代码分析。
二、代码分析
第一部分
#初始
def main():
bro = webdriver.Chrome()
bro.maximize_window()
bro.get("https://login.taobao.com/member/login.jhtml") #get方式请求淘宝登陆页面
time.sleep(1) #休眠一秒,不要太快
bro.find_element_by_name("fm-login-id").send_keys("淘宝账号") 根据name找到账号input标签
time.sleep(1)
bro.find_element_by_name("fm-login-password").send_keys("淘宝密码") 根据name找到密码input标签
time.sleep(1)
GetImage(bro) #得到滑块截图
第二部分
#获取
def GetImage(bro):
# save_screenshot 就是将当前页面进行截图且保存
bro.save_screenshot('taobao.png')
code_img_ele = bro.find_element_by_xpath("//*[@id='nc_1__scale_text']/span") #根据xpath语法找到滑块验证码
location = code_img_ele.location #验证码图片左上角的坐标 x,y
size = code_img_ele.size # 验证码的标签对应的长和宽
# 左上角和右下角的坐标
rangle = (
int(location['x']),int(location['y']),int(location['x'] + size['width']),int(location['y'] + size['height'])
)
i = Image.open("./taobao.png")
# code_img_name = './tb.png'
# crop裁剪
frame = i.crop(rangle) #得到滑块验证码图片
# frame.save(code_img_name)
Action(bro,code_img_ele) #执行
注意截图时机,登录页面一开始加载后滑块验证码并不会出现,等到账号和密码输入后才会出现,所以截图的时机要放在账号和密码输入之后。
本来这个找到滑块验证码我一开始是想用clss值找的,但class相同的有两个,所以我选择了根据xpath语法找。
第三部分
做到这里其实就没多少了,接下来要做的就是要点击滑块并右移实现验证。
#执行
def Action(bro,code_img_ele):
# 动作链
action = ActionChains(bro)
# 长按且点击
action.click_and_hold(code_img_ele)
# move_by_offset(x,y) x水平方向,y竖直方向
# perform()让动作链立即执行
action.move_by_offset(300, 0).perform() #填写300的原因可看下图
time.sleep(0.5)
# 释放动作链
action.release()
# 登录
bro.find_element_by_xpath("//*[@id='login-form']/div[4]/button").click() #根据xpath语法找到登录按钮点击登录
time.sleep(10)
bro.quit() #关闭浏览器
到这里就算完结了,也可以实现自动登录功能了,还是有小小的成就感的!
刚好今天是端午节,在这里祝大家端午节快乐哦。
完整代码如下:
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver import ActionChains
#初始
def main():
bro = webdriver.Chrome()
bro.maximize_window()
bro.get("https://login.taobao.com/member/login.jhtml")
time.sleep(1)
bro.find_element_by_name("fm-login-id").send_keys("13597971392")
time.sleep(1)
bro.find_element_by_name("fm-login-password").send_keys("wad07244058664")
time.sleep(1)
GetImage(bro)
#===================================================================================
#获取
def GetImage(bro):
# save_screenshot 就是将当前页面进行截图且保存
bro.save_screenshot('taobao.png')
code_img_ele = bro.find_element_by_xpath("//*[@id='nc_1__scale_text']/span")
location = code_img_ele.location #验证码图片左上角的坐标 x,y
size = code_img_ele.size # 验证码的标签对应的长和宽
# 左上角和右下角的坐标
rangle = (
int(location['x']),int(location['y']),int(location['x'] + size['width']),int(location['y'] + size['height'])
)
i = Image.open("./taobao.png")
# code_img_name = './tb.png'
# crop裁剪
frame = i.crop(rangle)
# frame.save(code_img_name)
Action(bro,code_img_ele)
#===================================================================================
#执行
def Action(bro,code_img_ele):
# 动作链
action = ActionChains(bro)
# 长按且点击
action.click_and_hold(code_img_ele)
# move_by_offset(x,y) x水平方向,y竖直方向
# perform()让动作链立即执行
action.move_by_offset(300, 0).perform()
time.sleep(0.5)
# 释放动作链
action.release()
# 登录
bro.find_element_by_xpath("//*[@id='login-form']/div[4]/button").click()
time.sleep(10)
bro.quit() #关闭浏览器
if __name__ == "__main__":
main()
我也是个新手,有错误的地方可以指出,觉得写的还行的可以点赞支持一下,在这里先谢谢各位读者了。