Python爬蟲(chóng):Selenium和動(dòng)作鏈實(shí)現(xiàn)淘寶模擬登錄

一、準(zhǔn)備

話不多說(shuō),咋們先來(lái)看看淘寶登陸頁(yè)面,可以看到登陸網(wǎng)址太長(zhǎng)了,但其實(shí)"?"后面的可以是舍棄的,得到https://login.taobao.com/member/login.jhtml

就登陸而言頁(yè)面默認(rèn)是密碼登錄,也給我們少去了一些麻煩,目前來(lái)說(shuō)只要找到使用Selenium找到賬號(hào)和密碼框賦值后,再點(diǎn)擊登錄按鈕就可以實(shí)現(xiàn)淘寶模擬登錄了,但事實(shí)并非如此,我們接著往下看。


在這里插入圖片描述

在我使用如下代碼進(jìn)行測(cè)試登陸的時(shí)候,驚奇的發(fā)現(xiàn)多出來(lái)了滑塊驗(yàn)證碼。


在這里插入圖片描述

區(qū)區(qū)滑塊驗(yàn)證碼算啥,擼起袖子就是干?。。?
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("淘寶賬號(hào)")
    time.sleep(1)
    bro.find_element_by_name("fm-login-password").send_keys("淘寶密碼")
    time.sleep(1)
    time.sleep(10)


if __name__ == "__main__":
    main()
在這里插入圖片描述

想要破解滑塊驗(yàn)證碼其實(shí)不難,大體來(lái)說(shuō)肯定是要找到滑塊驗(yàn)證碼然后使用動(dòng)作鏈進(jìn)行點(diǎn)擊滑動(dòng),然后再點(diǎn)擊登錄就OK了。
那接下來(lái)開(kāi)始代碼分析。

二、代碼分析

第一部分

在這里插入圖片描述

#初始
def main():
    bro = webdriver.Chrome()
    bro.maximize_window()

    bro.get("https://login.taobao.com/member/login.jhtml")  #get方式請(qǐng)求淘寶登陸頁(yè)面
    time.sleep(1)   #休眠一秒,不要太快

    bro.find_element_by_name("fm-login-id").send_keys("淘寶賬號(hào)")   根據(jù)name找到賬號(hào)input標(biāo)簽
    time.sleep(1)
    bro.find_element_by_name("fm-login-password").send_keys("淘寶密碼") 根據(jù)name找到密碼input標(biāo)簽
    time.sleep(1)

    GetImage(bro)    #得到滑塊截圖

第二部分

#獲取
def GetImage(bro):
    # save_screenshot 就是將當(dāng)前頁(yè)面進(jìn)行截圖且保存
    bro.save_screenshot('taobao.png')   

    code_img_ele = bro.find_element_by_xpath("http://*[@id='nc_1__scale_text']/span")  #根據(jù)xpath語(yǔ)法找到滑塊驗(yàn)證碼
    location = code_img_ele.location  #驗(yàn)證碼圖片左上角的坐標(biāo) x,y
    size = code_img_ele.size  # 驗(yàn)證碼的標(biāo)簽對(duì)應(yīng)的長(zhǎng)和寬
    # 左上角和右下角的坐標(biāo)
    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)   #得到滑塊驗(yàn)證碼圖片
    # frame.save(code_img_name)

    Action(bro,code_img_ele)  #執(zhí)行

注意截圖時(shí)機(jī),登錄頁(yè)面一開(kāi)始加載后滑塊驗(yàn)證碼并不會(huì)出現(xiàn),等到賬號(hào)和密碼輸入后才會(huì)出現(xiàn),所以截圖的時(shí)機(jī)要放在賬號(hào)和密碼輸入之后。

在這里插入圖片描述

本來(lái)這個(gè)找到滑塊驗(yàn)證碼我一開(kāi)始是想用clss值找的,但class相同的有兩個(gè),所以我選擇了根據(jù)xpath語(yǔ)法找。

第三部分

做到這里其實(shí)就沒(méi)多少了,接下來(lái)要做的就是要點(diǎn)擊滑塊并右移實(shí)現(xiàn)驗(yàn)證。

#執(zhí)行
def Action(bro,code_img_ele):
    # 動(dòng)作鏈
    action = ActionChains(bro)
    # 長(zhǎng)按且點(diǎn)擊
    action.click_and_hold(code_img_ele)

    # move_by_offset(x,y) x水平方向,y豎直方向
    # perform()讓動(dòng)作鏈立即執(zhí)行
    action.move_by_offset(300, 0).perform()  #填寫(xiě)300的原因可看下圖
    time.sleep(0.5)

    # 釋放動(dòng)作鏈
    action.release()
    # 登錄
    bro.find_element_by_xpath("http://*[@id='login-form']/div[4]/button").click()   #根據(jù)xpath語(yǔ)法找到登錄按鈕點(diǎn)擊登錄
    time.sleep(10)
    bro.quit() #關(guān)閉瀏覽器

在這里插入圖片描述

到這里就算完結(jié)了,也可以實(shí)現(xiàn)自動(dòng)登錄功能了,還是有小小的成就感的!
剛好今天是端午節(jié),在這里祝大家端午節(jié)快樂(lè)哦。


在這里插入圖片描述

完整代碼如下:

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 就是將當(dāng)前頁(yè)面進(jìn)行截圖且保存
    bro.save_screenshot('taobao.png')

    code_img_ele = bro.find_element_by_xpath("http://*[@id='nc_1__scale_text']/span")
    location = code_img_ele.location  #驗(yàn)證碼圖片左上角的坐標(biāo) x,y
    size = code_img_ele.size  # 驗(yàn)證碼的標(biāo)簽對(duì)應(yīng)的長(zhǎng)和寬
    # 左上角和右下角的坐標(biāo)
    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)

#===================================================================================

#執(zhí)行
def Action(bro,code_img_ele):
    # 動(dòng)作鏈
    action = ActionChains(bro)
    # 長(zhǎng)按且點(diǎn)擊
    action.click_and_hold(code_img_ele)

    # move_by_offset(x,y) x水平方向,y豎直方向
    # perform()讓動(dòng)作鏈立即執(zhí)行
    action.move_by_offset(300, 0).perform()
    time.sleep(0.5)

    # 釋放動(dòng)作鏈
    action.release()
    # 登錄
    bro.find_element_by_xpath("http://*[@id='login-form']/div[4]/button").click()
    time.sleep(10)
    bro.quit() #關(guān)閉瀏覽器

if __name__ == "__main__":
    main()

我也是個(gè)新手,有錯(cuò)誤的地方可以指出,覺(jué)得寫(xiě)的還行的可以點(diǎn)贊支持一下,在這里先謝謝各位讀者了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容