盤(pán)點(diǎn)一個(gè)Python網(wǎng)絡(luò )爬蟲(chóng)過(guò)驗證碼的問(wèn)題(方法一)_全球即時(shí)看
回復“書(shū)籍”即可獲贈Python從入門(mén)到進(jìn)階共10本電子書(shū)
【資料圖】
今
日
雞
湯
低眉信手續續彈,說(shuō)盡心中無(wú)限事。大家好,我是皮皮。
一、前言前幾天在Python最強王者群【鶏啊鶏?!繂?wèn)了一個(gè)Python網(wǎng)絡(luò )爬蟲(chóng)的問(wèn)題,這里拿出來(lái)給大家分享下。
下面是他的代碼:
from?selenium?import?webdriverfrom?selenium.webdriver.common.by?import?Byimport?timefrom?PIL?import?Imageimport?ddddocrocr?=?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)#?打開(kāi)目標網(wǎng)頁(yè)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.locationsize?=?captcha_element.sizeprint(location)print(size)#?截取整個(gè)網(wǎng)頁(yè)的截圖driver.save_screenshot("screenshot.png")#?根據驗證碼圖片元素的位置和大小,從整個(gè)網(wǎng)頁(yè)截圖中裁剪出驗證碼圖片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)#?保存裁剪后的驗證碼圖片,并進(jìn)行識別captcha_screenshot.save("captcha.png")with?open("captcha.png",?"rb")?as?f:????img_bytes?=?f.read()res?=?ocr.classification(img_bytes)print("識別的驗證碼是:"?+?res)
基本思路是沒(méi)啥問(wèn)題的,確實(shí)也是可以拿到對應界面的截圖,只不過(guò)是驗證碼的位置截取出現了點(diǎn)偏差,導致驗證碼沒(méi)正確識別到。
下面這個(gè)代碼是獲取驗證碼圖片元素的位置和大?。?/p>
location?=?captcha_element.locationsize?=?captcha_element.size
這個(gè)部分我看介紹應該是會(huì )返回定位的元素位置,我剛剛大致拖拉了一下在裁剪前的定位打印出來(lái)確實(shí)就已經(jīng)去了輸入密碼附近的位置了 但是我定位的元素是驗證碼的地方,并且我也嘗試了先定位驗證那個(gè)位置的大元素再定位至具體的驗證碼圖片位置 ?問(wèn)題依舊。
上面是粉絲的疑惑,下面一起來(lái)看看解決辦法。
二、實(shí)現過(guò)程這里【魏哥】嘗試了下代碼,但是出現下圖報錯:
這個(gè)報錯還是蠻常見(jiàn)的,對于時(shí)常使用sel的人來(lái)說(shuō),這個(gè)報錯算是家常便飯了,報錯的原因是本地瀏覽器驅動(dòng)和谷歌瀏覽器的版本不匹配,需要更換本地瀏覽器驅動(dòng)。
關(guān)于這個(gè)問(wèn)題的解決方法,就是去網(wǎng)頁(yè)下載對應瀏覽器版本的對應驅動(dòng),放到本地指定文件夾,確保該文件夾路徑有加入環(huán)境變量。該問(wèn)題的解決辦法公眾號歷史文章也有提及,網(wǎng)上的解決教程也一大堆,這里不再贅述。
言歸正傳,繼續回到這個(gè)問(wèn)題的解決辦法。這里【甯同學(xué)】給了一個(gè)思路,直接找到 驗證碼的圖片的url 用requests 請求 驗證碼的.content 用 ocr.classification(驗證碼的.content) 就可以了 不用保存圖片 在open讀取二進(jìn)制流,代碼如下所示:
順利地解決了粉絲的問(wèn)題,如果對requests和Beautiful還不熟悉的小伙伴,可能接受起來(lái)就比較困難一些。
這里只是給出了其中一個(gè)方法,另外的一個(gè)方法,一起看下一篇文章,敬請期待!
三、總結大家好,我是皮皮。這篇文章主要盤(pán)點(diǎn)了一個(gè)Python網(wǎng)絡(luò )爬蟲(chóng)過(guò)驗證碼的問(wèn)題,文中針對該問(wèn)題,給出了具體的解析和代碼實(shí)現,幫助粉絲順利解決了問(wèn)題。
最后感謝粉絲【鶏啊鶏】提問(wèn),感謝【甯同學(xué)】、【魏哥】給出的思路和代碼解析,感謝【Ineverleft】等人參與學(xué)習交流。
【提問(wèn)補充】溫馨提示,大家在群里提問(wèn)的時(shí)候??梢宰⒁庀旅鎺c(diǎn):如果涉及到大文件數據,可以數據脫敏后,發(fā)點(diǎn)demo數據來(lái)(小文件的意思),然后貼點(diǎn)代碼(可以復制的那種),記得發(fā)報錯截圖(截全)。代碼不多的話(huà),直接發(fā)代碼文字即可,代碼超過(guò)50行這樣的話(huà),發(fā)個(gè).py文件就行。
大家在學(xué)習過(guò)程中如果有遇到問(wèn)題,歡迎隨時(shí)聯(lián)系我解決(我的微信:pdcfighting1),應粉絲要求,我創(chuàng )建了一些高質(zhì)量的Python付費學(xué)習交流群和付費接單群,歡迎大家加入我的Python學(xué)習交流群和接單群!
小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習過(guò)程中,有遇到任何問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習交流群共同探討學(xué)習。
-------------------?End?-------------------
往期精彩文章推薦:
if a and b and c and d:這種代碼有優(yōu)雅的寫(xiě)法嗎?
Pycharm和Python到底啥關(guān)系?
都說(shuō)chatGPT編程怎么怎么厲害,今天試了一下,有個(gè)靜態(tài)網(wǎng)頁(yè),chatGPT居然沒(méi)搞定?
站不住就準備加倉,這個(gè)pandas語(yǔ)句該咋寫(xiě)?
歡迎大家點(diǎn)贊,留言,轉發(fā),轉載,感謝大家的相伴與支持
想加入Python學(xué)習群請在后臺回復【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
關(guān)鍵詞: