这是「进击的Coder」的第 655 篇技术分享

作者:星安果

来源:AirPython

阅读本文大概需要 6 分钟。

最近在更新反爬系列相关的内容,这一篇就讲讲最简单的「 图片伪装 」

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

目标对象:

aHR0cHM6Ly93d3cuZ3hyYy5jb20vam9iRGV0YWlsL2Q2NmExNjQxNzc2MjRlNzA4MzU5NWIzMjI1ZWJjMTBi

1 - 分析

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

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

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

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

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

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

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

2 - 实现

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

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

import requestsheaders = {'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/OCR/s/wkibizyjk

from aip import AipOcrdef 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 Imageif __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 进行识别成文本,最后组装在一起即可

End

崔庆才的新书《Python3网络爬虫开发实战(第二版)》已经正式上市了!书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍

扫码购买

点个在看你最好看

手把手教你处理 JS 逆向之图片伪装相关推荐

  1. Python之手把手教你用JS逆向爬取网易云40万+评论并用stylecloud炫酷词云进行情感分析

    本文借鉴了@平胸小仙女的知乎回复 https://www.zhihu.com/question/36081767 写在前面: 文章有点长,操作有点复杂,需要代码的直接去文末即可.想要学习的需要有点耐心 ...

  2. 手把手教你利用js给图片打马赛克

    文章目录 效果演示 Canvas简介 知识点简介 step-by-step 完整代码 效果演示 Canvas简介 这个 HTML 元素是为了客户端矢量图形而设计的.它自己没有行为,但却把一个绘图 AP ...

  3. php转发朋友圈缩略图片,解释最全的,手把手教的微信JS sdk分享设置教程-微信分享插件PHP源码JS-SDK接口,分享到朋友圈 转发好友带缩略图...

    亲们,此文是我上传的有关微信分享插件PHP源码JS-SDK接口的.rar和.zip的说明使用文件 许多朋友都面临自己编写的网站通过微信转发时,无论是分享微信好友或是微信朋友圈时,出现无缩略图显示的问题 ...

  4. 批量改名_手把手教你用Python批量给图片添加水印 | 知了干货分享

    我们在网上浏览一些文章的时候,经常会发现文章中会有一些图片,上面会有一些标识,而这些标识就是我们经常说的水印了.很多时候,我们需要给图片加上一些修饰,好让别人能直观的认识到这个图片的出处以及来源,同时 ...

  5. c++批量重命名_手把手教你用Python批量给图片添加水印 | 知了干货分享

    我们在网上浏览一些文章的时候,经常会发现文章中会有一些图片,上面会有一些标识,而这些标识就是我们经常说的水印了.很多时候,我们需要给图片加上一些修饰,好让别人能直观的认识到这个图片的出处以及来源,同时 ...

  6. 手把手教你如何通过Java给图片添加文字和图片水印

    本文首发于个人网站 前言 最近工作上有个需求,动态生成一张图片,具体来说就是基于模版图片动态添加文字和图片(文字内容不同,图片数目不同),其中文字大小不全一样,且对位置有所要求. 本文将剖析多个技术方 ...

  7. 手机如何压缩jpg图片的大小?手把手教你快速压缩jpg格式图片

    手机如何压缩jpg图片大小?小编给大家推荐一种手机图片压缩jpg方法,打开网站就能在线压缩jpg图片,具体操作步骤一起看一下吧. 1.手机浏览器打开压缩图网站,在更多功能里选择jpg压缩. 2.点击选 ...

  8. 手把手教你用七牛云存储图片

    环境说明:Django + Vue + Element-ui ​   在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方 ...

  9. 【轮子狂魔】手把手教你用JS给博客动态增加目录 - 超级懒人版

    动态显示目录的作用 不用每次写博客的时候繁琐的人工整理目录,又可以动态浮动在右下角,方便快速跳到感兴趣的位置同时也可以快速的对文章内容有一个大概的了解. 实现原理 首先根据个人喜好,我习惯了用 h1 ...

最新文章

  1. linux qt 生成word,Qt 生成word、pdf文檔
  2. CentOS 7系统关闭yum自动下载更新
  3. 为模型推断的端部的大小
  4. 3306端口是什么协议_防黑必备技能之端口篇
  5. CTF Re-Python z3库的使用
  6. mstsc 加密oracle修正,mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法...
  7. WM_PAINT介绍及OnPaint()函数的作用原理
  8. eva每一集片尾曲是谁唱的_evaTV版的片尾曲是不是每集的都不一样啊?
  9. 在Google App Engine中使用hash和marshal持久化模块,快速判断数据库条目是否已经存在...
  10. 7月29日绝地求生服务器维护,绝地求生7月29日维护到几点 7.29吃鸡更新维护公告...
  11. PHP开票接口,云增值税发票API详情
  12. jmail mysql_Jmail组件使用方法及注意事项 | 域名频道
  13. python发送请求给服务器参数传递方式以及服务器响应方式
  14. HTML——响应式布局
  15. 编译出错 Resource temporarily unavailable
  16. python三维矩阵_python三维矩阵
  17. 注册表操作,reg脚本简单编写
  18. PHP检查日期格式是否符合
  19. php服务器响应时间如何设置,php设置浏览器响应时间
  20. 赛桨PaddleScience v1.0 Beta:基于飞桨核心框架的科学计算通用求解器

热门文章

  1. vscode 格式化后函数后空格被删
  2. 体验在终端——参加2012年移动开发者大会有感
  3. 等待输入超时:自动登出
  4. s7五杀大数据英雄_王者七大记录,五杀最多的英雄竟然有他?这英雄跑的比关羽还快!...
  5. 电视机和机顶盒等焦点问题
  6. autojs打开微信扫一扫,扫描二维码等信息的脚本
  7. ie登录显示登录到ftp服务器,Ie浏览器登录ftp服务器
  8. SIMCOM 常用AT指令
  9. 从来不敷面膜的人_女人一旦过了40岁,敷面膜要记住“3不要”,否则还不如不敷!...
  10. CSS遮罩——如何在CSS中使用遮罩