Python3爬蟲實戰【點觸驗證碼】 — 模擬登陸bilibili
爬蟲思路如下:
- 利用自動化爬蟲工具 Selenium 模擬點擊輸入等操作來進行登錄
- 分析頁面,獲取點觸驗證碼的點觸圖片,通過將圖片發送給超級鷹打碼平台識別后獲取坐標信息
- 根據超級鷹返回的數據,模擬坐標的點選,即可實現登錄
一.准備工作
在開始之前,需要先注冊一個超級鷹賬號並申請一個軟件ID,注冊頁面鏈接為:https://www.chaojiying.com/user/reg/,注冊完成后需要在后台添加一個軟件ID,進行充值獲得積分,一般充一塊錢就可以了。
二.爬蟲構建
1.首先我可以到官方網站下載對應的 Python API,鏈接為:https://www.chaojiying.com/api-14.html ,我這里使用了崔慶才大大修改后的超級鷹api
代碼如下:
import requests from hashlib import md5 class Chaojiying(object): def __init__(self, username, password, soft_id): self.username = username self.password = md5(password.encode('utf-8')).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def post_pic(self, im, codetype): """ im: 圖片字節 codetype: 題目類型 參考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def report_error(self, im_id): """ im_id:報錯題目的圖片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json()
2.初始化函數
def __init__(self): self.url = 'https://passport.bilibili.com/login' self.browser = webdriver.Chrome() self.browser.maximize_window() self.wait = WebDriverWait(self.browser, 20) self.username = USERNAME self.password = PASSWORD
這里定義了發起請求的url、用戶名、密碼等全局變量,實例化 Chrome 瀏覽器、設置瀏覽器分辨率最大化、用戶名、密碼、同時也設置等待超時
3.登錄函數
def open(self): """ 打開網頁輸入用戶名密碼 :return: None """ self.browser.get(self.url) user = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username'))) password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd'))) user.send_keys(self.username) password.send_keys(self.password) login_btn = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'a.btn.btn-login'))) # 隨機暫停幾秒 time.sleep(random.random() * 3) # 點擊登陸按鈕 login_btn.click()
等待賬號輸入框和密碼輸入框對應的 ID 節點加載出來,然后獲取對應節點,其中賬號輸入框 id=“login-username”,密碼輸框
id=“login-passwd”,通過調用 send_keys() 方法輸入賬號和密碼,接着獲取登錄按鈕 class=“btn
btn-login”,設置暫停時間,最后調用 click() 方法實現登錄按鈕的點擊。
4.點觸驗證碼的處理
def pick_code(self): time.sleep(3) pick_img_label = self.browser.find_element_by_css_selector('img.geetest_item_img') # 獲取點觸圖片標簽 src = pick_img_label.get_attribute('src') # 獲取點觸圖片鏈接 img_content = requests.get(src).content # 獲取圖片二進制內容 f = BytesIO() f.write(img_content) img0 = Image.open(f) # 將圖片以文件的形式打開,主要是為了獲取圖片的大小 scale = [pick_img_label.size['width'] / img0.size[0], pick_img_label.size['height'] / img0.size[1]] # 獲取圖片與瀏覽器該標簽大小的比例 cjy = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID) result = cjy.post_pic(img_content, '9005') # 發送圖片並獲取結果 if result['err_no'] == 0: # 對結果進行分析 position = result['pic_str'].split('|') # position = ['110,234','145,247','25,185'] position = [[int(j) for j in i.split(',')] for i in position] # position = [[110,234],[145,247],[25,185]] for items in position: # 模擬點擊 ActionChains(self.browser).move_to_element_with_offset(pick_img_label, items[0] * scale[0], items[1] * scale[1]).click().perform() time.sleep(1) time.sleep(2) # 點擊登錄 certern_btn = self.browser.find_element_by_css_selector('div.geetest_commit_tip') certern_btn.click() return cjy, result
通過css選擇器,找到點觸圖片的標簽,獲取圖標的src鏈接,對圖片處理發送給超級鷹后台並獲取結果,對結果進行分析,模擬坐標的點選,即可實現登錄
三.GIF登錄圖
源碼獲取方法
公眾號回復【b站登錄】免費獲取
歡迎關注公眾號:Python爬蟲數據分析挖掘,回復【開源源碼】免費獲取更多開源項目源碼
公眾號每日更新python知識和【免費】工具