Python爬虫:Selenium和动作链实现淘宝模拟登录

一、准备

话不多说,咋们先来看看淘宝登陆页面,可以看到登陆网址太长了,但其实"?"后面的可以是舍弃的,得到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()

我也是个新手,有错误的地方可以指出,觉得写的还行的可以点赞支持一下,在这里先谢谢各位读者了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容