python常見反爬蟲類型(驗證碼)

注:筆記大部分來源書本,僅供學習交流:【Python3反爬蟲原理與繞過實戰—韋世東】

  • 將爬蟲的爬取過程分爲網絡請求,文本獲取和數據提取3個部分。
  • 信息校驗型反爬蟲主要出現在網絡請求階段,這個階段的反爬蟲理念以預防爲主要目的,儘可能拒絕反爬蟲程序的請求。
  • 動態渲染、文本混淆則出現在文本獲取及數據提取階段,這個階段的反爬蟲理念以保護數據爲主要目的,儘可能避免爬蟲獲得重要數據
  • 特徵識別反爬蟲通過客戶端的特徵、屬性或用戶行爲特點來區分正常用戶和爬蟲程序的手段
  • APP網絡傳輸和數據收發相對隱蔽,用戶無法直接查看客戶端發出的請求信息和服務端返回的響應內容,也無法直接查看App的代碼,構成了反爬蟲
  • 驗證碼是指能夠區分用戶是計算機或者是人類的全自動程序,驗證碼可以有效防止惡意註冊、刷票、論壇“灌水”等有損網站利益的行爲。驗證碼的原理很簡單:人類有主觀意識,能夠根據要求執行操作,而計算機卻不能。
  • 1、python常見反爬蟲類型(信息校驗型、動態渲染、文本混淆、特徵識別反爬蟲等)
  • 2、python常見反爬蟲類型(App反爬蟲等)

6、驗證碼

  • 常見的有字符驗證碼、滑動驗證碼、拼圖驗證碼、和文字點選驗證碼等
(1)字符驗證碼
  • 字符驗證碼是指用數字、字母、漢字和標點符號等字符作爲元素的圖片驗證碼;
  • 難點:部分驗證碼帶有彩色背景斜線、噪點、字符扭曲、角度旋轉和文字重疊等方法。圖片中的字符顏色與背景顏色並沒有強烈的反差,這些因素都會影響識別效果。要想提高識別成功率,就必須對圖片進行處理
  • 方法:例如降低斜線和噪點對文字的干擾,增強背景色與字符顏色的反差,也就是對圖片進行灰度處理(去掉彩色)和二值化處理(降低干擾、增強顏色反差)
  • 二值化處理:其實是根據閾值調整原圖的像素值,將大於閾值的像素點顏色改爲白色,小於閾值的像素點改爲黑色,這樣就能夠達到增強顏反差的目的
  • 字符驗證碼主要由數字、大寫字母、彩色斜線、彩色噪點和彩色背景組成,圖像分爲3層,最底層爲背景色,字符(數字和大寫字母)層在背景色之上,干擾(斜線和噪點)層則在最上面,

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

from PIL import Image


def handler(grays, threshold=160):
    """
    對灰度圖片進行二值化處理,默認閾值爲160,可根據實際情況調整
    """
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    anti = grays.point(table, "1")
    return anti


#  灰度處理
images = "code.png"
gray = Image.open(images).convert("L")
gray.show()
# 二值化處理
image = handler(gray)
image.show()

深度學習基本瞭解

  • 深度學習:它是機器學習研究中的一個新領域,動機在於建立能夠模擬人腦進行分析學習的神經網絡,希望模仿人腦的機制來解釋數據,例如圖像、聲音和文本;
  • 深度學習術語:比如教計算機認識圖中的文字的過程叫做“訓練”,形成的記憶叫做“模型”,而識別圖片中的內容叫做“預測”;訓練樣本的質量直接影響預測準確率;
  • 卷積神經網絡:包含卷積計算且具有深度結構的前饋神經網絡;卷積神經網絡中常見的概念有輸入層、圖片數字化處理、卷積層、卷積運算、池化層、全連接層和輸出層等。
