Python + Selenium使用百度文字識別API識別驗證碼

開發(fā)工具

PyCharm

需要安裝的包

python放接、Selenium雁竞、requests

先來一個簡單的打開百度搜索的例子
from selenium import webdriver


class OpenBaidu:
    def __init__(self, search, openurl):
        self.search = search
        self.openurl = openurl

    def open(self):
        # 初始化瀏覽器對象
        option = webdriver.ChromeOptions()
        option.add_experimental_option('useAutomationExtension', False)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 不自動關(guān)閉瀏覽器
        option.add_experimental_option("detach", True)
        driver = webdriver.Chrome(options=option)
        # 設(shè)置瀏覽器長寬
        driver.set_window_size(1200, 900)
        # 打開頁面
        driver.get(self.openurl)
        driver.find_element_by_id('kw').send_keys(self.search)
        driver.find_element_by_id('su').click()
        self.driver = driver

    def __call__(self):
        self.open()


if __name__ == '__main__':
    words = '北京時間'
    openUrl = 'http://www.baidu.com'
    OpenBaidu(words, openUrl)()

上面的代碼主要用到的方法:
browser = webdriver.Chrome()
browser.get(url)
//初始化瀏覽器對象 并打開對應(yīng)url
 browser .find_element_by_id('kw').send_keys(self.search)
 browser .find_element_by_id('su').click()
//輸入搜索關(guān)鍵字并點擊查詢按鈕
對輸入框的操作可參考鏈接:

Selenium-測試對象操作之:輸入框屡谐、按鈕

Selenium文檔:

參考鏈接一
參考鏈接二

首次運行的時候可能會報如下錯誤:

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver’
參考鏈接
主要是相應(yīng)瀏覽器的驅(qū)動版本不匹配導(dǎo)致的
打開自己電腦的瀏覽器(演示google瀏覽器)在地址欄輸入chrome://version/便可以查看到谷歌當前的版本號
接著我們來到谷歌瀏覽器驅(qū)動的下載網(wǎng)址http://chromedriver.storage.googleapis.com/index.html
下載對應(yīng)版本的驅(qū)動,解壓后就是chromedriver.exe
復(fù)制粘貼到以下兩個目錄:
C:\Program Files (x86)\Google\Chrome\Application
C:\Users\DHAdmin\PycharmProjects\pythonProject\venv\Scripts--python安裝目錄

不知道python安裝目錄的可運行如下命令查看:
 import sys
 sys.path
本次案例:給惠網(wǎng)登錄并簽到

由于登錄有個圖片的驗證碼襟士,需要把圖片保存到本地以后用OCR進行識別處理览爵。
這里案例用到了百度文字識別OCR的API
用到的API網(wǎng)絡(luò)圖片文字識別
百度文字識別OCR文檔
目前大多數(shù)API都有可以免費使用的次數(shù),注冊過程就省略了 段磨。

操作步驟解析
  1. 初始化瀏覽器對象并打開需要登錄簽到的頁面
  2. 輸入用戶名和密碼
  3. 獲取驗證碼圖片對圖片進行識別取逾,獲取文字
  4. 輸入識別出的文字點擊登錄按鈕
  5. 登錄成功后點擊簽到
第一步的步驟基本跟打開百度搜索類似
  # 初始化瀏覽器對象
  option = webdriver.ChromeOptions()
  option.add_experimental_option('useAutomationExtension', False)
  option.add_experimental_option('excludeSwitches', ['enable-automation'])
  # 不自動關(guān)閉瀏覽器
  option.add_experimental_option("detach", True)
  driver = webdriver.Chrome(options=option)
  # 登陸頁面
  login_url = "https://www.geihui.com/b/daily_attendance.php"
  # 設(shè)置瀏覽器長寬--窗口最大化
  driver.maximize_window()
  # 打開登陸頁面
  driver.get(login_url)
打開以后點擊登錄按鈕,如果未登錄會跳出登錄的彈窗,然后進行登錄的操作
# 點擊簽到按鈕
driver.find_element_by_class_name('module-btn').click()
# 輸入用戶名密碼
driver.find_element_by_name('username').send_keys(self.username)
driver.find_element_by_name('password').send_keys(self.password)
獲取驗證碼圖片保存到本地

截取完整頁面和指定元素并保存為圖片--參考鏈接

