久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

        手機站
        千鋒教育

        千鋒學習站 | 隨時隨地免費學

        千鋒教育

        掃一掃進入千鋒手機站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學習站小程序
        隨時隨地免費學習課程

        當前位置:首頁  >  技術(shù)干貨  > 爬蟲之圖片驗證碼處理

        爬蟲之圖片驗證碼處理

        來源:千鋒教育
        發(fā)布人:qyf
        時間: 2022-09-19 17:39:37 1663580377

          了解常見驗證碼

          在日常生活與工作中,在進行各類設(shè)計個人賬戶安全的操作時,往往需要填寫各種驗證碼來進行驗證,短信、語音、文字、問答、圖片、拖拽、旋轉(zhuǎn)騰挪、拼圖接圖.......千奇百怪,各種各樣,種類繁多,花樣迭起!就拿奇葩驗證碼鼻祖的12306來說,如今我們在12306中可以碰到各種有趣,各種類型的驗證碼的原因,要歸功于為搶票事業(yè)做出巨大貢獻的——黃牛們,它的“進化史”就是一部不斷與黃牛和搶票軟件“斗智斗勇”的歷史。

        Picture

          目前我們常見的驗證碼,無非就是文本、圖像以及音頻這三大類。

        Picture(1)

          而當文本驗證碼仍容易被機器“擊破”時,圖像驗證碼就應(yīng)運而生了。通常是會提供一些物體、動物、植物、人、風景之類的圖像,讓我們選擇正確的圖像進行標記。這就是以12306為首的圖像驗證碼了,但是這個還不算后來圖像驗證碼又增加了新的玩法,比如旋轉(zhuǎn)圖片,比如拼圖以及宮格,目的還是為了對抗爬蟲這些機器。

        Picture(2)

          接下來是音頻驗證碼,這種相比前兩種數(shù)量相對要小一些,主要是會給我們一段錄音,里面有隨機的單詞或數(shù)字,有的會加一些噪音,我們基于錄音輸入其中聽到的單詞或數(shù)字,或者把它讀出來。從安全性上來說,聲音驗證碼比文本和圖像等級要提升一個層級,因為機器想要聽錄音并分辨,這個難度會非常大。

        Picture(3)

          驗證碼的處理方案

          • 手動輸入(input) 這種方法僅限于登錄一次就可持續(xù)使用的情況

          • 圖像識別引擎解析 使用光學識別引擎處理圖片中的數(shù)據(jù),目前常用于圖片數(shù)據(jù)提取,較少用于驗證碼處理

          • 打碼平臺 爬蟲常用的驗證碼解決方案

          圖像識別引擎

          OCR,即Optical Character Recognition,光學字符識別,是指通過掃描字符,然后通過其形狀將其翻譯成電子文本的過程,對應(yīng)圖形驗證碼來說,它們都是一些不規(guī)則的字符,這些字符是由字符稍加扭曲變換得到的內(nèi)容,我們可以使用OCR技術(shù)來講其轉(zhuǎn)化為電子文本,然后將結(jié)果提取交給服務(wù)器,便可以達到自動識別驗證碼的過程

          tesserocr與pytesseract是Python的一個OCR識別庫,但其實是對tesseract做的一層Python API封裝,pytesseract是Google的Tesseract-OCR引擎包裝器;所以它們的核心是tesseract,因此在安裝tesserocr之前,我們需要先安裝tesseract。

          圖片識別引擎環(huán)境的安裝

          1 引擎的安裝

          • mac環(huán)境下直接執(zhí)行命令

          brew install --with-training-tools tesseract

          • windows環(huán)境下的安裝 可以通過exe安裝包安裝,下載地址可以從GitHub項目中的wiki找到。安裝完成后記得將Tesseract 執(zhí)行文件的目錄加入到PATH中,方便后續(xù)調(diào)用。

          • linux環(huán)境下的安裝

          sudo apt-get install tesseract-ocr

          2 Python庫的安裝

          # PIL用于打開圖片文件

          pip/pip3 install pillow

          # pytesseract模塊用于從圖片中解析數(shù)據(jù)

          pip/pip3 install pytesseract

          本次案例我們使用圖片識別引擎識別驗證碼登陸古詩文網(wǎng)

        Picture(4)

          通過分析我們發(fā)現(xiàn)驗證碼點擊刷新的鏈接是:

        Picture(5)

          所以我們請求10次本鏈接獲取10張圖片,進行圖片識別

          import time

          from PIL import Image

          import pytesseract

          import requests

          headers = {

          "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"

          }

          image_url = 'https://so.gushiwen.org/RandCode.ashx'

          # 下載驗證碼圖片

          session = requests.Session() # 使用session是為了保證驗證碼的請求和登陸請求信息一致

          for i in range(10):

          r = session.get(image_url, headers=headers)

          with open('images/code'+str(i)+'.jpg', 'wb') as fp:

          fp.write(r.content)

          time.sleep(10)

          print('下載完成第'+str(i)+'張!')

          # 依次識別并保存到文件中

          # 進行二值處理

          def erzhihua(image, threshold):

          ''':type image:Image.Image'''

          image = image.convert('L')

          table = []

          for i in range(256):

          if i < threshold:

          table.append(0)

          else:

          table.append(1)

          return image.point(table, '1')

          # 對剛才保存的10張圖片進行識別

          for i in range(10):

          im = Image.open('images/code' + str(i) + '.jpg')

          im = erzhihua(im, 127)

          im.show()

          result = pytesseract.image_to_string(im, lang='eng')

          print(result)

          但是很遺憾10次或者更多次數(shù)才能打碼成功一次。

          打碼平臺

          此時我們就要尋求專業(yè)的打碼平臺,申請第三方的平臺,宋宋試了一下阿里提供的各種免費的打碼平臺。鏈接:https://market.aliyun.com/products/?keywords=圖片識別驗證碼,但是識別效果不是很佳(哈哈因為是免費的緣故吧!只有標記優(yōu)品的那個還不錯其他的也可以自行試一試)。

        Picture(6)

          為了測試它的識別效果,我們嘗試申請成交次數(shù)最多的那個,查看官方API說明如下:

        Picture(7)

          因此我們使用驗證碼打碼平臺獲取驗證碼并登錄

          實現(xiàn)思路:

          使用requests.session獲取圖片并進行本地保存

          使用打碼平臺識別圖片

          獲取登錄鏈接,登陸鏈接是一個post請求,并攜帶了你的表單中填入的用戶名和密碼

          登陸獲取cookies, 才能去訪問用戶的個人頁

          import json

          from PIL import Image

          import pytesseract

          import requests

          import urllib.request

          import base64

          import ssl

          ssl._create_default_https_context = ssl._create_unverified_context

          # 1. 使用requests.session獲取圖片并進行本地保存

          headers = {

          "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"

          , 'Host': 'www.xqb5200.com'

          , 'Referer': 'https://www.xqb5200.com/login.php'

          }

          session = requests.Session() # 使用session是為了保證驗證碼的請求和登陸請求信息一致

          code_image_url = "https://www.xqb5200.com/checkcode.php"

          r = session.get(code_image_url, headers=headers)

          with open('code.jpg', 'wb') as fp:

          fp.write(r.content)

          # 2. 使用打碼平臺識別圖片

          # 修改API說明修改接口地址

          url = 'https://imgurlocr.market.alicloudapi.com/urlimages'

          method = 'POST'

          appcode = '你的APPCODE'

          querys = ''

          bodys = {}

          f = open(r'code.jpg', 'rb')

          contents = base64.b64encode(f.read())

          f.close()

          bodys['image'] = bytes("data:image/jpg;base64,", encoding="utf8")+contents

          post_data = urllib.parse.urlencode(bodys).encode(encoding='UTF8')

          request = urllib.request.Request(url, post_data)

          # 根據(jù)API的要求,定義相對應(yīng)的Content-Type

          request.add_header('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')

          request.add_header('Authorization', 'APPCODE ' + appcode)

          ctx = ssl.create_default_context()

          ctx.check_hostname = False

          ctx.verify_mode = ssl.CERT_NONE

          response = urllib.request.urlopen(request, context=ctx)

          content = response.read()

          if (content):

          code = json.loads(content.decode('utf-8'))

          print(code)

          print(code['result']['words'])

          # 3. 獲取登錄鏈接,登陸鏈接是一個post請求,并攜帶了你的表單中填入的用戶名和密碼

          login_url = "https://www.xqb5200.com/login.php?do=submit"

          # 用戶名和密碼大家可以注冊一個新的用戶

          data = {

          "username": "你的用戶名",

          "password": "你的秘密",

          "checkcode": code,

          "action": "login",

          "submit": "%26%23160%3B%B5%C7%26%23160%3B%26%23160%3B%C2%BC%26%23160%3B"

          }

          # 4. 登陸獲取cookies, 才能去訪問用戶的個人頁

          response = session.post(url=login_url, headers=headers, data=data)

          response.encoding = 'utf-8'

          cookies = response.cookies

          # 查看登陸是否成功了

          with open('logsucess.html', 'wb') as fp:

          response.encoding = response.apparent_encoding

          fp.write(response.content)

          這樣我們還是可以識別這個驗證碼的,如圖

        Picture(8)

          最后保存到本地的文件,顯示登陸成功

        Picture(9)

          還有滑動驗證碼和點觸驗證碼的使用以及selenium+驗證碼登陸,期待下篇文章給大家分享...

        tags:
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
        免費領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學 138****2860 剛剛成功領(lǐng)取
        王同學 131****2015 剛剛成功領(lǐng)取
        張同學 133****4652 剛剛成功領(lǐng)取
        李同學 135****8607 剛剛成功領(lǐng)取
        楊同學 132****5667 剛剛成功領(lǐng)取
        岳同學 134****6652 剛剛成功領(lǐng)取
        梁同學 157****2950 剛剛成功領(lǐng)取
        劉同學 189****1015 剛剛成功領(lǐng)取
        張同學 155****4678 剛剛成功領(lǐng)取
        鄒同學 139****2907 剛剛成功領(lǐng)取
        董同學 138****2867 剛剛成功領(lǐng)取
        周同學 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        快速通道
        东光县| 剑川县| 山西省| 廉江市| 贵溪市| 华安县| 高青县| 日照市| 安化县| 陆良县| 山阴县| 翁源县| 防城港市| 衡阳市| 临高县| 大荔县| 崇仁县| 和田县| 道孚县| 北流市| 稷山县| 临沭县| 西乌珠穆沁旗| 集安市| 重庆市| 东丽区| 睢宁县| 镇远县| 开平市| 静海县| 花莲县| 赣榆县| 铁力市| 年辖:市辖区| 宣武区| 双辽市| 宁蒗| 周宁县| 临江市| 新邵县| 平阳县|