1. 程式人生 > >python使用selenium和pytesser3處理爬蟲頁面中的驗證碼

python使用selenium和pytesser3處理爬蟲頁面中的驗證碼

from selenium import webdriver
import pytesser3
import time

driver = webdriver.Chrome()

# 迴圈輸入驗證碼,因為一遍可能不能正確識別,直到正確識別,再進行其他操作
accept = False
while not accept:
    try:
        # 開啟含有驗證碼的搜尋頁
        driver.get('your link')
        time.sleep(3)
        # 找到輸入框input,輸入你的搜尋關鍵詞
        input = driver.find_element_by_id('keyword')
        input.send_keys('your keyword')
        time.sleep(5)

        # 驗證碼識別
        # 先對瀏覽器當前頁面截圖,並存儲
        driver.get_screenshot_as_file('C:\\screenshot.jpg')
        im = Image.open('C:\\screenshot.jpg')

        # 用box裁剪出截圖中驗證碼的所在區域
        box = [100, 100, 200, 200]  # 設定要裁剪的區域
        region = im.crop(box)  # 此時,region是一個新的影象物件
        region.save('C:\\codeImage.jpg')

        time.sleep(3)  # 防止由於網速,可能圖片還沒儲存好,就開始識別

        im = Image.open('C:\\codeImage.jpg')
        imgry = im.convert('L')  # 影象加強,二值化
        sharpness = ImageEnhance.Contrast(imgry)  # 對比度增強
        sharp_img = sharpness.enhance(2.0)

        # 將處理後的驗證碼圖片存在code.jpg中
        sharp_img.save('C:\\code.jpg')
        # sharp_img.show() #這是分佈測試時候用的,整個程式使用需要註釋掉

        # 呼叫pytesser3方法,變數code即為識別出的圖片數字str型別
        code = pytesser3.image_file_to_string('C:\\code.jpg', graceful_errors=True)
        print('code:' + code)

        # 在頁面的驗證碼輸入框中輸入識別出的code
        code_input = driver.find_element_by_id('keyword2')
        code_input.send_keys(code)
        time.sleep(2)

        # 然後進行搜尋和後續操作
        driver.find_element_by_class_name('search').click()
        time.sleep(2)

        # 如果驗證碼沒有識別正確,可能會彈出提示框,這裡我們需要對提示框進行處理

        # 在頁面中尋找提示框
        res = EC.alert_is_present()(driver)

        # 如果彈出提示框
        if res:
            # 點選提示框的確認,從新搜尋一遍
            res.accept()
            time.sleep(5)
        else:
            # 說明已經識別成功並搜尋成功,跳出迴圈進行下一步操作
            accept = True
    except UnicodeDecodeError:
        accept = False
        time.sleep(3)