Python繞過驗(yàn)證碼素跺,直接登錄爬數(shù)據(jù)

小編今天準(zhǔn)備爬取一個(gè)網(wǎng)站的數(shù)據(jù)鸟整,但是被登錄的驗(yàn)證碼擋住了

小編很不服


于是小編就想著怎么繞過驗(yàn)證碼去爬取網(wǎng)站的數(shù)據(jù)引镊。

學(xué)習(xí)Python過程中會遇到很多問題,可以到我們的 python學(xué)習(xí)交流群【七 三 五篮条,九 三 四弟头,八 四 一】,基礎(chǔ)涉茧,進(jìn)階赴恨。從企業(yè)招聘人才需求 到怎么學(xué)習(xí)python,和學(xué)習(xí)什么內(nèi)容都有免費(fèi)系統(tǒng)分享伴栓。希望可以幫助你快速了解Python伦连,學(xué)習(xí)python

雖說圖形驗(yàn)證碼最簡單,但是對于我這等新手钳垮,還是要苦學(xué)一番惑淳。首先尋找測試網(wǎng)站,網(wǎng)站選的是如云閣小說網(wǎng)饺窿,小網(wǎng)站不怕被封汛聚。他們的驗(yàn)證碼一般如下:

可以看出有微弱的干擾線和較強(qiáng)的干擾點(diǎn),驗(yàn)證碼是沒有邊框的短荐,這里為了排版好看,我加上去的...

1.灰度處理? ?把彩色驗(yàn)證碼圖片轉(zhuǎn)為灰色的圖片叹哭。

importcv2

image?=?cv2.imread('1.jpeg',0)

cv2.imwrite('1.jpg',?image)

2.?二值化處理? ?將圖片處理為只有黑白兩色的圖片忍宋,這里發(fā)現(xiàn)干擾線沒有了,這就意味著我們只需要處理干擾點(diǎn)即可风罩。

importcv2

image?=?cv2.imread('1.jpeg',0)

ret,?image?=?cv2.threshold(image,100,255,1)

height,?width?=?image.shape

new_image?=?image[0:height,0:150]

cv2.imwrite('1.jpg',?new_image)

3.??降噪處理? ?去除小黑點(diǎn)糠排,也就是孤立的黑色像素點(diǎn)。

點(diǎn)降噪原理就是檢測黑色點(diǎn)相鄰的8個(gè)點(diǎn)超升,判斷8個(gè)點(diǎn)的顏色情況入宦。如果全是白點(diǎn),那么就認(rèn)為這個(gè)點(diǎn)是白色的室琢,做黑點(diǎn)變白點(diǎn)處理乾闰。如⑤點(diǎn)處,以田字格來看盈滴,相鄰共有8個(gè)區(qū)域涯肩。

①②③點(diǎn)坐標(biāo)如下圖,同理可知④⑤⑥⑦⑧⑨點(diǎn)坐標(biāo)情況

降噪代碼如下:

importcv2

importnumpyasnp

fromPILimportImage

definverse_color(image,?col_range):

#?讀取圖片,0意味著圖片變?yōu)榛叶葓D

image?=?cv2.imread(image,0)

#?圖片二值化病苗,100為設(shè)置閥值疗垛,255為最大閥值,1為閥值類型硫朦,當(dāng)前點(diǎn)值大于閥值贷腕,設(shè)置為0,否則設(shè)置為255咬展。ret是return?value縮寫泽裳,代表當(dāng)前的閥值

ret,?image?=?cv2.threshold(image,110,255,1)

#?圖片的高度和寬度

height,?width?=?image.shape

#?圖片反色處理,原因:上面的處理只能生成白字黑底的圖片挚赊,而我們需要的是黑字白底的圖片

img2?=?image.copy()

foriinrange(height):

forjinrange(width):

img2[i,?j]?=?(255-?image[i,?j])

img?=?np.array(img2)

#?對處理后的圖片做截取

height,?width?=?img.shape

new_image?=?img[0:height,?col_range[0]:col_range[1]]

cv2.imwrite('handle_one.png',?new_image)

image?=?Image.open('handle_one.png')

returnimage

defclear_noise(img):

#?圖片降噪處理

x,?y?=?img.width,?img.height

foriinrange(x):

forjinrange(y):

ifsum_9_region(img,?i,?j)?<2:

#?改變像素點(diǎn)顏色诡壁,白色

img.putpixel((i,?j),255)

img?=?np.array(img)

cv2.imwrite('handle_two.png',?img)

img?=?Image.open('handle_two.png')

returnimg

defsum_9_region(img,?x,?y):

"""

田字格

"""

#?獲取當(dāng)前像素點(diǎn)的顏色值

