Python3爬蟲實戰【點觸驗證碼】 — 模擬登陸bilibili


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知識和【免費】工具

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM