最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲(chóng)如何解決圖片驗(yàn)證碼

 更新時(shí)間:2021年02月14日 09:28:32   作者:青衫不改就人還  
這篇文章主要介紹了python爬蟲(chóng)如何解決圖片驗(yàn)證碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

之前剛開(kāi)始做爬蟲(chóng)的時(shí)候遇到過(guò)登錄驗(yàn)證碼問(wèn)題,看過(guò)很多帖子都沒(méi)有解決我的問(wèn)題,發(fā)現(xiàn)大多數(shù)帖子都是治標(biāo)不治本,于是想分享一下自己的解決方案。本次采用的網(wǎng)站是古詩(shī)文網(wǎng),使用百度API,因?yàn)榘俣華PI免費(fèi)!免費(fèi)!免費(fèi)!適合自己學(xué)習(xí)的時(shí)候使用。如果還沒(méi)有使用過(guò)百度API識(shí)別驗(yàn)證碼的朋友可以看一下我的這個(gè)帖子。
以下案例采用的時(shí)古詩(shī)文網(wǎng):登錄古詩(shī)文網(wǎng),

1、selenium處理圖片驗(yàn)證碼

先定位到驗(yàn)證碼圖片,在獲取驗(yàn)證碼圖片在頁(yè)面中的位置,使用save_screenshot截取頁(yè)面,再根據(jù)圖片的位置去截取驗(yàn)證碼,最后通過(guò)接口識(shí)別文字獲取驗(yàn)證碼,直接上代碼:

element = driver.find_element_by_id('imgCode') # 定位驗(yàn)證碼圖片
# 獲取驗(yàn)證碼圖片在網(wǎng)頁(yè)中的位置
left = int(element.location['x'])  # 獲取圖片左上角坐標(biāo)x
top = int(element.location['y'])  # 獲取圖片左上角y
right = int(element.location['x'] + element.size['width'])    # 獲取圖片右下角x
bottom = int(element.location['y'] + element.size['height'])  # 獲取圖片右下角y

# 通過(guò)Image處理圖像
path = current_dir + str(random.random()) + '.png'  # 生成隨機(jī)文件名
driver.save_screenshot(path)    # 截取當(dāng)前窗口并保存圖片
im = Image.open(path)        # 打開(kāi)圖片
im = im.crop((left, top, right, bottom))  # 截圖驗(yàn)證碼
im.save(path)    # 保存驗(yàn)證碼圖片

# 使用百度API識(shí)別驗(yàn)證碼
def get_code():
  client = AipOcr(APP_ID, API_KEY, SECRET_KEY)  # 百度API文檔中提供的方法識(shí)別文字

  # 由于我處理的驗(yàn)證碼圖片沒(méi)有填多的線條,所以直接采用灰度是驗(yàn)證碼數(shù)字更加清晰,具體的處理方式可根據(jù)驗(yàn)證碼的實(shí)際情況而定
  im = Image.open(path)
  # 轉(zhuǎn)換為灰度圖像
  im = im.convert('L')
  im.save(path)

  # 讀取圖片,應(yīng)為百度API中提供的方法參數(shù)只能是字節(jié)流
  with open(path, 'rb')as f:
    image = f.read()
  # 使用API中提供的方法識(shí)別驗(yàn)證碼并返回驗(yàn)證碼
  code = client.basicGeneral(image)

  print(code['words_result'][0]['words']) # {'words_result': [{'words': '4TBiD ', 'location': {'top': 1, 'left': 6, 'width': 43, 'height': 13}}], 'log_id': 1358288307112378368, 'words_result_num': 1}
  return code['words_result'][0]['words']

2、使用requests請(qǐng)求驗(yàn)證碼

這里用到了會(huì)話機(jī)制,對(duì)于初學(xué)者來(lái)說(shuō)可能不太了解,簡(jiǎn)單說(shuō)一下會(huì)話機(jī)制的作用,會(huì)話就是用來(lái)保存你之前請(qǐng)求的cookie,讓瀏覽器知道你之前就在這里,這樣瀏覽器就不會(huì)認(rèn)為你重新來(lái)到這里,從而刷新驗(yàn)證碼,這樣就可以帶著我們獲取的驗(yàn)證碼去登錄了。