cur_pixel?=?img.getpixel((x,?y))

width?=?img.width

height?=?img.height

ifcur_pixel?==255:#?如果當(dāng)前點(diǎn)為白色區(qū)域,則不統(tǒng)計(jì)鄰域值

return10

ify?==0:#?第一行

ifx?==0:#?左上頂點(diǎn),4鄰域

#?中心點(diǎn)旁邊3個(gè)點(diǎn)

sum_1?=?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?+1,?y))?+?img.getpixel((x?+1,?y?+1))

return4-?sum_1?/255

elifx?==?width?-1:#?右上頂點(diǎn)

sum_2?=?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?-1,?y))?+?img.getpixel((x?-1,?y?+1))

return4-?sum_2?/255

else:#?最上非頂點(diǎn),6鄰域

sum_3?=?img.getpixel((x?-1,?y))?+?img.getpixel((x?-1,?y?+1))?+?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?+1,?y))?+?img.getpixel((x?+1,?y?+1))

return6-?sum_3?/255

elify?==?height?-1:#?最下面一行

ifx?==0:#?左下頂點(diǎn)

#?中心點(diǎn)旁邊3個(gè)點(diǎn)

sum_4?=?cur_pixel?+?img.getpixel((x?+1,?y))?+?img.getpixel((x?+1,?y?-1))?+?img.getpixel((x,?y?-1))

return4-?sum_4?/255

elifx?==?width?-1:#?右下頂點(diǎn)

sum_5?=?cur_pixel?+?img.getpixel((x,?y?-1))?+?img.getpixel((x?-1,?y))?+?img.getpixel((x?-1,?y?-1))

return4-?sum_5?/255

else:#?最下非頂點(diǎn),6鄰域

sum_6?=?cur_pixel?+?img.getpixel((x?-1,?y))?+?img.getpixel((x?+1,?y))?+?img.getpixel((x,?y?-1))?+?img.getpixel((x?-1,?y?-1))?+?img.getpixel((x?+1,?y?-1))

return6-?sum_6?/255

else:#?y不在邊界

ifx?==0:#?左邊非頂點(diǎn)

sum_7?=?img.getpixel((x,?y?-1))?+?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?+1,?y?-1))?+?img.getpixel((x?+1,?y))?+?img.getpixel((x?+1,?y?+1))

return6-?sum_7?/255

elifx?==?width?-1:#?右邊非頂點(diǎn)

sum_8?=?img.getpixel((x,?y?-1))?+?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?-1,?y?-1))?+?img.getpixel((x?-1,?y))?+?img.getpixel((x?-1,?y?+1))

return6-?sum_8?/255

else:#?具備9領(lǐng)域條件的

sum_9?=?img.getpixel((x?-1,?y?-1))?+?img.getpixel((x?-1,?y))?+?img.getpixel((x?-1,?y?+1))?+?img.getpixel((x,?y?-1))?+?cur_pixel?+?img.getpixel((x,?y?+1))?+?img.getpixel((x?+1,?y?-1))?+?img.getpixel((x?+1,?y))?+?img.getpixel((x?+1,?y?+1))

return9-?sum_9?/255

defmain():

img?='1.jpeg'

img?=?inverse_color(img,?(0,160))

clear_noise(img)

if__name__?=='__main__':

main()

解決最大的問題后,接下來就是實(shí)現(xiàn)自動登陸荠割。首先使用selenium自動點(diǎn)擊登陸按鈕妹卿。

到登陸界面后,利用selenium自動輸入用戶名蔑鹦,密碼夺克,對驗(yàn)證碼區(qū)域進(jìn)行截圖。而后對驗(yàn)證碼截圖進(jìn)行處理嚎朽,最后成功獲取驗(yàn)證碼铺纽。

這里為什么是截圖呢,原因是驗(yàn)證碼圖片一直在變化哟忍。比如說我現(xiàn)在復(fù)制這個(gè)8863驗(yàn)證碼的圖片鏈接狡门,在新的標(biāo)簽頁打開,會發(fā)現(xiàn)驗(yàn)證碼改變了锅很,不是8863其馏,而是另外一張驗(yàn)證碼圖片。那么我們通過獲取當(dāng)前頁面的驗(yàn)證碼鏈接爆安,從而來獲取驗(yàn)證碼圖片叛复,這種方法肯定是不可行的。

通過查閱相關(guān)資料扔仓,知道了帶cookies訪問驗(yàn)證碼鏈接頁面褐奥,能夠成功解決這個(gè)問題。不過由于相關(guān)的庫沒導(dǎo)入成功翘簇,也就放棄了撬码。等下回做驗(yàn)證碼機(jī)器學(xué)習(xí)的時(shí)候,再給予解決缘揪。