輸入層
用於輸入整個神經網絡的數據。舉個例子:在用於處理圖片驗證碼的卷積神經網絡中,輸入的數據是一張驗證碼圖片。計算機擅長處理數字,在將圖片傳入卷積神經網絡前需要將圖片進行數字化處理;
圖片數字化處理
先將圖片轉換爲像素矩陣,然後將像素矩陣轉換爲張量的過程,圖片的像素值通常在0~255,圖片數字化實際上是將[0,255]的PIL.Image對象轉換成取值範圍是[0,1.0000]的Tesnsor對象;
卷積層
卷積層的作用是提取圖片對應的像素矩陣的特徵,特徵提取其實就是卷積運算的過程
卷積運算
卷積運算是卷積神經網絡最基本的組成部分之一
池化層
池化層能夠有效縮減數據量,提高計算速度和所提取特徵的健壯性。池化層縮減數據量的方法分爲最大池化(將卷積層傳遞的矩陣拆分爲n✖n單個區域,然後保留該區域像素值中的最大值)和平均池化。
全連接層
全連接層通常出現在卷積神經網絡的最後幾層。它將當前向量進行維度變換,對卷積層和池化層提取到的特徵進行加權計算,最後經過降維轉到Label的維度。它的本質是由一個特徵空間線性變換到另一個特徵空間。卷積層:獲取局部特徵;全連接將卷積層獲取的局部特徵組裝成完整特徵圖的過程。
輸出層
輸出層通常使用歸一化函數softmax輸出分類標籤,得到對應的分類結果
(2)計算型驗證碼
  • 計算型驗證碼在字符驗證碼的基礎上增加了數學運算,它也是將人類視覺和計算機視覺的差異作爲區分用戶的依據;
    在這裏插入圖片描述
  • 對於這種沒有斜線、噪點等干擾元素的驗證碼,我們可以用PyTesseract庫進行識別,根據識別結果選擇運算方法即可,
import pytesseract
import re


def operator_func(a:int, b:int, oper:str) -> int:
    # 接收兩個值和運算符,返回數字運算結果
    if oper == "+":
        return a+b
    if oper == "-":
        return a-b
    if oper == "*":
        return a*b
    
    
strings = pytesseract.image_to_string("paste.png")
result = re.findall(r"\d+", strings)
operator = re.findall(r'[\+|\-|\*]', result)
res = operator_func(int(result[0]), int(result[1]), operator[0])
print(res)
(3)滑動驗證碼
  • 計算機難以準確地完成鼠標按下、拖拽、釋放等行爲,所以開發出了滑動驗證碼
    在這裏插入圖片描述
from selenium import webdriver

browser = webdriver.Chrome()
browser.get("http://www.porters.vip/captcha/sliders.html")
hover = browser.find_element_by_css_selector(".hover")  # 定位滑塊
action = webdriver.ActionChains(browser)
action.click_and_hold(hover).perform()  # 點擊並保持不鬆開
action.move_by_offset(340, 0)  # 設置滑動距離,橫向距離爲340px(390-50),縱向距離爲0px
action.release().perform()  # 鬆開鼠標
(4)滑動拼圖驗證碼
  • 滑動拼圖驗證碼在滑動驗證碼的基礎上增加了隨機滑動距離,用戶需要使用滑動的方式完成拼圖,才能通過校驗(突破口,缺口位置)。
    在這裏插入圖片描述
  • 簡單的,缺口位置可以通過CSS樣式來實現計算
from selenium import webdriver
import re
from parsel import Selector

browser = webdriver.Chrome()
browser.get("http://www.porters.vip/captcha/jigsaw.html")
jigsaw = browser.find_element_by_css_selector("#jigsawCircle")  # 定位滑塊
action = webdriver.ActionChains(browser)
action.click_and_hold(jigsaw).perform()  # 點擊並保持不鬆開

html = browser.page_source  # 返回當前頁面的html代碼
sel = Selector(html)
# 獲取圓角矩形和缺口的css樣式
mbk_style = sel.css("#missblock::attr('style')").get()
tbk_style = sel.css("#targetblock::attr('style')").get()
# 調用匿名函數獲取CSS樣式中的left屬性值
mbk_left = re.search(r"left: (\d+\.?\d+)px", mbk_style).group(1)
tbk_left = re.search(r"left: (\d+\.?\d+)px", tbk_style).group(1)
# 計算當前拼圖驗證碼滑塊所需的移動距離
distance = float(tbk_left) - float(mbk_left)
action.move_by_offset(distance, 0)  # 設置滑動距離,橫向距離爲340px(390-50),縱向距離爲0px
action.release().perform()  # 鬆開鼠標
  • 複雜的,缺口融入到背景圖中,不再使用CSS樣式顯示,將缺口與背景圖繪製在同一個Canvas畫布上,示例
    在這裏插入圖片描述
  • 方法:比較有缺口的圖片和無缺口的圖片像素,找出缺口位置;如使用ImageChops模塊中的difference()方法==對比圖片像素的不同,並獲取圖片差異位置的座標

from selenium import webdriver
from PIL import ImageChops
from PIL import Image

