一、准备
话不多说,咋们先来看看淘宝登陆页面,可以看到登陆网址太长了,但其实"?"后面的可以是舍弃的,得到https://login.taobao.com/member/login.jhtml
就登陆而言页面默认是密码登录,也给我们少去了一些麻烦,目前来说只要找到使用Selenium找到账号和密码框赋值后,再点击登录按钮就可以实现淘宝模拟登录了,但事实并非如此,我们接着往下看。
在我使用如下代码进行测试登陆的时候,惊奇的发现多出来了滑块验证码。
区区滑块验证码算啥,撸起袖子就是干!!!
from selenium import webdriverimport timefrom PIL import Imagefrom 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 webdriverimport timefrom PIL import Imagefrom 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()
我也是个新手,有错误的地方可以指出,觉得写的还行的可以点赞支持一下,在这里先谢谢各位读者了。