• 反爬篇 | 手把手教你处理 JS 逆向之图片伪装


    5058ee85fb4aca0cb9520b1c94154f61.png

    大家好,我是安果!

    最近打算更新反爬系列相关的内容,第一篇就从最简单的「 图片伪装 」开始吧

    图片伪装是在网页元素中,将文字、图片混合在一起进行展示,以此限制爬虫程序直接获取网页内容

    目标对象:

    aHR0cHM6Ly93d3cuZ3hyYy5jb20vam9iRGV0YWlsL2Q2NmExNjQxNzc2MjRlNzA4MzU5NWIzMjI1ZWJjMTBi

    1 - 分析

    打开页面,分析页面发现网页源码中的电话号码默认是隐藏保护的

    并且要查看电话号码,必须先通过账号进行登录操作

    db452c13a35acb69df6e053f7d364b29.png

    完成登录后,点击页面上的查看按钮会调用一个接口,随后电话号码就完全展示出来了

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

    PS:该 URL 地址中 b2147f6a-6ec7-403e-a836-62978992841b 在网页源码中可以获取,与企业一一对应

    8b5bf233c7a4ccb6bffa115c90f11114.png

    通过下图,我们发现上面接口响应值中的「 tel 」字段可以拼接成一张图片,该图片中的内容与电话号码一致

    因此,我们只需要下载这张图片,利用 OCR 进行识别即可以

    c09056094829f314c0455090c4f46137.png

    2 - 实现

    由于该网站上的文字图片背景很干净,因此不需要额外的训练来提升文字识别率

    首先,我们调用接口获取电话号码一一对应的 tel 字段

    1. import requests
    2. headers = {
    3.     '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',
    4.     'Cookie''***'
    5. }
    6. # 获取手机号码对应的tel字段id(一一对应)
    7. def get_tel_id():
    8.     # b2147f6a-6ec7-403e-a836-62978992841b对应企业,也是一一对应关系(网页源码)
    9.     url = "https://**/getentcontacts/b2147f6a-6ec7-403e-a836-62978992841b"
    10.     payload = {}
    11.     resp = requests.request("GET", url, headers=headers, data=payload).json()
    12.     tel_id = resp.get("tel")
    13.     return tel_id

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

    最后,就可以对图片进行文字识别了

    这里介绍 2 种方式:

    • 百度 OCR

    • pytesseract

    2-1  百度 OCR

    首先,安装依赖包

    1. # 安装依赖包
    2. pip3 install baidu-aip

    然后,创建一个用于文字识别的应用,获取应用的 APP_ID、API_KEY、SECRET_KEY 数据

    最后,参考官方文档调用下面的方法识别图片,获取手机号码数据

    官网文档:

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

    1. from aip import AipOcr
    2. def get_phone(tel_id):
    3.     """
    4.     百度OCR识别图片,获取文字内容
    5.     :param tel_id:
    6.     :return:
    7.     """
    8.     url = f'https://www.**.com/home/Phone/{tel_id}'
    9.     APP_ID = '262**'
    10.     API_KEY = '1btP8uUSzfDbji**'
    11.     SECRET_KEY = 'NGm6NgAM5ajHcksKs0**'
    12.     client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    13.     result = client.basicGeneralUrl(url)
    14.     # {'words_result': [{'words''0771-672**'}], 'words_result_num'1'log_id'1527210***}
    15.     print('识别到的手机号码为:', result)

    2-2 pytesseract

    同样,我们需要先安装文字识别、图片处理的依赖包

    1. # 安装依赖包
    2. pip3 install pillow
    3. pip3 install pytesseract

    然后,根据图片 URL 地址获取图片字节流,最后利用 pytesseract 识别图片中文字即可

    1. import io
    2. import pytesseract
    3. import requests
    4. from PIL import Image
    5. if __name__ == '__main__':
    6.     # 获取手机号码的URL地址
    7.     image_url = f'https://www.**.com/home/Phone/{get_tel_id()}'
    8.     resp = requests.get(image_url, headers=headers)
    9.     # images.content: 获取图片的二进制字节流
    10.     # io.BytesIO(): 操作处理二进制数据
    11.     # Image.open(): 打开图片字节流,得到一个图片对象
    12.     images_c = Image.open(io.BytesIO(resp.content))
    13.     # 利用pytesseract识别出图片中的字符串,即为手机号码
    14.     phone = pytesseract.image_to_string(images_c)
    15.     print(f'联系方式: {phone}')

    以上就是应用图片伪装常规的处理方式,我们只需要找出图片的生成规则,然后利用 OCR 进行识别成文本,最后组装在一起即可

    如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

    推荐阅读

    用 Python 远程控制 Windows 服务器,太好用了!

    JavaScript 逆向爬虫中的浏览器调试常见技巧

    JavaScript 逆向爬虫中的浏览器调试常见技巧(下)

    END

    好文和朋友一起看~

  • 相关阅读:
    量子计算(十一):常见逻辑门以及含义
    【pandas小技巧】--修改列的名称
    Python 深拷贝和浅拷贝的区别
    springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028
    Mac 取消系统更新的红点——强迫症晚期患者
    C语言--判断年月日是否合理
    14 卡尔曼滤波及代码实现
    智慧地铁| 云计算为城市地铁交通注入智慧
    C++算法 —— 动态规划(7)两个数组的dp
    TeeChart Pro for .NET 2022.10.24 Crack
  • 原文地址:https://blog.csdn.net/hsh881025/article/details/124958253