Selenium模拟登录系列 | 淘宝滑块验证码破解
原文链接
导语
好久没更新了,上来冒个泡吧。各位小伙伴还记得前段时间号主挖过的一个坑嘛(虽然我曾经挖过无数个坑T_T):
Selenium模拟登录系列 | B站滑块验证码破解
今天随手更新了一下SeleniumLogin这个包,支持了一波利用selenium模拟登录淘宝,顺便分享给大家。虽然不想承认,但是这篇文章其实挺水的,因为我没想到淘宝的滑块验证码这么容易就能过T_T。
废话不多说,让我们愉快地开始吧~
相关文件
本系列所有相关代码都可以在这找到:
https://github.com/CharlesPikachu/SeleniumLogin
开发工具
Python版本:3.6.4
相关模块:
selenium模块;
以及一些python自带的模块。
Chromedriver:
在下面这个链接里下载和电脑上的谷歌浏览器版本相匹配的驱动:
http://npm.taobao.org/mirrors/chromedriver/
原理简介
先实例化一个webdriver.Chrome对象,用于自动化操作我们电脑里的谷歌浏览器:
browser = webdriver.Chrome(executable_path=chromedriverpath, options=chrome_opts)
接着,我们用它来自动访问一下淘宝网:
browser.get('http://www.taobao.com')
并模拟点击网页左上方的"亲,请登录"以进入淘宝网的登录界面:
具体而言,代码实现如下:
button = driver_wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'h')))
button.click()
自动填充一下用户名和密码:
# 输入用户名密码
username_sender = driver_wait.until(EC.presence_of_element_located((By.ID, 'fm-login-id')))
username_sender.send_keys(username)
password_sender = driver_wait.until(EC.presence_of_element_located((By.ID, 'fm-login-password')))
password_sender.send_keys(password)
上面的代码直接用ID来定位输入框了:
当然你也可以通过以下这些方式来定位网页中的元素,具体想怎么用全看个人喜好,初学者不必过于纠结这些东西:
BY.CLASS_NAME
BY.CSS_SELECTOR
BY.LINK_TEXT
BY.NAME
BY.PARTIAL_LINK_TEXT
BY.TAG_NAME
BY.XPATH
自动填充完用户名和密码后,登录界面可能会出现滑块验证码,如下图所示:
这类滑块验证码需要用户按住滑块,并将它拖动到最右边。一开始我以为淘宝会加入一些检测手段以识别是机器还是人在操作滑块。结果我发现我想多了,用ActionChains函数直接把滑块一口气拖到最右边就能验证通过了:
try:
slider = browser.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
if slider.is_displayed():
ActionChains(browser).click_and_hold(on_element=slider).perform()
ActionChains(browser).move_by_offset(xoffset=258, yoffset=0).perform()
ActionChains(browser).pause(0.5).release().perform()
except:
pass
最后模拟点击一下登录按钮就ok啦:
# 点击登录按钮
button = driver_wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'password-login')))
button.click()
大功告成,完整源代码详见相关文件呗~
效果展示
想要学习实现原理的,可以自己参考我上传到Github上源代码:
https://github.com/CharlesPikachu/SeleniumLogin
对于不想了解原理只想直接使用的小伙伴,我已经把本文介绍的淘宝模拟登录功能打包好上传到pypi了,库的名字叫SeleniumLogin,用法和之前开源的DecryptLogin类似:
嘿嘿,之前开源的模拟登录工具包开源文档上线啦~
只不过DecryptLogin借助于requests实现各大网站的模拟登录操作,而SeleniumLogin借助于selenium。
具体而言,只需要pip安装:
pip install SeleniumLogin
然后写几行代码就可以实现淘宝的模拟登录啦:
from SeleniumLogin import login
lg = login.Login()
username, browser = lg.taobao(username=xxx, password=xxx, chromedriverpath=xxx)
简单演示一下效果吧:
淘宝模拟登录https://www.zhihu.com/video/1253062732590764032