最近打算更新反爬系列相干的内容,第一篇就从最简略的「 图片假装 」开始吧
图片假装是在网页元素中,将文字、图片混合在一起进行展现,以此限度爬虫程序间接获取网页内容
指标对象:
aHR0cHM6Ly93d3cuZ3hyYy5jb20vam9iRGV0YWlsL2Q2NmExNjQxNzc2MjRlNzA4MzU5NWIzMjI1ZWJjMTBi
1 – 剖析
关上页面,剖析页面发现网页源码中的电话号码默认是暗藏爱护的
并且要查看电话号码,必须先通过账号进行登录操作
实现登录后,点击页面上的查看按钮会调用一个接口,随后电话号码就齐全展现进去了
https://**/getentcontacts/b2147f6a-6ec7-403e-a836-62978992841b
PS:该 URL 地址中 b2147f6a-6ec7-403e-a836-62978992841b 在网页源码中能够获取,与企业一一对应
通过下图,咱们发现下面接口响应值中的「 tel 」字段能够拼接成一张图片,该图片中的内容与电话号码统一
因而,咱们只须要下载这张图片,利用 OCR 进行辨认即能够
2 – 实现
因为该网站上的文字图片背景很洁净,因而不须要额定的训练来晋升文字识别率
首先,咱们调用接口获取电话号码一一对应的 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': '***' } # 获取手机号码对应的tel字段id(一一对应) def get_tel_id(): # b2147f6a-6ec7-403e-a836-62978992841b对应企业,也是一一对应关系(网页源码) 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
而后,创立一个用于文字辨认的利用,获取利用的 APP_ID、API_KEY、SECRET_KEY 数据\
最初,参考官网文档调用上面的办法辨认图片,获取手机号码数据
官网文档:
https://cloud.baidu.com/doc/O…
from aip import AipOcr def get_phone(tel_id): """ 百度OCR辨认图片,获取文字内容 :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
而后,依据图片 URL 地址获取图片字节流,最初利用 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: 获取图片的二进制字节流 # io.BytesIO(): 操作解决二进制数据 # Image.open(): 关上图片字节流,失去一个图片对象 images_c = Image.open(io.BytesIO(resp.content)) # 利用pytesseract辨认出图片中的字符串,即为手机号码 phone = pytesseract.image_to_string(images_c) print(f'联系方式: {phone}')
以上就是利用图片假装惯例的解决形式,咱们只须要找出图片的生成规定,而后利用 OCR 进行辨认成文本,最初组装在一起即可
以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。