盤點一個Python網(wǎng)絡(luò)爬蟲過驗證碼的問題(方法一)
回復(fù)“書籍”即可獲贈Python從入門到進階共10本電子書
大家好,我是皮皮。
一、前言
前幾天在Python最強王者群【鶏啊鶏?!繂柫艘粋€Python網(wǎng)絡(luò)爬蟲的問題,這里拿出來給大家分享下。

下面是他的代碼:
from?selenium?import?webdriver
from?selenium.webdriver.common.by?import?By
import?time
from?PIL?import?Image
import?ddddocr
ocr?=?ddddocr.DdddOcr()
options?=?webdriver.ChromeOptions()
options.add_argument('user-agent=Mozilla/5.0?(Macintosh;?Intel?Mac?OS?X?10_15_7)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/86.0.4240.198?Safari/537.36')
options.add_argument("--disable-blink-features=AutomationControlled")
driver?=?webdriver.Chrome(options=options)
#?打開目標網(wǎng)頁
driver.get('https://sol.sinosure.com.cn')
time.sleep(5)
driver.maximize_window()
#?定位驗證碼圖片元素并模擬鼠標懸停以加載圖片
yanzhengma?=?driver.find_element(By.CSS_SELECTOR,?'.pass-form-item.pass-form-item-code')
captcha_element?=?yanzhengma.find_element(By.CSS_SELECTOR,??'.pass-label-img')
webdriver.ActionChains(driver).move_to_element(captcha_element).perform()
time.sleep(5)
#?獲取驗證碼圖片元素的位置和大小
location?=?captcha_element.location
size?=?captcha_element.size
print(location)
print(size)
#?截取整個網(wǎng)頁的截圖
driver.save_screenshot('screenshot.png')
#?根據(jù)驗證碼圖片元素的位置和大小,從整個網(wǎng)頁截圖中裁剪出驗證碼圖片
left?=?int(location['x'])
top?=?int(location['y'])
right?=?int(location['x']?+?size['width'])
bottom?=?int(location['y']?+?size['height'])
captcha_screenshot?=?Image.open('screenshot.png').crop((left,?top,?right,?bottom))
print(left)
print(top)
print(location)
print(bottom)
#?保存裁剪后的驗證碼圖片,并進行識別
captcha_screenshot.save('captcha.png')
with?open('captcha.png',?'rb')?as?f:
????img_bytes?=?f.read()
res?=?ocr.classification(img_bytes)
print('識別的驗證碼是:'?+?res)
基本思路是沒啥問題的,確實也是可以拿到對應(yīng)界面的截圖,只不過是驗證碼的位置截取出現(xiàn)了點偏差,導(dǎo)致驗證碼沒正確識別到。

下面這個代碼是獲取驗證碼圖片元素的位置和大?。?/p>
location?=?captcha_element.location
size?=?captcha_element.size
這個部分我看介紹應(yīng)該是會返回定位的元素位置,我剛剛大致拖拉了一下在裁剪前的定位打印出來確實就已經(jīng)去了輸入密碼附近的位置了 但是我定位的元素是驗證碼的地方,并且我也嘗試了先定位驗證那個位置的大元素再定位至具體的驗證碼圖片位置 ?問題依舊。
上面是粉絲的疑惑,下面一起來看看解決辦法。
二、實現(xiàn)過程
這里【魏哥】嘗試了下代碼,但是出現(xiàn)下圖報錯:

這個報錯還是蠻常見的,對于時常使用sel的人來說,這個報錯算是家常便飯了,報錯的原因是本地瀏覽器驅(qū)動和谷歌瀏覽器的版本不匹配,需要更換本地瀏覽器驅(qū)動。
關(guān)于這個問題的解決方法,就是去網(wǎng)頁下載對應(yīng)瀏覽器版本的對應(yīng)驅(qū)動,放到本地指定文件夾,確保該文件夾路徑有加入環(huán)境變量。該問題的解決辦法公眾號歷史文章也有提及,網(wǎng)上的解決教程也一大堆,這里不再贅述。

言歸正傳,繼續(xù)回到這個問題的解決辦法。這里【甯同學(xué)】給了一個思路,直接找到 驗證碼的圖片的url 用requests 請求 驗證碼的.content 用 ocr.classification(驗證碼的.content) 就可以了 不用保存圖片 在open讀取二進制流,代碼如下所示:

順利地解決了粉絲的問題,如果對requests和Beautiful還不熟悉的小伙伴,可能接受起來就比較困難一些。
這里只是給出了其中一個方法,另外的一個方法,一起看下一篇文章,敬請期待!
三、總結(jié)
大家好,我是皮皮。這篇文章主要盤點了一個Python網(wǎng)絡(luò)爬蟲過驗證碼的問題,文中針對該問題,給出了具體的解析和代碼實現(xiàn),幫助粉絲順利解決了問題。
最后感謝粉絲【鶏啊鶏】提問,感謝【甯同學(xué)】、【魏哥】給出的思路和代碼解析,感謝【Ineverleft】等人參與學(xué)習(xí)交流。
【提問補充】溫馨提示,大家在群里提問的時候??梢宰⒁庀旅鎺c:如果涉及到大文件數(shù)據(jù),可以數(shù)據(jù)脫敏后,發(fā)點demo數(shù)據(jù)來(小文件的意思),然后貼點代碼(可以復(fù)制的那種),記得發(fā)報錯截圖(截全)。代碼不多的話,直接發(fā)代碼文字即可,代碼超過50行這樣的話,發(fā)個.py文件就行。

大家在學(xué)習(xí)過程中如果有遇到問題,歡迎隨時聯(lián)系我解決(我的微信:pdcfighting1),應(yīng)粉絲要求,我創(chuàng)建了一些高質(zhì)量的Python付費學(xué)習(xí)交流群和付費接單群,歡迎大家加入我的Python學(xué)習(xí)交流群和接單群!

小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
