作者:Pineapple_C
原文链接:https://blog.csdn.net/pineapple_C/article/details/107641799?utm_source=app
注:本文经过原文作者授权发布,大家可以关注他的博客,和作者一起学习

这篇文章是一个很好的学习例子,作者能够在学习过程中,不断发现、不断总结,并且能够坚持不懈。希望大家读完了作者的这篇文章,能够在学习道路上 ,更有冲劲儿,更有动力。

一、前言

之前写过一篇爬取淘宝商品信息的博客(原来文章的链接如下),当时还是新手,急于完成爬取目标,干脆手动登录淘宝使浏览器保存我的信息,然后使用本地用户配置控制浏览器,投机取巧地解决了登录问题。虽然这不失为一种方法,但这却让selenium的全自动变成了半自动,不配Python之美。

原来文章链接:https://blog.csdn.net/pineapple_C/article/details/107461989

那么如何全自动登录淘宝呢?起初我是在互联网上找一些资源项目,直接拿来分析,但随着淘宝的反爬机制的增强,他们的这些方法都行不通了。于是我决定,自己动手!

二、分析

为了方便使用,我将整个代码进行了封装,文件名为login,类名为Login,请大家接着往下看。

1)相关依赖

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

2)构造函数

def __init__(self, username, password):"""初始化浏览器配置和登录信息"""self.url = 'https://login.taobao.com/member/login.jhtml'# 初始化浏览器选项options = webdriver.ChromeOptions()# 禁止加载图片options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 设置为开发者模式options.add_experimental_option('excludeSwitches', ['enable-automation'])# 加载浏览器选项self.browser = webdriver.Chrome(options=options)# 设置显式等待时间40sself.wait = WebDriverWait(self.browser, 40)self.username = username  # 用户名self.password = password  # 密码

3)原始登录,使用淘宝账号或手机号登录

def original(self):"""直接使用淘宝账号登录:return: None"""self.browser.get(url=self.url)try:input_username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))input_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))# 等待滑块按钮加载div = self.wait.until(EC.presence_of_element_located((By.ID, 'nc_1__bg')))input_username.send_keys(self.username)input_password.send_keys(self.password)# 休眠2s,等待滑块按钮加载time.sleep(2)# 点击并按住滑块ActionChains(self.browser).click_and_hold(div).perform()# 移动滑块ActionChains(self.browser).move_by_offset(xoffset=300, yoffset=0).perform()# 等待验证通过self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div#nc_1__scale_text > span.nc-lang-cnt > b'), '验证通过'))# 登录input_password.send_keys(Keys.ENTER)print('Successful !')except TimeoutException as e:print('Error:', e.args)self.original()

其它的结点元素的定位我就不多说了,主要说一下滑块的定位

利用浏览器定位的话,会定位到 span这个结点,但经过我模仿单击按住,拖拽后滑块一动不动,参数也没有任何改变。于是我尝试了一下它的父节点div还是按住后拖拽,这次成功了。所以有时候不要怀疑自己的代码,有可能是其它方面的问题。

还有关于拖拽还要说明一下,淘宝的登录验证不是极验验证码,不是拖动滑块拼图的操作,而是将滑块拖到最右端。所以,至于这个最右端,只要距离够长,且不超出界面范围,长度随便定!

最后补充一下,偶尔会出现这种情况。

得到这张图也是很不容易啊,因为这种情况真的是太少了。经过反复实验,大概是因为滑动的轨迹不是基本水平导致的,就是说朝着斜下方滑动,虽然也能到达最右端,但会给出这个错误。我的程序是让它水平方向滑动300,竖直方向坐标为0。虽然是水平滑动,但是为了提高程序的容错率,还是加上了一个验证通过的等待

4)使用新浪微博账号登录,巧妙利用漏洞

提示:在用新浪微博登录之前,请在淘宝上绑定你的新浪账号。

def sina(self):"""使用新浪微博账号登录(提前绑定新浪账号):return: None"""self.browser.get(url=self.url)try:# 等待新浪登录链接加载weibo_login = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#login-form a.weibo-login')))weibo_login.click()input_username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.info_list > div.inp.username > input.W_input')))input_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.info_list > div.inp.password > input.W_input')))input_username.send_keys(self.username)input_password.send_keys(self.password)input_password.send_keys(Keys.ENTER)# 等待浏览器保存我方信息,网速不好可以设置长一点time.sleep(5)# 刷新页面self.browser.refresh()# 等待快速登录按钮加载quick_login = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.info_list > div.btn_tip > a.W_btn_g')))quick_login.click()print('login successful !')except TimeoutException as e:print('Error:', e.args)self.sina()

