爬虫学习日常记录:enicode反扒技术

练习网址:大众点评

OCR使用:百度智能云字体识别

woff文件阅读工具:mac与win通用

字体反扒:

顾名思义就是让你无法获取他的字体使用enicode编码制作独有的映射,呈现在网页源代码上让你无法阅读明白

通用思路:

1.找到该处所使用的css样式,进入link加载的样式文件

2.获取样式所对应的字体文件

3.获取文字,将编码与文字对应上

4.替换网页上的编码变成文字

找到该处所使用的css样式,进入link加载的样式文件:

从页面源代码head处能找到加载的css文件

找到css文件名字记录下来

接着再页面源代码找到对应的css链接将它提取出来

获取页面源代码中的href:

代码:

import re
from urllib.parse import urljoin
import requests
import parsel
#找到反扒处字体css样式,1,获取本页,2,提取css地址,3,访问链接获得css内容
headers = {"referer": "https://www.dianping.com/","user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36","authority": "www.dpfile.com"
}    #基础伪装
first_resp = requests.get("https://www.dianping.com/shop/H1wZKBk8CTpO454d",headers=headers).text
f_resp = parsel.Selector(first_resp)
css = "http:"+ f_resp.xpath("//link[@type='text/css']/@href").extract()[1]

请求获取来的地址获得css样式内容中的文件下载并保存:

代码:

css_resp = requests.get(url=css,headers=headers).text
#开始定位获取css文件中的字体包路径,需要re定位两次
# re_f = re.compile(".address{font-family: 'PingFangSC-Regular-address';}(?P<fi>.*).review{font-family: '",re.S)
re_f = re.compile("(?P<fi>.*).address{font-family: 'PingFangSC-Regular-address';}",re.S)retext = re_f.search(css_resp).group("fi")
re_s = re.compile(',url\("(?P<fe>.*)"\);}')
re_url = re_s.search(retext).group("fe")
#获得字体包链接
font_url = urljoin(css,re_url)
print(font_url)
#保存
with open("font_pl.woff","wb")as f:f.write(font_resp.content)

用阅读工具打开看看文件中的内容处理编码:

读取文件,将名字提出出来换前缀名\u,因为\的问题所以用\\的方式先写入,再用.encode().decode("unicode-escape")即可解决处理

#读取字体编码
from fontTools.ttLib import ttFont
ttf = ttFont.TTFont("font_pl.woff")
ttf_t = ttf.getGlyphOrder()[2:]
uni_text = list(map(lambda x:"\\u"+x[3:],ttf_t))    #处理成\\ue2b1

将内容画出来然后读取:

