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

6次阅读

共计 3633 个字符,预计需要花费 10 分钟才能阅读完成。

一、准备

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

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

正文完
 0