关于结点元素的定位我就不多说了,主要说一下这个漏洞

正常情况下,输入完信息后点击登录,就该进入淘宝页面了,但是这个登录按钮不管怎么点,页面都是无动于衷。

定位一下,可以发现:

这个按钮的链接是javascript:void(0),假链接!!!

由于我的前端基础不好,不知道这啥意思。我疯狂的在互联网上查找如何使用selenium点击这种链接,可依旧没找到解决的办法。有没有人知道如何处理这种,请给原文作者留言!

然而就在我快放弃的时候,按了下F5刷新,奇迹出现了

检测到已登录的微博账号,快速登录???原来虽然我没有进入淘宝,但是浏览器左下角一直在显示如:等待**相应,正在解析主机等信息。所以淘宝还是保存了我的账号信息,只要下次自动登录的勾打上(默认打勾),它就会保存账号信息。

这就是为什么上面的代码,在输入好信息并回车登录后,要等待5秒,就是让它保存我的账号信息。

最后刷新页面,点击快速登录,大功告成

三、完整代码及使用方法

1)完整代码

# -*- coding: utf-8 -*-
"""
@author:Pineapple@contact:cppjavapython@foxmail.com@time:2020/7/28 9:09@file:login.py@desc: login taobao .
"""from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
import timeclass Login:def __init__(self, username, password):"""初始化浏览器配置和登录信息"""self.url = 'https://login.taobao.com/member/login.jhtml'# 初始化浏览器选项options = webdriver.ChromeOptions()# 禁止加载图片options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})# 设置为开发者模式options.add_experimental_option('excludeSwitches', ['enable-automation'])# 加载浏览器选项self.browser = webdriver.Chrome(options=options)# 设置显式等待时间40sself.wait = WebDriverWait(self.browser, 40)self.username = username  # 用户名self.password = password  # 密码def original(self):"""直接使用淘宝账号登录:return: None"""self.browser.get(url=self.url)try:input_username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))input_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))# 等待滑块按钮加载div = self.wait.until(EC.presence_of_element_located((By.ID, 'nc_1__bg')))input_username.send_keys(self.username)input_password.send_keys(self.password)# 休眠2s,等待滑块按钮加载time.sleep(2)# 点击并按住滑块ActionChains(self.browser).click_and_hold(div).perform()# 移动滑块ActionChains(self.browser).move_by_offset(xoffset=300, yoffset=0).perform()# 等待验证通过self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'div#nc_1__scale_text > span.nc-lang-cnt > b'), '验证通过'))# 登录input_password.send_keys(Keys.ENTER)print('Successful !')except TimeoutException as e:print('Error:', e.args)self.original()def sina(self):"""使用新浪微博账号登录(提前绑定新浪账号):return: None"""self.browser.get(url=self.url)try:# 等待新浪登录链接加载weibo_login = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#login-form a.weibo-login')))weibo_login.click()input_username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.info_list > div.inp.username > input.W_input')))input_password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.info_list > div.inp.password > input.W_input')))input_username.send_keys(self.username)input_password.send_keys(self.password)input_password.send_keys(Keys.ENTER)# 等待浏览器保存我方信息,网速不好可以设置长一点time.sleep(5)# 刷新页面self.browser.refresh()# 等待快速登录按钮加载quick_login = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'div.info_list > div.btn_tip > a.W_btn_g')))quick_login.click()print('login successful !')except TimeoutException as e:print('Error:', e.args)self.sina()

2)使用

在使用的时候要导入这个Login类,然后初始化这个类,最后登录方法使用相应的函数,文件名为login,类名为Login。

from login import Loginusername = '******'  # 账号
password = '******.'  # 密码
# 初始化Login类
login = Login(username, password)
# 使用淘宝账号或手机号登录
login.original()
# 使用新浪微博账号登录
# login.sina()

四、结语

本篇说的是淘宝自动登录,其实还是用了很多投机取巧的方法,比如:拖动滑块的位置没有确定,没有解决javascript:void(0)假链接的问题。若是淘宝加强了反爬机制,使用极验验证码等,这个标题里的最新版,可能也要被淘汰了,所以还是要接着解决极验验证码啊,以备后续跟新!

如有错误,欢迎私信纠正!
技术永无止境,谢谢支持!

