
推薦閱讀??點(diǎn)擊標(biāo)題可跳轉(zhuǎn)寫在前面
??今天帶給大家一個(gè)突破點(diǎn)選驗(yàn)證碼的案例,利用爬蟲模擬登陸嗶哩嗶哩,并且把一些采坑的地方給大家強(qiáng)調(diào)一下!
一、需求分析
??模擬登陸嗶哩嗶哩
??網(wǎng)站鏈接: https://passport.bilibili.com/login
效果圖如下:

驗(yàn)證成功后會(huì)自動(dòng)跳轉(zhuǎn)B站的登錄界面,為了保護(hù)我的信息安全,我用了假用戶名
二、編程思路
??首先利用xpath或者css選擇器等方法找到要輸入內(nèi)容的元素位置,然后用自動(dòng)化爬蟲工具Selenium模擬點(diǎn)擊輸入等操作來(lái)進(jìn)行登錄并分析頁(yè)面,獲取點(diǎn)選驗(yàn)證碼的點(diǎn)選圖片,通過(guò)將圖片發(fā)送給快識(shí)別打碼平臺(tái)識(shí)別后獲取坐標(biāo)信息,根據(jù)快識(shí)別返回的數(shù)據(jù),模擬坐標(biāo)的點(diǎn)選,即可實(shí)現(xiàn)登錄。
三、前期準(zhǔn)備
1.下載chrome driver
??就是下載谷歌瀏覽器的驅(qū)動(dòng)器,當(dāng)然如果你用其他瀏覽器那么就要下載其他瀏覽器的相應(yīng)驅(qū)動(dòng),這里我以chrome瀏覽器為例,為什么要用英文呢?啊,這還用問(wèn)當(dāng)然是為了洋氣啦!(手動(dòng)狗頭)
??下載驅(qū)動(dòng)的時(shí)候必須要下載相應(yīng)的版本,可以在瀏覽器上方輸入chrome://version,即可查看自己的chrome版本。

