【导语】我们在爬取数据中,会遇到字体乱码的下,其实是字体加密,本篇文章主要解决字体解密这种反爬方式。

1.在浏览器打开58同城网址进入北京租房
2.点击检查,找到房租价格对应位置,发现源码中价格部分是乱码,但是页面显示正常
3.得出结果这段代码是经过字体加密的

我们看到的如下:

那么,按F12查看源码,如下:

【解决思路】

字体加密一般是通过字体文件进行映射,所以我们只需要找到对应的字体文件,然后通过一些手段找到他们字体对应的映射关系就可以破解字体反爬

1、当我们发现字体反爬之后,首先可以找一下是通过哪一个类进行的字体映射,因为字体映射都会在具体的css样式上进行体现
2、我们可以先删除掉自身的一些样式,观察页面变化,当我们删除自身样式或者父类样式之后页面恢复了乱码,就可以确定是哪一个类进行的字体加密

3、通过加密样式寻找字体映射文件方式

字体加密一般是分为两种
①通过base64加密的字体文件,这种文件可以通过python的base64模块进行解密
②通过url的方式引入字体文件

以上两种我们都可以通过搜索对应的加密样式找到具体文件
首先可以在当前页面中搜索是否存在对这个类的定义
如果没有找到可以在network中全局搜索存在这个样式的css文件
找到加密文件之后无论是哪一种加密方式都可以通过python请求获取加密字体文件

4、获取加密文件的代码

通过正则表达式获取加密文件内容
获取到加密文件之后如果想要看里面的内容可以通过base64进行解密,并写入woff文件中
之后可以通过fontTools包将字体文件转为xml进行查看

import re
from fontTools.ttLib import TTFont
import base64import requestsres = requests.get('https://bj.58.com/chuzu/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0000-13e1-612a-4575bfeb5389&ClickID=2')bs64 = re.findall(';base64,(.*?)\'\) format',res.text,re.S)[0]
print(bs64)

import re
from fontTools.ttLib import TTFont
import base64import requestsres = requests.get('https://bj.58.com/chuzu/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0000-13e1-612a-4575bfeb5389&ClickID=2')bs64 = re.findall(';base64,(.*?)\'\) format',res.text,re.S)[0]
def base64tofile(bs64):res = base64.b64decode(bs64)f = open('1.woff', 'wb')f.write(res)f.close()font = TTFont('1.woff')font.saveXML('1.xml')
base64tofile(bs64)

打开xml进行查看时最重要的内容时cmap 这里是映射关系
code是源码中的内容
code 是16进制数,转成int类型之后代表Unicode上的一个对应的字符
name 是对应的页面中显示的内容
name是通过坐标进行绘制的图形,坐标信息在TTGlyph中展示
但是如果单单是数字加密,都可以找出期中的规律,如果是文字也进行了加密,那么只能通过一些工具查看绘制出的字体样式,手动的进行对应


5、 解密代码的编辑

  1. 通过找到的对应关系进行解密代码的编辑
    通过minidom读取xml输入提前cmap中的对应关系
  2. 通过re模块获取所有的价格数据,通过编写好的解密代码进行解密
from xml.dom import minidom
name_to_num = {'glyph00008':'7','glyph00006':'5','glyph00005':'4','glyph00004':'3','glyph00010':'9','glyph00003':'2','glyph00009':'8','glyph00001':'0','glyph00002':'1','glyph00007':'6'}def get_num(string):dom = minidom.parse('1.xml')root = dom.documentElementmap_ = root.getElementsByTagName('cmap')[0].getElementsByTagName('map')code_to_name = {tag.getAttribute("code")[2:]:tag.getAttribute("name") for tag in map_[:]}print(code_to_name)nums = []for i in string.split(';'):if not i:breakname_num = code_to_name[i[3:]]num = name_to_num[name_num]nums.append(num)return ''.join(nums)# get_num(code_64)
get_num('龤驋龥龒')


【测试】

a = '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'
# '龒鸺鸺龤' = 1990
s = '龒鸺鸺龤'
base64tofile(a)def str_to_16(s):code_64 = []for i in s:# 字体转unicode 对应编码位置decode_num = ord(i)# 转成16进制num =  hex(decode_num)code_64.append('$%s'%num)return ';'.join(code_64)code_64 = str_to_16('龒鸺鸺龤')get_num(code_64)


希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油