browser = webdriver.Chrome()
browser.get("http://www.porters.vip/captcha/jigsawCanvas.html")
jigsaw = browser.find_element_by_css_selector("#jigsawCircle")  # 定位滑塊
canvas = browser.find_element_by_css_selector("#jigsawCanvas")
canvas.screenshot("before.png")
action = webdriver.ActionChains(browser)
action.click_and_hold(jigsaw).perform()  # 點擊並保持不鬆開
# 執行javascript隱藏圓角矩形的HTML代碼
scripts = """
var missblock = document.getElementById("missblock");
missblock.style['visibility'] = 'hidden';
"""
browser.execute_script(scripts)
# 再次截圖
canvas.screenshot("after.png")
image_a = Image.open("after.png")
image_b = Image.open("before.png")
# 使用ImageChops模塊中的difference()方法對比圖片像素的不同,並獲取圖片差異位置的座標
diff = ImageChops.difference(image_b, image_a)
# 獲取圖片差異位置的座標
diff_position = diff.getbbox()  # (左、上、右、下)
print(diff_position)
position_x = diff_position[0]
action.move_by_offset(int(position_x)-10, 0)
action.release().perform()  # 鬆開鼠標
(5)文字點選驗證碼
  • 點選驗證碼,用戶需要根據頁面給出的驗證要求依次點擊圖片中的文字通過驗證,閱讀驗證要求,按序點擊圖片文字
    在這裏插入圖片描述
  • 目標檢測:通過文字點選驗證碼校驗的關鍵是找到圖片中文字的具體位置。目標檢測是深度學習領域的一個研究方向,常見的應用有人臉識別、自動駕駛等。目標檢測主要用於確定圖片中物體的位置並判斷該物體類型,也就是對圖片中的物體進行定位和分類
  • 深度學習領域中的目標檢測算法有很多,如R-CNN、SSD、YOLO和Faster等
  • 方法:可以使用Darknet框架和YOLO算法實現文字點選驗證碼圖片中的文字定位
  • 突破點:目標定位和識別,通過成熟的深度學習目標檢測技術即可快速而準確地定位到圖片中的目標
(6)鼠標軌跡的檢測和原理
  • 鼠標軌跡指的是鼠標移動的座標集合,它代表鼠標移動的位置和距離;鼠標從頁面的某個位置移動到按鈕的過程中,無論從哪個方向進入,都會產生軌跡;
  • 雖然在移動鼠標時已經儘量避免手臂晃動,但根據黃幕上的移動軌跡和白慕中顯示的座標記錄來看,移動過程中還是有一定的晃動現象
    在這裏插入圖片描述
  • 使用selenium套件點擊按鈕,只會產生1個座標記錄,並不像我們手動點擊時會產生很多的座標記錄;
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.porters.vip/captcha/mousemove.html")
button = browser.find_element_by_class_name("button1")
button.click()
  • 開發者可以根據人類移動鼠標時手臂會晃動這個特點區分正常用戶和爬蟲程序,手臂晃動的特點可以應用在滑動驗證碼中,開發者使用javascript代碼記錄移動滑塊時的鼠標座標信息,然後根據晃動的偏差(即兩個相鄰y座標的差值)實現對爬蟲程序的檢測
  • action.move_by_offset(340, 5),5px的偏移只在滑動操作的最後一刻才發生,要想接近手臂晃動的效果,需要不停的調整這個y參數
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.porters.vip/captcha/mousemove.html")
button = browser.find_element_by_class_name("button1")
action = webdriver.ActionChains(browser)
action.click_and_hold(button).perform()  # 點擊並保持不鬆開
action.move_by_offset(340, 5)  # 設置滑動距離,橫向距離和縱向距離
action.release().perform()  # 鬆開鼠標

在這裏插入圖片描述

  • 相同的距離,人類移動鼠標時,頁面記錄的座標信息叫多,而selenium套件滑動時,頁面記錄的座標信息則比較少,這是因爲鼠標每移動1像素,頁面都會記錄當時的座標,而selenium套件移動時記錄的座標爲move_by_offset()的數量加2,其中2時鼠標按下和釋放時的記錄:鼠標移動50px,人類移動會產生52個座標記錄而selenium套件移動不一定能夠產生52個座標記錄
  • 總結:
    • 開發者可以記錄鼠標移動時的座標信息,座標信息集合就是鼠標軌跡,
    • 人類移動鼠標時,手臂晃動導致y座標小幅度變化,
    • selenium套件可以模擬出人類移動鼠標時的手臂晃動效果,
    • selenium套件移動鼠標時得到的座標記錄數量有可能與人類移動鼠標時得到的座標數量不同
(7)驗證碼種類
  • 滑動驗證碼:騰訊、極驗、網易盾、頂象
  • 圖標點選驗證碼:螺絲帽、網易盾、極驗、天驗
  • 空間推理驗證碼:騰訊、極驗
  • 其它:短信驗證碼、郵箱驗證碼、語語音驗證碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章