# 截取整個頁面
driver.get_screenshot_as_file("test.png")
driver.save_screenshot("test.png")
# 找到搜索框
imgposition = driver.find_element_by_id("n_code_img")
# 截取搜索框元素
imgposition.screenshot("img.png")
接下來就是對圖片進行識別了苹支,由于識別圖片需要帶token 所以要先獲取百度文字識別OCR的token
# 放一個官網(wǎng)提供的請求token的示例
# encoding:utf-8
import requests 

# client_id 為官網(wǎng)獲取的AK砾隅, client_secret 為官網(wǎng)獲取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官網(wǎng)獲取的AK】&client_secret=【官網(wǎng)獲取的SK】'
response = requests.get(host)
if response:
    print(response.json())
文字識別的API有好多,要用哪種可以自己參考文檔選擇-這里用到的是網(wǎng)絡(luò)圖片文字識別债蜜,每天有500次免費調(diào)用的次數(shù)晴埂,后期是否會收費未知。還是放一個官網(wǎng)調(diào)用的示例(如果是點選驗證碼的話需要返回位置
# encoding:utf-8

import requests
import base64

'''
網(wǎng)絡(luò)圖片文字識別
'''

request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/webimage"
# 二進制方式打開圖片文件
f = open('[本地文件]', 'rb')
img = base64.b64encode(f.read())

params = {"image":img}
access_token = '[調(diào)用鑒權(quán)接口獲取的token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:
    print (response.json())
有了識別結(jié)果以后寻定,只要獲取到文字進行輸入儒洛,再點擊登錄,到此已經(jīng)完成了70%了狼速。由于文字識別并不是百分百有返回結(jié)果的琅锻,所以我們需要加上一個判斷,如果沒有識別出來的時候唐含,點擊刷新驗證碼按鈕浅浮,,重新對圖片進行保存然后識別捷枯。
            if response:
                if len(response.json().get('words_result')) > 0:
                    # 輸入驗證碼文字
                    self.driver.find_element_by_id('top_loginvc').send_keys(response.json().get('words_result')[0].get('words'))
                    # 點擊登錄
                    self.driver.find_element_by_xpath('//*[@id="uloginfo"]/div[4]/input').click()
                    time.sleep(3)
                    # 點擊簽到
                    try:
                        self.driver.find_element_by_class_name('module-btn').click()
                        # print(response.json())
                        # return response.json().get('words_result')
                    except:
                        self.refreshcode()

                else:
                    self.refreshcode()

    def refreshcode(self):
        # 點擊刷新驗證碼
        self.driver.find_element_by_css_selector('.refresh.pngBase').click()
        time.sleep(3)
        # 保存新的驗證碼圖片覆蓋原來的
        # 截取整個頁面
        self.driver.get_screenshot_as_file("test.png")
        self.driver.save_screenshot("test.png")
        # 找到搜索框
        imgposition = self.driver.find_element_by_id("n_code_img")
        # 截取搜索框元素

        imgposition.screenshot("img.png")
        # 重新登陸
        self.ocr_b64()

完整代碼
import time

import requests
from selenium import webdriver
import base64

APP_ID = 'APP_ID'  # 填寫你的API Key
SECRET_KEY = 'SECRET_KEY'  # 填寫你的Secret Key

TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token'  # 獲取token請求url

OCR_URL = 'https://aip.baidubce.com/rest/2.0/ocr/v1/webimage' # 文字識別OCRAPI


class Check:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def check(self):
        # 初始化瀏覽器對象
        option = webdriver.ChromeOptions()
        option.add_experimental_option('useAutomationExtension', False)
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 不自動關(guān)閉瀏覽器
        option.add_experimental_option("detach", True)
        driver = webdriver.Chrome(options=option)
        # 登陸頁面
        login_url = "https://www.geihui.com/b/daily_attendance.php"
        # 設(shè)置瀏覽器長寬
        driver.maximize_window()
        # driver.set_window_size(1200, 900)
        # 打開登陸頁面
        driver.get(login_url)
        # 點擊簽到按鈕
        driver.find_element_by_class_name('module-btn').click()
        # 輸入用戶名密碼
        driver.find_element_by_name('username').send_keys(self.username)
        driver.find_element_by_name('password').send_keys(self.password)
        # 截取整個頁面
        driver.get_screenshot_as_file("test.png")
        driver.save_screenshot("test.png")
        # 找到搜索框
        imgposition = driver.find_element_by_id("n_code_img")
        # 截取搜索框元素
        imgposition.screenshot("img.png")
        self.driver = driver

    def fetch_token(self):
        data = {
            'grant_type': 'client_credentials',
            'client_id': APP_ID,
            'client_secret': SECRET_KEY
        }
        r = requests.post(TOKEN_URL, data=data)
        if 'access_token' in r.json():
            # print(r.json())
            return r.json().get('access_token')
        else:
            print('請檢查獲取access_token的URL, APP_ID, SECRET_KEY!')

    def ocr_b64(self):
        '''
        傳入base64編碼格式的圖片數(shù)據(jù)滚秩,識別圖片中的文字
        :params: base64編碼格式的圖片數(shù)據(jù)
        :return: 返回識別后的文字字符串
        '''
        access_token = self.fetch_token()  # 獲取 token
        # 打開本地圖片
        f = open('./img.png', 'rb')
        img = base64.b64encode(f.read())
        if access_token:
            params = {"image": img}
            access_token = access_token
            request_url = OCR_URL + "?access_token=" + access_token
            headers = {'content-type': 'application/x-www-form-urlencoded'}
            response = requests.post(request_url, data=params, headers=headers)
            if response:
                if len(response.json().get('words_result')) > 0:
                    # 輸入驗證碼文字
                    self.driver.find_element_by_id('top_loginvc').send_keys(response.json().get('words_result')[0].get('words'))
                    # 點擊登錄
                    self.driver.find_element_by_xpath('//*[@id="uloginfo"]/div[4]/input').click()
                    time.sleep(3)
                    # 點擊簽到
                    try:
                        self.driver.find_element_by_class_name('module-btn').click()
                        # print(response.json())
                        # return response.json().get('words_result')
                    except:
                        self.refreshcode()

                else:
                    self.refreshcode()

    def refreshcode(self):
        # 點擊刷新驗證碼
        self.driver.find_element_by_css_selector('.refresh.pngBase').click()
        time.sleep(3)
        # 保存新的驗證碼圖片覆蓋原來的
        # 截取整個頁面
        self.driver.get_screenshot_as_file("test.png")
        self.driver.save_screenshot("test.png")
        # 找到搜索框
        imgposition = self.driver.find_element_by_id("n_code_img")
        # 截取搜索框元素

        imgposition.screenshot("img.png")
        # 重新登陸
        self.ocr_b64()

    def __call__(self):
        self.check()
        time.sleep(3)
        self.fetch_token()
        time.sleep(3)
        self.ocr_b64()


if __name__ == '__main__':
    # 用戶名和密碼
    username = 'xxxxx'
    password = 'xxxxx'
    Check(username, password)()

第一次寫代碼還可進行完善,有興趣的可以拿去改改試試

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淮捆,一起剝皮案震驚了整個濱河市郁油,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攀痊,老刑警劉巖桐腌,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苟径,居然都是意外死亡案站,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門棘街,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟆盐,“玉大人承边,你說我怎么就攤上這事∈遥” “怎么了博助?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長痹愚。 經(jīng)常有香客問我富岳,道長,這世上最難降的妖魔是什么拯腮? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任窖式,我火速辦了婚禮,結(jié)果婚禮上动壤,老公的妹妹穿的比我還像新娘脖镀。我一直安慰自己,他們只是感情好狼电,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布蜒灰。 她就那樣靜靜地躺著,像睡著了一般肩碟。 火紅的嫁衣襯著肌膚如雪强窖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天削祈,我揣著相機與錄音翅溺,去河邊找鬼。 笑死髓抑,一個胖子當著我的面吹牛咙崎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吨拍,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼褪猛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了羹饰?” 一聲冷哼從身側(cè)響起伊滋,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎队秩,沒想到半個月后笑旺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡馍资,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年筒主,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡乌妙,死狀恐怖色洞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冠胯,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布锦针,位于F島的核電站荠察,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奈搜。R本人自食惡果不足惜悉盆,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馋吗。 院中可真熱鬧焕盟,春花似錦、人聲如沸宏粤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍哎。三九已至来农,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崇堰,已是汗流浹背沃于。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留海诲,地道東北人繁莹。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像特幔,于是被迫代替她去往敵國和親咨演。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容