selenium和pytessarct提取古詩文網的驗證碼(python爬蟲)

代碼實現的主要功能:

  1. 瀏覽器自動化控制

  2. 驗證碼圖像獲取與處理

  3. OCR驗證碼識別

  4. 表單自動填寫與提交

  5. 登錄狀態驗證

  6. 異常處理與資源清理

1. 瀏覽器初始化與頁面加載
driver = webdriver.Chrome()
driver.get("https://www.gushiwen.cn/user/login.aspx?from=http://www.gushiwen.cn/user/collect.aspx")
time.sleep(2)
  • 功能:啟動Chrome瀏覽器并打開古詩文網登錄頁面

  • 關鍵點

    • webdriver.Chrome()?初始化瀏覽器驅動

    • time.sleep(2)?確保頁面完全加載(實際建議改用?WebDriverWait

2.驗證碼捕獲與預處理
code_img = driver.find_element(By.ID, 'imgCode')
img_bytes = code_img.screenshot_as_png
image = Image.open(io.BytesIO(img_bytes))
image = image.convert('L')  # 灰度化
  • 功能:獲取驗證碼圖像并優化識別條件

  • 關鍵點

    • screenshot_as_png?直接獲取二進制圖像數據

    • convert('L')?將彩色圖轉為灰度圖,提升OCR準確率

    • 注釋掉的二值化代碼可用于高對比度驗證碼

3. OCR驗證碼識別
custom_config = r'--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
textcode = pytesseract.image_to_string(image, config=custom_config)
textcode = textcode.strip().replace(' ', '')[:4]
  • 功能:通過Tesseract引擎識別驗證碼文本

  • 關鍵參數

    • --psm 7:單行文本識別模式

    • --oem 3:默認OCR引擎

    • tessedit_char_whitelist:限定識別字符集

  • 數據處理:去除空格并截取前4位字符

4. 登錄表單操作
driver.find_element(By.ID, 'email').send_keys("2833622025@qq.com")
driver.find_element(By.ID, 'pwd').send_keys("ckn12138")
driver.find_element(By.ID, 'code').send_keys(textcode)
driver.find_element(By.ID, 'denglu').click()
  • 功能:自動填寫并提交登錄表單

  • 元素定位

    • 通過HTML元素的ID定位各輸入框

    • denglu?是登錄按鈕的ID

5. 登錄結果驗證
if "退出登錄" in driver.page_source:print("登錄成功!")html = driver.page_source
else:print("登錄失敗,請檢查賬號或驗證碼!")
  • 驗證邏輯:檢查頁面是否出現"退出登錄"文本

  • 成功操作:獲取登錄后的頁面源碼

  • 失敗處理:輸出錯誤提示

6. 異常處理與資源釋放
except Exception as e:print("程序運行出錯:", str(e))
finally:driver.quit()
  • 異常捕獲:打印任何運行時錯誤

  • 資源清理:確保瀏覽器最終關閉

典型執行流程

  1. 打開瀏覽器 → 導航到登錄頁

  2. 定位驗證碼 → 圖像預處理 → OCR識別

  3. 自動填寫賬號/密碼/驗證碼 → 點擊登錄

  4. 檢查登錄結果 → 輸出頁面源碼或錯誤信息

  5. 無論成功與否都關閉瀏覽器

具體代碼展示

from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image
import pytesseract
import io
import time# 初始化瀏覽器
driver = webdriver.Chrome()
driver.get("https://www.gushiwen.cn/user/login.aspx?from=http://www.gushiwen.cn/user/collect.aspx")# 等待頁面加載
time.sleep(2)try:# 獲取驗證碼元素code_img = driver.find_element(By.ID, 'imgCode')# 將驗證碼截圖保存到內存img_bytes = code_img.screenshot_as_pngimage = Image.open(io.BytesIO(img_bytes))# 圖像預處理(提高識別率)image = image.convert('L')  # 灰度化# image = image.point(lambda x: 0 if x < 128 else 255, '1')  # 二值化(根據需要啟用)# 識別驗證碼custom_config = r'--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'textcode = pytesseract.image_to_string(image, config=custom_config)textcode = textcode.strip().replace(' ', '')[:4]  # 清理結果并取前4位print("識別的驗證碼:", textcode)if len(textcode) == 4:# 填寫登錄信息driver.find_element(By.ID, 'email').send_keys("2833622025@qq.com")driver.find_element(By.ID, 'pwd').send_keys("ckn12138")driver.find_element(By.ID, 'code').send_keys(textcode)driver.find_element(By.ID, 'denglu').click()# 等待登錄完成time.sleep(3)# 驗證登錄是否成功if "退出登錄" in driver.page_source:print("登錄成功!")# 獲取登錄后的頁面內容html = driver.page_sourceprint(html)else:print("登錄失敗,請檢查賬號或驗證碼!")else:print("驗證碼識別失敗或長度不正確")except Exception as e:print("程序運行出錯:", str(e))finally:# 關閉瀏覽器driver.quit()

但是這個代碼識別出來的驗證碼不準確 最好用超級鷹識別方式再識別一遍~

運行結果:

會自己填充賬號密碼之后

之后關閉瀏覽器

識別成功運行結果 因為驗證碼形式簡單 比較好識別:

?

識別失敗:

?網頁會顯示驗證碼錯誤!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75320.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【輸入某年某日,判斷這是這一年的第幾天】

for語句和switch語句分別實現 文章目錄 前言 一、用switch做 二、用for循環做 ?編輯 總結 前言 用兩種不同的方法求解【輸入某年某日&#xff0c;判斷這是這一年的第幾天】 一、用switch做 代碼如下&#xff08;示例&#xff09;&#xff1a; int main() {int y, m, d, cou…

香港理工視覺語言模型賦能智能制造最新綜述!基于視覺語言模型的人機協作在智能制造中的應用

作者&#xff1a;Junming FAN 1 ^{1} 1, Yue YIN 1 ^{1} 1, Tian WANG 1 ^{1} 1, Wenhang DONG 1 ^{1} 1, Pai ZHENG 1 ^{1} 1, Lihui WANG 2 ^{2} 2單位&#xff1a; 1 ^{1} 1香港理工大學工業及系統工程系&#xff0c; 2 ^{2} 2瑞典皇家理工學院論文標題&#xff1a; Vision-…

大智慧前端面試題及參考答案

如何實現水平垂直居中? 在前端開發中,實現元素的水平垂直居中是一個常見的需求,以下是幾種常見的實現方式: 使用絕對定位和負邊距:將元素的position設置為absolute,然后通過top、left屬性將其定位到父元素的中心位置,再使用負的margin值來調整元素自身的偏移,使其水平垂…

算法基礎_基礎算法【高精度 + 前綴和 + 差分 + 雙指針】

算法基礎_基礎算法【高精度 前綴和 差分 雙指針】 ---------------高精度---------------791.高精度加法題目介紹方法一&#xff1a;代碼片段解釋片段一&#xff1a; 解題思路分析 792. 高精度減法題目介紹方法一&#xff1a;代碼片段解釋片段一&#xff1a; 解題思路分析 7…

OkHttpHttpClient

學習鏈接 okhttp github okhttp官方使用文檔 SpringBoot 整合okHttp okhttp3用法 Java中常用的HTTP客戶端庫&#xff1a;OkHttp和HttpClient&#xff08;包含請求示例代碼&#xff09; 深入淺出 OkHttp 源碼解析及應用實踐 httpcomponents-client github apache httpclie…

DoDAF科普

摘要 DoDAF&#xff08;Department of Defense Architecture Framework&#xff0c;美國國防部架構框架&#xff09;是一種專門為復雜系統設計的標準化框架&#xff0c;廣泛應用于軍事和國防項目。它通過提供一致的架構描述方法&#xff0c;確保跨組織、跨國界的系統集成和互操…

搭建qemu環境

1.安裝qemu apt install qemu-system2.編譯內核 設置gcc軟鏈接sudo ln -s arm-linux-gnueabihf-gcc arm-linux-gccsudo ln -s arm-linux-gnueabihf-ld arm-linux-ldsudo ln -s arm-linux-gnueabihf-nm arm-linux-nmsudo ln -s arm-linux-gnueabihf-objcopy arm-linux-objc…

使用Claude Desktop和MCP工具創建個人編程助手

最近我在Claude Desktop上試用了MCP工具,體驗過程令人興奮不已。 我花時間測試了多個用于編程場景的MCP服務器——而Claude本就擅長編程,這一組合可謂相得益彰。 這些工具賦予Claude強大的自主任務執行能力,比如僅通過聊天就能實現Vibe編程。當然,必須謹慎控制其訪問權限…

K8S集群搭建 龍蜥8.9 Dashboard部署(2025年四月最新)

一、版本兼容性和服務器規劃 組件版本/配置信息備注操作系統Anolis OS 8.9基于 Linux 5.10.134-17.3.an8.x86_64內核版本Linux 5.10.134-17.3.an8.x86_64與 Kubernetes 1.29 兼容架構x86-64Kubernetes 版本v1.29.5最新穩定版&#xff0c;兼容 Linux 5.10 內核Docker 版本24.0.…

項目6——前后端互通的點餐項目

一、項目介紹 1、有哪些需求需要連接后臺完成功能? 前臺傳給后臺 后臺返回給前臺 注冊: 用戶名 密碼 操作是否成功 登錄: 用戶名 密碼 操作是否成功 下單: 用戶名 菜名 操作是否成功 Request : 前端發送給后臺的所有數據的載體 Res…

Go和Golang語言簡介

李升偉 整理 Go 和 Golang 實際上指的是同一種編程語言&#xff0c;只是名稱不同。 Go 名稱&#xff1a;Go 是該編程語言的正式名稱。 起源&#xff1a;由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 于 2007 年開始設計&#xff0c;2009 年正式發布。 設計目…

GitHub二次驗證登錄2FA(Enable two-factor authentication )

不用下載app&#xff0c;點擊二維碼下面的setup key獲取到secret并且保存好 接下來幾行代碼就可以解析了。 添加依賴 <dependency><groupId>com.amdelamar</groupId><artifactId>jotp</artifactId><version>1.3.0</version> </d…

RabbitMQ技術方案分析

方案分析 在上一篇文檔中&#xff0c;詳細講述了如何通過CanalMQ實現對分庫分表的數據庫和數據表進行數據同步&#xff0c;而在這個方案中&#xff0c;還有一個關鍵點是需要注意的&#xff1a;首先&#xff0c;數據增刪改的信息是保證寫入binlog的&#xff0c;Canal解析出增刪…

node.js版本管理

概述 遇到了版本升級后&#xff0c;以前項目不兼容的問題。 下載一個node.js的版本管理工具&#xff0c;官網下載地址&#xff0c;可以選擇版本下載&#xff0c;我選擇的1.11.1版本的。下載完成后點擊安裝&#xff0c;分別選擇nvm安裝目錄和nodejs的安裝目錄&#xff0c;點擊安…

leetcode-熱題100(3)

leetcode-74-搜索二維矩陣 矩陣最后一列升序排序&#xff0c;在最后一列中查找第一個大于等于target的元素 然后在該元素所在行進行二分查找 bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int n matrixSize;int m matrixColSize[0];in…

在HarmonyOS NEXT 開發中,如何指定一個號碼,拉起系統撥號頁面

大家好&#xff0c;我是 V 哥。 《鴻蒙 HarmonyOS 開發之路 卷1 ArkTS篇》已經出版上市了哈&#xff0c;有需要的朋友可以關注一下&#xff0c;卷2應用開發篇也馬上要出版了&#xff0c;V 哥正在緊鑼密鼓的寫鴻蒙開發實戰卷3的教材&#xff0c;卷3主要以項目實戰為主&#xff0…

音視頻入門基礎:MPEG2-TS專題(26)——通過FFmpeg命令使用RTP發送TS流

音視頻入門基礎&#xff1a;MPEG2-TS專題系列文章&#xff1a; 音視頻入門基礎&#xff1a;MPEG2-TS專題&#xff08;1&#xff09;——MPEG2-TS官方文檔下載 音視頻入門基礎&#xff1a;MPEG2-TS專題&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音視頻入門基礎…

(六)窗口表面

這節主要三部分 一&#xff0c;窗口表面的創建和銷毀 二&#xff0c;呈現隊列 三&#xff0c;與以前實現的圖形能力隊列的兼容 一&#xff0c;窗口表面 1&#xff0c;創建 VkSurfaceKHR surface; //創建窗口表面 glfwCreateWindowSurface(instance, //vkInstance對象window, …

【零基礎入門unity游戲開發——2D篇】SpriteEditor圖片編輯器

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

云巔之上:數字文明的重構與超越

序章&#xff1a;算力新紀元 2024年初春&#xff0c;當SpaceX的星艦將首批云計算節點送入近地軌道時&#xff0c;地球上的數字原住民們正通過云端AI助手規劃著一天的行程。這場靜默的革命已悄然進入新階段——云計算不再只是工具&#xff0c;而是成為數字文明的"第六元素…