登陸成功

自動登陸代碼如下:

importre

importcv2

importtime

importnumpyasnp

importpytesseract

fromPILimportImage

fromseleniumimportwebdriver

fromselenium.webdriver.common.byimportBy

fromselenium.webdriver.support.uiimportWebDriverWait

fromselenium.webdriver.supportimportexpected_conditionsasEC

USER?='你的用戶名'

PASSWORD?='你的密碼'

browser?=?webdriver.Chrome()

wait?=?WebDriverWait(browser,20)

definverse_color(image,?col_range):...

defclear_noise(img):...

defsum_9_region(img,?x,?y):...

defauto_login():

"""

實(shí)現(xiàn)網(wǎng)頁自動登陸

"""

url?='http://www.quanben9.com/'

browser.get(url)

#?查找登陸按鈕并點(diǎn)擊

button?=?browser.find_element_by_css_selector('#top1?>?div?>?a:nth-child(3)')

button.click()

#?查找用戶名輸入框并輸入用戶名

input_first?=?browser.find_element_by_name('username')

input_first.send_keys(USER)

#?查找密碼輸入框并輸入密碼

input_second?=?browser.find_element_by_name('password')

input_second.send_keys(PASSWORD)

#?獲取瀏覽器截圖后耍群,手動定位驗(yàn)證碼位置义桂,獲得驗(yàn)證碼截圖

browser.save_screenshot('Login_page.png')

photo?=?Image.open('login_page.png')

box?=?(1210,710,1360,755)

photo.crop(box).save('Verification.png')

#?對驗(yàn)證碼進(jìn)行灰度,二值化處理蹈垢,而后降噪處理

handle_verification_code('Verification.png')

#?對處理后的驗(yàn)證碼圖片進(jìn)行識別

image?=?Image.open('handle_two.png')

image.show()

result?=?pytesseract.image_to_string(image)

#?畢竟提供的庫識別能力有限慷吊,不一定能完整得到結(jié)果,需要對結(jié)果進(jìn)行篩選

result?=?re.sub('[a-zA-Z’!"#$%&'()*+,-./:;<=>?@曹抬,溉瓶。?★、…【】《》谤民?“”‘’堰酿![\]^_`{|}~]+','',?result.replace('?',''),?re.S)

print(result)

#?判斷識別是否成功

iflen(result)?==4:

#?獲得驗(yàn)證碼輸入框并輸入驗(yàn)證碼信息

input_third?=?browser.find_element_by_name('code')

input_third.send_keys(result)

time.sleep(2)

#?獲得登陸按鈕并點(diǎn)擊

button_2?=?wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'body?>?div.main?>?div?>?form?>?ul?>?li:nth-child(5)?>?input[type="submit"]')))

button_2.click()

time.sleep(5)

else:

returnauto_login()

defhandle_verification_code(img):

img?=?inverse_color(img,?(0,160))

img?=?clear_noise(img)

returnimg

defmain():

auto_login()

if__name__?=='__main__':

main()

#?結(jié)束程序

exit()

這里用會聲會影給視頻加了個(gè)BGM,不過結(jié)尾的時(shí)候不是很搭张足,水平有限吶触创!還是得好好多學(xué)習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末为牍,一起剝皮案震驚了整個(gè)濱河市哼绑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碉咆,老刑警劉巖抖韩,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疫铜,居然都是意外死亡茂浮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門壳咕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來席揽,“玉大人,你說我怎么就攤上這事谓厘【阅幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵庞呕,是天一觀的道長。 經(jīng)常有香客問我程帕,道長住练,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任愁拭,我火速辦了婚禮讲逛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岭埠。我一直安慰自己盏混,他們只是感情好蔚鸥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著许赃,像睡著了一般止喷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上混聊,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天弹谁,我揣著相機(jī)與錄音,去河邊找鬼句喜。 笑死预愤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咳胃。 我是一名探鬼主播植康,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼展懈!你這毒婦竟也來了销睁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤标沪,失蹤者是張志新(化名)和其女友劉穎榄攀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金句,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檩赢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了违寞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞瞒。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖趁曼,靈堂內(nèi)的尸體忽然破棺而出军浆,到底是詐尸還是另有隱情,我是刑警寧澤挡闰,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布乒融,位于F島的核電站,受9級特大地震影響摄悯,放射性物質(zhì)發(fā)生泄漏赞季。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一奢驯、第九天 我趴在偏房一處隱蔽的房頂上張望申钩。 院中可真熱鬧,春花似錦瘪阁、人聲如沸撒遣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽义黎。三九已至禾进,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轩缤,已是汗流浹背命迈。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留火的,地道東北人壶愤。 一個(gè)月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子裕寨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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