Python3.7与Selenium实现淘宝密码登录及滑块验证
本文介绍使用Python3.7结合Selenium库实现淘宝网站密码登录的完整流程。重点解析如何应对登录时的滑动验证码挑战,通过定位元素、计算滑动距离及模拟轨迹,成功绕过验证机制。文章提供从环境配置到代码实现的详细步骤,帮助开发者掌握自动化登录技巧。
淘宝登录界面与滑动验证挑战
在利用Selenium抓取淘宝商品数据的过程中,经常会被迫面对登录界面。

处理该界面的难点主要在于滑动验证码的通过方式。部分方案采用微博账号登录以规避滑动验证,那么是否可以直接使用密码登录呢?答案是肯定的。
实现思路与代码流程
实现思路
首先导入所需的库。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
1. 定位登录入口元素,点击以跳转至登录页面。

具体代码如下:
password_login = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//div[@class='site-nav-sign']//a[@class='h']")))
password_login.click()
执行上述代码后,即可从淘宝首页跳转至登录页面。
2. 获取用户账号和密码的输入框,并填入相应信息。
input_user = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//div[@class='input-plain-wrap input-wrap-loginid ']//input[@class='fm-text']")))
input_user.send_keys('用户')
input_password = self.browser.find_element_by_xpath("//div[@class='input-plain-wrap input-wrap-password']//input[@class='fm-text']")
input_password.send_keys('密码')
3. 定位滑块元素。
slider = self.wait.until(
EC.element_to_be_clickable(
(By.XPATH, '//div[@class="scale_text slidetounlock"]//span[@class="nc-lang-cnt"]')))
4. 实现滑块的运动路径。
distance = 260
track = []
current = 0
# mid = distance*3/13
t = 1
v= 260
if current < distance:
x = v*t
current = current+x
track.append(round(x))
这里的数值260是根据滑块框的大小计算得出的。

从图中可以看出,滑块框的尺寸为300*40,因此滑动的距离设定为260。
5. 按照计算好的运动路径拖动滑块。
ActionChains(self.browser).click_and_hold(slider).perform()
for i in tracks:
ActionChains(self.browser).move_by_offset(xoffset=i,yoffset=0).perform()
time.sleep(1)
ActionChains(self.browser).release().perform()
6. 最后一步:定位登录按钮,点击完成登录操作。
button = self.wait.until(
EC.element_to_be_clickable((By.XPATH,"//div[@class='fm-btn']//button[@type='submit']")))
button.click()
完整代码实现与总结
代码整理
# encoding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
class Taobao_login(object):
def __init__(self):
self.browser = webdriver.Chrome()
self.browser.get('https://www.taobao.com')
self.wait = WebDriverWait(self.browser,10)
#登录操作
def _put_info(self):
#等待密码登录选项出现并跳转登录页面
password_login = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//div[@class='site-nav-sign']//a[@class='h']")))
password_login.click()
#登录
input_user = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//div[@class='input-plain-wrap input-wrap-loginid ']//input[@class='fm-text']")))
input_user.send_keys('用户')
input_password = self.browser.find_element_by_xpath("//div[@class='input-plain-wrap input-wrap-password']//input[@class='fm-text']")
input_password.send_keys('密码')
def _get_track(self):
'''
获取运动轨迹
:return: 运动轨迹
'''
#滑动验证
distance = 260
track = []
current = 0
# mid = distance*3/13
t = 1
v= 260
if current < distance:
x = v*t
current = current+x
track.append(round(x))
return track
def _get_slider(self):
'''
获取滑块
:return: 滑块对象
'''
slider = self.wait.until(
EC.element_to_be_clickable(
(By.XPATH, '//div[@class="scale_text slidetounlock"]//span[@class="nc-lang-cnt"]')))
return slider
def _move_to_gap(self,slider,tracks):
'''
按照tracks拖动滑块
:param spider: 滑块
:param tracks: 轨迹
:return:
'''
ActionChains(self.browser).click_and_hold(slider).perform()
for i in tracks:
ActionChains(self.browser).move_by_offset(xoffset=i,yoffset=0).perform()
time.sleep(1)
ActionChains(self.browser).release().perform()
def _login(self):
#点击登录
button = self.wait.until(
EC.element_to_be_clickable((By.XPATH,"//div[@class='fm-btn']//button[@type='submit']")))
button.click()
time.sleep(1)
def run(self):
self._put_info()
time.sleep(1)
# tracks = self._get_track()
# slider = self._get_slider()
# self._move_to_gap(slider,tracks)
# time.sleep(1)
# self._login()
if __name__ == '__main__':
login = Taobao_login()
login.run()
总结
至此,关于Python3.7结合Selenium模拟登录淘宝的文章介绍完毕。如需了解更多Python Selenium模拟淘宝登录的相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