爬取58同城,解决反爬字体加密解析问题相关推荐

  1. python可以爬取58同城代码_爬取58同城—字体反爬

    我爬取的是58同城北京租房的索引页. url:https://bj.58.com/chuzu/?PGTID=0d100000-0000-1e00-4039-99b26a4fedeb&Click ...

  2. python爬取58同城二手房_爬取厦门58同城二手房数据进行数据分析(二)

    一.前言 书接上文: Zachary:爬取厦门58同城二手房数据进行数据分析(一)​zhuanlan.zhihu.com 这一篇主要对上一篇文章爬取下来的数据进行一些探索性分析和可视化,并且建立一个简 ...

  3. python爬取大众点评_浅谈python爬取58同城,大众点评这两个网站

    1.爬取58同城租房网遇到的坑:我爬了一页数据被封了ip,此时的我是非常的不爽,才十几条数据就封我,于是我就想着一定得找ip代理来解决这个问题,后面就写了个ip代理去弄,另外把之前头部信息ua改成了u ...

  4. celery爬取58同城二手车数据及若干问题

    celery爬取58同城二手车数据及若干问题 今天分享一下celery分布式爬取58同城二手车(以下简称58)的方法. 反爬 58中的反爬主要有字体加密和验证码验证. 先说字体加密,真实的字体文件经过 ...

  5. Python 爬取58同城以及解析

    python爬虫--爬取58同城房屋的信息 仅供参考 解析58同城的字体反爬 58同城出租房屋 这是爬取下来的数据: 我们用谷歌浏览器右击点开查看网页源代码搜索font-face可以看到一串用base ...

  6. python实战|python爬取58同城租房数据并以Excel文件格式保存到本地

    python实战|python爬取58同城租房数据并以Excel文件格式保存到本地 一.分析目标网站url 目标网站:https://cq.58.com/minsuduanzu/ 让我们看看网站长啥样 ...

  7. python爬虫爬取58同城租房信息(使用动态IP)输出Excel文件

    python爬虫爬取58同城信息(使用动态IP) 新手,为了做一个数据分析,搞了几天,终于搞出来了,大家可以给点意见啊. # coding=utf-8 import sys import csv im ...

  8. 利用python爬取58同城简历数据

    利用python爬取58同城简历数据 最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但 ...

  9. 利用python爬取58同城简历数据_利用python爬取58同城简历数据-Go语言中文社区

    利用python爬取58同城简历数据 最近接到一个工作,需要获取58同城上面的简历信息(http://gz.58.com/qzyewu/).最开始想到是用python里面的scrapy框架制作爬虫.但 ...

  10. WebMagic爬取58同城租房数据

    WebMagic爬取58同城租房数据 1.WebMagic webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发.webmagic的核心非常简单,但 ...

最新文章

  1. 开源大数据周刊-第49期
  2. 【系统分析与设计】UML协作图绘制方法(真の能看懂~!)
  3. spring boot集成webservice接口
  4. 体验一键php/java环境安装工具oneinstack
  5. 9 月 19 日,腾讯云安全中心监测到  Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616)、远程代码执行漏洞(CVE-2017-12615
  6. linux目录变成只读,解决Linux文件系统变成只读的方法
  7. python下载官网-python下载官网
  8. ios开发中如何隐藏各种bar
  9. linux模拟发包工具,linux发包软件-线不是一个压力测试工具的linux以上收缩服务器可...
  10. kaptcha——谷歌验证码工具
  11. 数学基础知识总结 —— 6. 基本矩阵运算公式
  12. 电商直播发展正夯,云计算技术硬核支撑
  13. Ubuntu 20.04 + mysql 8.0.27 用户名和密码修改(非常实用)
  14. C++ 后退前进资源浏览器实现方式,附代码
  15. 22牛客多校day1 J - Serval and Essay 启发式合并
  16. 福利:学生免费注册使用JB全家桶
  17. ks系列服务器,Kimsufi KS4C服务器简单测试
  18. uniapp APP点击跳转QQ加入群聊
  19. python怎样遍历列表中数字_Python基础-列表操作(2):列表的遍历和数字列表
  20. c语言游泳是怎么钓鱼的,不会游泳的钓友进来看 自制饵料钓鲤鱼

热门文章

  1. TLV文档阅读笔记-What is TLV及protobuf
  2. 【超级无敌详细的黑马前端笔记!即时更新~】
  3. vscode 打开工程磁盘利用率100%系统卡顿无法工作
  4. python把异常写入文件_使用Python将Exception异常错误堆栈信息写入日志文件代码
  5. 关于SBA(Sparse Bundle Adjustment)编译以及遇到的一些问题
  6. linux服务器开发二(系统编程)--线程相关
  7. 影响主题(六):手机平台上的影响
  8. photoshop如何把彩色图片变成黑白?
  9. 新品解读:realme推出GT Neo2龙珠定制版
  10. 二级备考:ppt自学知识笔记--基础操作2:Word发送到PPT(原理)