
大家好,我是安果!
最近打算更新反爬系列相關(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 種方式:
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 進行識別成文本,最后組裝在一起即可