conn = requests.Sessoin(  # 創(chuàng)建會(huì)話
resp = conn.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
selector = Selector(text=resp.text)
img_url = 'https://so.gushiwen.cn/'+selector.xpath('.//img[@id="imgCode"]/@src').get() # 獲取圖片的路由
img = conn.get(img_url)  # 保持會(huì)話請(qǐng)求
filename = str(random.random()) + '.png'
with open(filename, 'wb')as f:
  f.write(img.content)
# 為了后面的調(diào)用接口識(shí)別不報(bào)圖片格式錯(cuò)誤,進(jìn)行一次圖片轉(zhuǎn)換
im = Image.open(filename)
im.save(filename)
# 使用二進(jìn)制方式讀取圖片
with open(filename, 'rb')as f:
image = f.read()
data = client.handwriting(image)  # diao'yong
# 使用API中提供的方法識(shí)別驗(yàn)證碼并返回驗(yàn)證碼
code = client.basicGeneral(image)
code = code['words_result'][0]['words']

selenium源碼

# -* coding: utf-8 *-

import time
import random
from PIL import Image
from aip import AipOcr
from selenium.webdriver import Chrome

# 百度API參數(shù)
APP_ID = '23647800'
API_KEY = 'n95KOQgVuOMoAP72qZZo7uoN'
SECRET_KEY = '7yhyGglHUsY52DD8kf4w0Qjnxum07hMK'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 調(diào)用API接口


def scrapy(username, password):
  """
  :param username:  用戶名
  :param password:  密碼
  """
  driver = Chrome()
  driver.get('https://so.gushiwen.cn/user/login.aspx')
  driver.find_element_by_id('email').send_keys(username) # 輸入賬號(hào)
  driver.find_element_by_id('pwd').send_keys(password)  # 輸入密碼

  element = driver.find_element_by_id('imgCode') # 定位驗(yàn)證碼圖片
  # 獲取驗(yàn)證碼圖片在網(wǎng)頁(yè)中的位置
  left = int(element.location['x']) # 獲取圖片左上角坐標(biāo)x
  top = int(element.location['y']) # 獲取圖片左上角y
  right = int(element.location['x'] + element.size['width']) # 獲取圖片右下角x
  bottom = int(element.location['y'] + element.size['height']) # 獲取圖片右下角y

  # 通過(guò)Image處理圖像
  filename = str(random.random()) + '.png' # 生成隨機(jī)文件名
  driver.save_screenshot(filename) # 截取當(dāng)前窗口并保存圖片
  im = Image.open(filename) # 打開(kāi)圖片
  im = im.crop((left, top, right, bottom)) # 截圖驗(yàn)證碼
  im.save(filename) # 保存驗(yàn)證碼圖片
  # 由于我處理的驗(yàn)證碼圖片沒(méi)有填多的線條,所以直接采用灰度是驗(yàn)證碼數(shù)字更加清晰,具體的處理方式可根據(jù)驗(yàn)證碼的實(shí)際情況而定
  im = Image.open(filename)
  # 轉(zhuǎn)換為灰度圖像
  im = im.convert('L')
  im.save(filename)
  # 讀取圖片,應(yīng)為百度API中提供的方法參數(shù)只能是字節(jié)流
  with open(filename, 'rb')as f:
    image = f.read()
  # 使用API中提供的方法識(shí)別驗(yàn)證碼并返回驗(yàn)證碼
  data = client.basicGeneral(image)
  try:
    code = data['words_result'][0]['words']
  except:
    return data['error_msg']

  driver.find_element_by_id('code').send_keys(code)  # 輸入驗(yàn)證碼
  driver.find_element_by_id('denglu').click()   # 點(diǎn)擊登錄
  time.sleep(1000)  # 為了看清登錄,等待1000秒


if __name__ == '__main__':
  print(scrapy(username, password)) # 傳入你在古詩(shī)文網(wǎng)注冊(cè)的賬號(hào)密碼

requests源碼

# -* coding: utf-8 *-
import os
import random
import re
import requests
from PIL import Image
from aip import AipOcr
from scrapy import Selector

headers = {
  'referer': 'https://so.gushiwen.cn/user/login.aspx',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}

# 百度API參數(shù)
APP_ID = '23647800'
API_KEY = 'n95KOQgVuOMoAP72qZZo7uoN'
SECRET_KEY = '7yhyGglHUsY52DD8kf4w0Qjnxum07hMK'

def scrapy(username, password):
  """
  :param username:  用戶名
  :param password:  密碼
  """
  client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 調(diào)用API接口
  conn = requests.Session() # 創(chuàng)建會(huì)話
  resp = conn.get('https://so.gushiwen.cn/user/login.aspx', headers=headers) # 獲取登錄頁(yè)面
  selector = Selector(text=resp.text)
  __VIEWSTATE = selector.xpath('.//input[@id="__VIEWSTATE"]/@value').get()
  __VIEWSTATEGENERATOR = selector.xpath('.//input[@id="__VIEWSTATEGENERATOR"]/@value').get()
  img_url = 'https://so.gushiwen.cn/' + selector.xpath('.//img[@id="imgCode"]/@src').get() # 獲取圖片的路由
  img = conn.get(img_url, headers=headers) # 獲取圖片路由
  # 保存圖片
  filename = str(random.random()) + '.png' # 隨機(jī)生成文件名, 圖片格式不能為jpg,API不支持jpg格式的識(shí)別
  with open(filename, 'wb')as f:
    f.write(img.content)
   # 由于我處理的驗(yàn)證碼圖片沒(méi)有填多的線條,所以直接采用灰度是驗(yàn)證碼數(shù)字更加清晰,具體的處理方式可根據(jù)驗(yàn)證碼的實(shí)際情況而定
  im = Image.open(filename)
  # 轉(zhuǎn)換為灰度圖像
  im = im.convert('L')
  im.save(filename)
  # 使用二進(jìn)制方式讀取圖片
  with open(filename, 'rb')as f:
    image = f.read()
  # # 標(biāo)準(zhǔn)識(shí)別, 每天免費(fèi)50000次
  # data = client.basicGeneral(image)
  # 精確識(shí)別,每天免費(fèi)500次
  data = client.handwriting(image)
  # 捕獲一下接口識(shí)別當(dāng)中的錯(cuò)誤,可參照文檔查看報(bào)錯(cuò)原因
  try:
    code = data['words_result'][0]['words']
  except:
    return data['error_msg']
  form_data = {
    '__VIEWSTATE': __VIEWSTATE,
    '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
    'from': '',
    'email': username,
    'pwd': password,
    'code':cod,
    'denglu': '登錄'
  }
  # 登錄
  html = conn.post('https://so.gushiwen.cn/user/login.aspx', headers=headers, data=form_data).text
  # 獲取登錄標(biāo)志位
  login_flag = re.findall("alert\('(.*?)'\);",html)[0] if re.findall("alert\('(.*?)'\);",html) else ''
  if not login_flag:
    return '登錄成功!'
  elif '驗(yàn)證碼有誤!' in login_flag:
    return "驗(yàn)證碼錯(cuò)誤"


if __name__ == '__main__':
  print(scrapy(username, password))

以上就是python爬蟲(chóng)如何解決圖片驗(yàn)證碼的詳細(xì)內(nèi)容,更多關(guān)于python 解決圖片驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Python實(shí)現(xiàn)首頁(yè)通知功能

    使用Python實(shí)現(xiàn)首頁(yè)通知功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)首頁(yè)通知功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Django中如何使用celery異步發(fā)送短信驗(yàn)證碼詳解

    Django中如何使用celery異步發(fā)送短信驗(yàn)證碼詳解

    Celery是Python開(kāi)發(fā)的分布式任務(wù)調(diào)度模塊,這篇文章主要給大家介紹了關(guān)于Django中如何使用celery異步發(fā)送短信驗(yàn)證碼的相關(guān)資料,主要內(nèi)容包括基礎(chǔ)介紹、工作原理、完整代碼等方面,需要的朋友可以參考下
    2021-09-09
  • 使用Python可視化展示排序算法

    使用Python可視化展示排序算法

    這篇文章主要介紹了使用Python可視化展示排序算法,讓我們創(chuàng)建一個(gè)名為algorithm?.py的文件,在這個(gè)文件中,我們將用python編寫(xiě)所有的排序算法,需要的朋友可以參考下
    2024-11-11
  • python str與repr的區(qū)別

    python str與repr的區(qū)別

    repr() 輸出對(duì) Python比較友好,而str()的輸出對(duì)用戶比較友好。雖然如此,很多情況下這三者的輸出仍然都是完全一樣的
    2013-03-03
  • 解析pandas apply() 函數(shù)用法(推薦)

    解析pandas apply() 函數(shù)用法(推薦)

    這篇文章主要介紹了pandas apply() 函數(shù)用法,大家需要掌握函數(shù)作為一個(gè)對(duì)象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-10-10
  • python中enumerate() 與zip()函數(shù)的使用比較實(shí)例分析

    python中enumerate() 與zip()函數(shù)的使用比較實(shí)例分析

    這篇文章主要介紹了python中enumerate()與zip()函數(shù)的使用比較,結(jié)合實(shí)例形式分析了enumerate()與zip()函數(shù)的功能、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 實(shí)例介紹Python中整型

    實(shí)例介紹Python中整型

    在本篇內(nèi)容中我們通過(guò)實(shí)例分享了關(guān)于Python中整型的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-02-02
  • TensorFlow神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)之張量與變量概念

    TensorFlow神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)之張量與變量概念

    這篇文章主要為大家介紹了TensorFlow神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的基本知識(shí)張量與變量概念詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • 在python中創(chuàng)建指定大小的多維數(shù)組方式

    在python中創(chuàng)建指定大小的多維數(shù)組方式

    今天小編就為大家分享一篇在python中創(chuàng)建指定大小的多維數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11
  • python?利用?PrettyTable?美化表格

    python?利用?PrettyTable?美化表格

    這篇文章主要介紹了python?利用?PrettyTable?美化表格,首先按行設(shè)置數(shù)據(jù)展開(kāi)相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04

最新評(píng)論

乐都县| 棋牌| 德江县| 普格县| 凯里市| 隆尧县| 鹤庆县| 蕲春县| 六盘水市| 峨边| 于都县| 晋中市| 含山县| 乌拉特前旗| 楚雄市| 蓬溪县| 台中县| 常山县| 汉沽区| 阜宁县| 乌拉特前旗| 泸定县| 大新县| 西峡县| 石门县| 广灵县| 阳高县| 三亚市| 大田县| 赫章县| 广州市| 策勒县| 庆阳市| 绥阳县| 全南县| 苏尼特左旗| 阜新市| 白水县| 平谷区| 盐津县| 读书|