电竞比分网-中国电竞赛事及体育赛事平台

分享

反爬篇 | 手把手教你處理 JS 逆向之圖片偽裝

 AirPython 2022-05-24 發(fā)布于重慶

大家好,我是安果!

最近打算更新反爬系列相關(guān)的內(nèi)容,第一篇就從最簡單的「 圖片偽裝 」開始吧

圖片偽裝是在網(wǎng)頁元素中,將文字、圖片混合在一起進行展示,以此限制爬蟲程序直接獲取網(wǎng)頁內(nèi)容

目標(biāo)對象:

aHR0cHM6Ly93d3cuZ3hyYy5jb20vam9iRGV0YWlsL2Q2NmExNjQxNzc2MjRlNzA4MzU5NWIzMjI1ZWJjMTBi

1 - 分析

打開頁面,分析頁面發(fā)現(xiàn)網(wǎng)頁源碼中的電話號碼默認(rèn)是隱藏保護的

并且要查看電話號碼,必須先通過賬號進行登錄操作

完成登錄后,點擊頁面上的查看按鈕會調(diào)用一個接口,隨后電話號碼就完全展示出來了

https://**/getentcontacts/b2147f6a-6ec7-403e-a836-62978992841b

PS:該 URL 地址中 b2147f6a-6ec7-403e-a836-62978992841b 在網(wǎng)頁源碼中可以獲取,與企業(yè)一一對應(yīng)

通過下圖,我們發(fā)現(xiàn)上面接口響應(yīng)值中的「 tel 」字段可以拼接成一張圖片,該圖片中的內(nèi)容與電話號碼一致

因此,我們只需要下載這張圖片,利用 OCR 進行識別即可以

2 - 實現(xiàn)

由于該網(wǎng)站上的文字圖片背景很干凈,因此不需要額外的訓(xùn)練來提升文字識別率

首先,我們調(diào)用接口獲取電話號碼一一對應(yīng)的 tel 字段

import requests

headers = {
    'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36',
    'Cookie''***'
}

# 獲取手機號碼對應(yīng)的tel字段id(一一對應(yīng))
def get_tel_id():
    # b2147f6a-6ec7-403e-a836-62978992841b對應(yīng)企業(yè),也是一一對應(yīng)關(guān)系(網(wǎng)頁源碼)
    url = "https://**/getentcontacts/b2147f6a-6ec7-403e-a836-62978992841b"

    payload = {}

    resp = requests.request("GET", url, headers=headers, data=payload).json()
    tel_id = resp.get("tel")
    return tel_id

然后,利用上面的 tel 字段組成圖片 URL 地址

最后,就可以對圖片進行文字識別了

這里介紹 2 種方式:

  • 百度 OCR

  • pytesseract

2-1  百度 OCR

首先,安裝依賴包

# 安裝依賴包
pip3 install baidu-aip

然后,創(chuàng)建一個用于文字識別的應(yīng)用,獲取應(yīng)用的 APP_ID、API_KEY、SECRET_KEY 數(shù)據(jù)

最后,參考官方文檔調(diào)用下面的方法識別圖片,獲取手機號碼數(shù)據(jù)

官網(wǎng)文檔:

https://cloud.baidu.com/doc/OCR/s/wkibizyjk

from aip import AipOcr

def get_phone(tel_id):
    """
    百度OCR識別圖片,獲取文字內(nèi)容
    :param tel_id:
    :return:
    """

    url = f'https://www.**.com/home/Phone/{tel_id}'
    APP_ID = '262**'
    API_KEY = '1btP8uUSzfDbji**'
    SECRET_KEY = 'NGm6NgAM5ajHcksKs0**'
    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    result = client.basicGeneralUrl(url)
    # {'words_result': [{'words': '0771-672**'}], 'words_result_num': 1, 'log_id': 1527210***}
    print('識別到的手機號碼為:', result)

2-2 pytesseract

同樣,我們需要先安裝文字識別、圖片處理的依賴包

# 安裝依賴包
pip3 install pillow
pip3 install pytesseract

然后,根據(jù)圖片 URL 地址獲取圖片字節(jié)流,最后利用 pytesseract 識別圖片中文字即可

import io
import pytesseract
import requests
from PIL import Image

if __name__ == '__main__':
    # 獲取手機號碼的URL地址
    image_url = f'https://www.**.com/home/Phone/{get_tel_id()}'

    resp = requests.get(image_url, headers=headers)

    # images.content: 獲取圖片的二進制字節(jié)流
    # io.BytesIO(): 操作處理二進制數(shù)據(jù)
    # Image.open(): 打開圖片字節(jié)流,得到一個圖片對象
    images_c = Image.open(io.BytesIO(resp.content))

    # 利用pytesseract識別出圖片中的字符串,即為手機號碼
    phone = pytesseract.image_to_string(images_c)

    print(f'聯(lián)系方式: {phone}')

以上就是應(yīng)用圖片偽裝常規(guī)的處理方式,我們只需要找出圖片的生成規(guī)則,然后利用 OCR 進行識別成文本,最后組裝在一起即可

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多