Selenium自动登录淘宝,我无意间发现了登录漏洞?相关推荐

  1. php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据

    php 模拟登录淘宝taobao阿里妈妈|模拟登录淘宝联盟|curl模拟登录淘宝|模拟登陆淘宝采集数据 在很多项目中我们可能要采集淘宝会员中心的一些数据.但是程序采集的时候会员中心必须是登录的,这里我 ...

  2. 短信验证登录淘宝web页面(selenium+Chromedriver)

    短信验证登录淘宝web页面 自动化模拟登录(chromedriver存在python环境里) 第一步进行导包 第二步定位获取页面的web源代码 第三步构造是以chrome浏览器登录而不是以seleni ...

  3. Selenium自动登录淘宝,我无意间发现了登录漏洞!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 蓬莱文章建安骨,中间小谢又清发. ...

  4. Selenium 自动登录淘宝,我无意间发现了登录漏洞!

    G作者:Pineapple_C 原文链接:http://suo.im/6toKOR 注意:本文经过原文作者授权发布,大家可以关注他的博客,和作者一起学习. 这篇文章是一个很好的学习例子,作者能够在学习 ...

  5. Python Selenium淘宝自动登陆最新版,无意间发现淘宝登陆漏洞?

    一.前言 之前写过一篇爬取淘宝商品信息的博客----<<传送门,当时还是新手,急于完成爬取目标,干脆手动登录淘宝使浏览器保存我的信息,然后使用本地用户配置控制浏览器,投机取巧地解决了登录问 ...

  6. Python《使用Selenium 和pyautogui 实现自动登录淘宝》

    有了上一博文学习即基础,这一节想来学习下自动登录淘宝. 直接整上测试代码: from selenium import webdriver # import logging import time fr ...

  7. Python3+Selenium 实现自动登录淘宝+清空购物车

    此博客的目的为分享自己用Python3和Selenium实现的自动登录淘宝和清空购物车的程序逻辑.经测试,此程序有时可以"秒杀"一些供给相对充足的限量商品,但无法秒杀疫情期间的任何 ...

  8. 使用python selenium爬取淘宝商品信息 自动登录淘宝和爬取某一宝贝的主图,属性图和详情图等等

    selenium作为一个自动化测试工具非常好用,谁用谁知道啊. 先说如何登录淘宝,淘宝现在直接用会员名和密码登录会有滑块验证,找了网上说的几种方法和自己尝试了一番效果还是不太理想,实测过程中,即使滑块 ...

  9. selenium 成功绕过淘宝登录反爬机制

    前言 selenium + webdriver 在登录淘宝时会出现反爬滑块,该滑块无论怎么滑也滑不成功,只会出现 哎呀,出错了,点击刷新再来一次 有两个问题存在,导致 selenium + webdr ...

最新文章

  1. THINKPHP_关联模型_HAS_ONE/HAS/MANY/BELONGS_TO
  2. 【Android 异步操作】Handler 机制 ( Android 提供的 Handler 源码解析 | Handler 构造与消息分发 | MessageQueue 消息队列相关方法 )
  3. Tomcat - 源码构建Tomcat 8.5.55 启动
  4. GetCursorPos/WindowFromPoint/SendMessage
  5. Andrew Ng机器学习课程7
  6. 远控免杀专题(20)-GreatSCT免杀
  7. Maven入门详解以及Eclisp的集成
  8. linux运行脚本运行不了,解决linux 运行自动化脚本浏览器无法启动问题
  9. SAP License:客户统驭科目某天余额取数逻辑
  10. Java基础学习笔记 -- 9(数组)
  11. 简单好用的照片恢复软件推荐
  12. VAV系统类毕业论文文献都有哪些?
  13. mysql 查询结果作为参数_如何将数据库查询出来的字段值作为参数传入下一个请求中...
  14. 单例模式singleton
  15. 大道至简之九:周期的实质与投资机会
  16. CEFSharp 浏览器控件截图空白的解决方法
  17. vue3使用element组件中的Image导致频闪
  18. im即时通讯开发之后台应用保活、消息推送的噩梦
  19. 亮相博鳌大会:格创东智为制造业打造工业互联网+绿色低碳解决方案
  20. SMS短信中英文混合编码

热门文章

  1. 创建一个适用于BrainNet Viewer的.node文件---AAL2.node
  2. ESP32的硬件资源
  3. 操作系统学习笔记(二十九)~文件系统实现单元测试
  4. 基于phpmailer的企业邮箱发送邮件
  5. fatal: unable to access ‘https://github.com/xxxx.git/‘: Failed to connect to github.com port 443: T
  6. 2018招商银行深圳分行面试题分享
  7. 工程源码丢失复原解决办法
  8. 分享149个PHP源码,总有一款适合您
  9. 双摄像头采集的图片数据转换合成为视频
  10. 一文带你全面了解游戏运营这个岗位