然后進(jìn)入 https://npm.taobao.org/mirrors/chromedriver/網(wǎng)站下載相應(yīng)版本的驅(qū)動(dòng)。
2.安裝selenium庫(kù)
??由于是第三方庫(kù),所以在使用selenium之前需要先安裝:
pip install selenium
安裝的時(shí)候建議大家換鏡像源,具體方法可以參考這篇文章
鏈接: https://www.jb51.net/article/202564.htm
3.對(duì)接打碼平臺(tái)
??根據(jù)我們前面的編程思路我們需要到快識(shí)別網(wǎng)站http://www.kuaishibie.cn/根據(jù)給出的開發(fā)文檔和我們所需要的打碼功能構(gòu)建一個(gè)自己的api。
代碼如下:
#快識(shí)別網(wǎng)址 http://www.kuaishibie.cn/
#interface
import?base64
import?json
import?requests
?
def?base64_api(uname,pwd,img):
'''
驗(yàn)證碼識(shí)別接口
:param uname: 快識(shí)別用戶名
:param pwd: 快識(shí)別密碼
:param img: 圖片路徑
:return: 返回識(shí)別結(jié)果
'''
with?open(img,?'rb')?as?f:
base64_data?=?base64.b64encode(f.read())
b64?=?base64_data.decode()
data?=?{"username":?uname,?"password":?pwd,?"image":?b64,"typeid":21}
#result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)
result?=?json.loads(requests.post("http://api.ttshitu.com/imageXYPlus",?json=data).text)
if?result['success']:
return?result["data"]["result"]
else:
return?result["message"]
三、完整代碼
??代碼中的一些難點(diǎn)和相關(guān)步驟我都做了注釋,根據(jù)上面給出的編程思路大家一步一步做就好了,我就不再詳細(xì)解釋了,如果任何問(wèn)題歡迎評(píng)論區(qū)提問(wèn)或者私信我都可以喔~
#login_bilibili
from?selenium?import?webdriver
import?time
from?PIL?import?Image
from?selenium.webdriver?import?ActionChains?#導(dǎo)入動(dòng)作鏈模塊
?
?
KUAI_USERNAME?=?'快識(shí)別賬號(hào)'
KUAI_PASSWORD?=?'快識(shí)別密碼'
?
USERNAME?=?'B站賬號(hào)'
PASSWORD?=?'B站密碼'
?
#創(chuàng)建瀏覽器對(duì)象
driver?=?webdriver.Chrome(executable_path='chromedriver.exe')
#打開請(qǐng)求網(wǎng)頁(yè)頁(yè)面
driver.get('https://passport.bilibili.com/login')
driver.implicitly_wait(10)?#隱式等待瀏覽器渲染完成,sleep是強(qiáng)制等待
#driver.execute_script("document.body.style.zoom='0.67'") #瀏覽器內(nèi)容縮放67%
driver.maximize_window()#最大化瀏覽器
?
'''
用selenium自動(dòng)化工具操作瀏覽器,操作的順序和平常用瀏覽器操作的順序是一樣的
'''
?
'''
找到用戶名和密碼框輸入密碼
'''
user_input?=?driver.find_element_by_xpath('//*[@id="login-username"]')?#使用xpath定位用戶名標(biāo)簽元素
user_input.send_keys(USERNAME)
time.sleep(1)
?
user_input?=?driver.find_element_by_xpath('//*[@id="login-passwd"]')?#用戶密碼標(biāo)簽
user_input.send_keys(PASSWORD)
time.sleep(1)
?
#點(diǎn)擊登錄
Login_input?=?driver.find_element_by_css_selector('#geetest-wrap > div > div.btn-box > a.btn.btn-login')
Login_input.click()
time.sleep(5)
?
#對(duì)圖片驗(yàn)證碼進(jìn)行提取
img_label?=?driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div')?#提取圖片標(biāo)簽
?
#保存圖片
driver.save_screenshot('big.png')?#截取當(dāng)前整個(gè)頁(yè)面
time.sleep(5)
#location可以獲取這個(gè)元素左上角坐標(biāo)
print(img_label.location)
#size可以獲取這個(gè)元素的寬(width)和高(height)
print(img_label.size)
?
#計(jì)算驗(yàn)證碼的左右上下橫切面
left?=?img_label.location['x']
top?=?img_label.location['y']
right?=?img_label.location['x']?+?img_label.size['width']
down?=?img_label.location['y']?+?img_label.size['height']
?
im?=?Image.open('big.png')
im?=?im.crop((left,top,right,down))
im.save('yzm.png')
?
#對(duì)接打碼平臺(tái)
from?interface?import?base64_api?#顯示報(bào)錯(cuò)也無(wú)妨,可以運(yùn)行的不要被唬住
?
img_path?=?'yzm.png'
result?=?base64_api(uname=KUAI_USERNAME,?pwd=KUAI_PASSWORD,?img=img_path)
print(result)
print('驗(yàn)證碼識(shí)別結(jié)果:',?result)
result_list?=?result.split('|')
for?result?in?result_list:
x?=?result.split(',')[0]
y?=?result.split(',')[1]
ActionChains(driver).move_to_element_with_offset(img_label,?int(x),?int(y)).click().perform()?# perform()執(zhí)行整個(gè)動(dòng)作鏈
?
#點(diǎn)擊確認(rèn)按鈕
driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()
input()?# 用戶輸入 阻塞瀏覽器關(guān)閉
# 關(guān)閉瀏覽器
driver.quit()
注:chrome driver一定要和項(xiàng)目文件放在一起,這樣更加方便也更穩(wěn)定。interface接口文件最好也喝項(xiàng)目文件在一起,方便import導(dǎo)入

??然后就可以自動(dòng)登錄到B站啦,還在等什么,趕緊試試吧~

掃下方二維碼加老師微信
或是搜索老師微信號(hào):XTUOL1988【切記備注:學(xué)習(xí)Python】
領(lǐng)取Python web開發(fā),Python爬蟲,Python數(shù)據(jù)分析,人工智能等學(xué)習(xí)教程。帶你從零基礎(chǔ)系統(tǒng)性的學(xué)好Python!
也可以加老師建的Python技術(shù)學(xué)習(xí)教程qq裙:245345507,二者加一個(gè)就可以!
歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
*聲明:本文于網(wǎng)絡(luò)整理,版權(quán)歸原作者所有,如來(lái)源信息有誤或侵犯權(quán)益,請(qǐng)聯(lián)系我們刪除或授權(quán)事宜