一、準(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)贊支持一下,在這里先謝謝各位讀者了。