#将内容画出来与之对应
from PIL import Image
from PIL import ImageFont
from PIL import  ImageDrawimg = Image.new("RGB",(1800,1000),color=(255,255,255))  #创建图片#准备画笔
img_draw = ImageDraw.Draw(img)#准备画图的字符
img_font = ImageFont.truetype("font_pl.woff",40)#写入图片
new_line = []
line_length = 43#每行43个需要调试出合理的图片
for i in range(len(uni_text)):uni = uni_text[i].encode().decode("unicode-escape")if i % line_length == 0 and i !=0:new_line_s = "".join(new_line)img_draw.text((20,(i//line_length+1)*line_length),new_line_s,fill=1,font=img_font)new_line = [uni]else:new_line.append(uni)
if new_line:new_line_s = "".join(new_line)img_draw.text((20, (i // line_length + 2) * line_length), new_line_s, fill=1, font=img_font)img.save("tu.jpg")

图片:

接着使用OCR将内容读取出来:


from aip import AipOcr""" 你的 APPID AK SK """
APP_ID = '自己appid'
API_KEY = '自己key'
SECRET_KEY = '自己skey'f = open("tu.jpg","rb")
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
r = client.basicGeneral(f.read())result_list = []
for txt in r["words_result"]:result_list.extend(txt["words"])    #将字符串换成listfont_dic = dict(zip(uni_text,result_list))    #zip将内容对应存储
print(font_dic)

现在获得了编码与字体的映射

接着请求到内容后,就可以执行替换,从而实现还原:

headers = {"referer": "https://www.dianping.com/","user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36","authority": "www.dpfile.com"
}
first_resp = requests.get("https://www.dianping.com/shop/H1wZKBk8CTpO454d",headers=headers).text
# first_resp = '<e class="address"></e>穗<e class="address"></e><d class="num"></d>'for un in font_dic:uni = font_dic[un]funi = un.replace("\\u","&#x") + ";"print(funi,uni)first_resp = first_resp.replace(funi,uni)print(first_resp)

将\\u替换成页面源代码中的格式,接着替换掉,最后实现还原:

页面源代码中有许多样式设置了反爬,所以将所有的样式还原出来后,既可还原整个页面

enicode字体反爬,大厂使用的反爬技术,结合OCR处理页面源代码相关推荐

  1. 常见的反爬措施:UA反爬和Cookie反爬

    本文分享自华为云社区<Python爬虫反爬,你应该从这篇博客开启,UA反爬,Cookie 特定参数反爬>,作者:梦想橡皮擦. 通过前面的爬虫程序,你或许已经注意到,对于目标站点来说,爬虫程 ...

  2. java反编译工具_JDA Java反编译工具的下载和使用手册

    JDA(javadecompile analysis)是一款以dex为核心的java反编译工具,同时支持apk.dex.jar文件的反编译,支持动态重命名.该软件主要是用来反编译分析代码而不是反编译出 ...

  3. java中linux下反斜杠,Linux下反斜杠号\引发的思考

    今天在检查home目录时发现有一个名为"\"的文件,觉得很奇怪,从来没见过,就准备用Vim打开看看,很自然地输入命令查看一下,结果居然打不开. ubuntu@ubuntu:~$ v ...

  4. mysql范式与反范式_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”...

    1 第一范式 该范式是为了排除 重复组 的出现,因此要求数据库的每个列的值域都由原子值组成:每个字段的值都只能是单一值.1971年埃德加·科德提出了第一范式.即表中所有字段都是不可再分的. 1.1 实 ...

  5. 从第一范式到第二范式所做的操作是_给女同事讲解MySQL数据库范式与反范式,她直夸我“技术好”

    1 第一范式 该范式是为了排除 重复组 的出现,因此要求数据库的每个列的值域都由原子值组成:每个字段的值都只能是单一值.1971年埃德加·科德提出了第一范式.即表中所有字段都是不可再分的. 1.1 实 ...

  6. php删除双引号,PHP引号前添加反斜杠、去除反斜杠的方法

    本节主要内容: php引号前的反斜杠问题 PHP实现的读写html文档的小程序,提交内容保存时会自动在双引号前面增加一个反斜杠"\",而且每保存一次增加一个反斜杠. 原因: PHP ...

  7. java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠,该怎么解决

    2019独角兽企业重金招聘Python工程师标准>>> java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 java replaceAll() 方法要用 4 ...

  8. Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理

    目录: 一.kubernetes调度介绍 二.nodename节点选择约束 三.nodeSelector 亲和 1.节点亲和 2.节点反亲和 1. pod亲和 2.pod反亲和 四.Taints(污点 ...

  9. IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总,域名历史解析记录查询,IP地址查对应机房名称、地址,查IP地址的AS号码...

    IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总: http://bgp.he.net/,IP地址查对应机房:IP地址在 bgp.he.net 直接能查到IP所属机房或运营商的AS号. ...

最新文章

  1. pycharms怎么看文件被什么引用_误删文件咋办?看我怎么起死回生……
  2. map vs hash_map
  3. python【力扣LeetCode算法题库】面试题62- 圆圈中最后剩下的数字(约瑟夫环)
  4. AD域与外部网站域名相同处理办法
  5. 第25节 典型应用集成技术
  6. visual studio 64位汇编 listing列表文件
  7. PM——【1】维护功能位置主数据
  8. 容器打印日志到控制台阻塞的排障
  9. linux期末作业设计,linux作业与项目设计
  10. python比较运算符重载_python运算符重载
  11. Speed Reading(POJ-3619 )
  12. 5.3Python数据处理篇之Sympy系列(三)---简化操作
  13. HTML5等先关。。。
  14. latex 图片和标题一起旋转
  15. [导入]哪种图像格式最好?
  16. Dato for Mac(菜单栏时钟工具)支持m1
  17. 红黑树模拟软件_红黑树,超强动静图详解,简单易懂
  18. 八位一体共阳极数码管显示电子时钟+闹铃+温度检测
  19. Codeforces 417D.Cunning Gena (状压DP)
  20. Android Rotating Image Wallpaper 自动切换壁纸

热门文章

  1. 浅谈磁场中的正则动量
  2. Qt绑定UI界面和Qt类的四种方法
  3. 【英语魔法俱乐部——读书笔记】 2 中级句型-复句合句(Complex Sentences、Compound Sentences)...
  4. 局部渐近稳定,全局渐进稳定,一致有界,一致最终有界
  5. HTML5七夕情人节表白网页_(唯美满天星)多功能展示(网状球状)3D相册_HTML+CSS+JS 求婚 html生日快乐祝福代码网页 520情人节告白代码 程序员表白源码 抖音3D旋转相册
  6. 上位机PHP_使用最流行的脚本语言PHP制作你的物联网上位机系统(一)
  7. setContentView(R.layout.xxx)出错解决方法
  8. SpringBoot配置拦截器导致swagger失效
  9. 安卓实现ECG心电图功能
  10. (Golang语言编程系列1)window安装GO编译环境