我爬取的是58同城北京租房的索引页。

url:https://bj.58.com/chuzu/?PGTID=0d100000-0000-1e00-4039-99b26a4fedeb&ClickID=2

审查元素可知网站进行了字体加密,直接复制网页中的数字得到的也是乱码,因此我们需要找到一个映射关系,加密字符映射到我们想要的数字。

打开network中的doc,我们发现这里面的数字是这样一堆十六进制码,并且每次刷新网页这些十六进制码所对应的数字都是变化的,而且我们发现每个这种标签他的类标签都是strongbox。

然后我们在network中查看font下的数据包,把这个包下载下来,并用fontCreator打开,我们会发现这个就是我们所需要的字体文件

在python下用fonttools进行解析为xml文件,我们会发现两个映射关系

1.glyph00001->1 glyph00002->2以此类推

2.cmap中的map有code与glyph有映射。

看到这里我们就有思路了,我们只需要通过name=glyph来建立一个code与数字的字典映射就好了。

一、获取字体文件。

因为每次请求网页,获取的字体文件是不一样的,所以我们需要把字体文件保存下来。而这个字体文件的url是经过加密的,直接请求不了。不过我们发现他是经过base64进行加密的,我们只需要从网页源代码中找到这一长串字符,进行base64解码就行、

# 获取字体文件,保存到本地

def get_font_data(html):

b64 = re.search('base64,(.*?)\'\)', html)

# print(b64.group(1))

b = base64.b64decode(b64.group(1))

with open('house.ttf', 'wb') as f:

f.write(b)

二、解析字体文件,建立映射关系、

使用fonttools把字体文件转成xml,然后建立映射关系,这里要注意getBestCmap()方法获取到的code与glyph的映射中,code是十进制,要把它转换成十六进制才可以。# 解析xml文件,建立映射关系

def parse_xml():

font = TTFont('house.ttf')

font.saveXML('house.xml')

f_dict = font.getBestCmap() # 获取到的code值为十进制,需要转到十六进制

new_map = dict()

for key in f_dict.keys():

value = int(re.findall('\d+', f_dict[key])[0]) - 1

key = hex(key).replace('0', '') # 十进制转十六进制,并转换成网页中显示的样式

new_map[key] = value

return new_map

三、替换网页中的字符。

直接用replace方法对源代码进行字符替换。# 把网页中的编码替换成数字

def get_new_html(new_map, html):

for key in new_map.keys():

# print(key)

html = html.replace(key + ';', str(new_map[key]))

return html

四、完整代码。from fontTools.ttLib import TTFont

import requests

import re

import base64

from lxml import etree

# 58 同城,租房,数字字体加密

# 先将字符映射到 字符编码 ,再通过字符编码映射到真实数字

# 获取字体文件,保存到本地

def get_font_data(html):

b64 = re.search('base64,(.*?)\'\)', html)

# print(b64.group(1))

b = base64.b64decode(b64.group(1))

with open('house.ttf', 'wb') as f:

f.write(b)

# 解析xml文件,建立映射关系

def parse_xml():

font = TTFont('house.ttf')

font.saveXML('house.xml')

f_dict = font.getBestCmap() # 获取到的code值为十进制,需要转到十六进制

new_map = dict()

for key in f_dict.keys():

value = int(re.findall('\d+', f_dict[key])[0]) - 1

key = hex(key).replace('0', '') # 十进制转十六进制,并转换成网页中显示的样式

new_map[key] = value

return new_map

# 把网页中的编码替换成数字

def get_new_html(new_map, html):

for key in new_map.keys():

# print(key)

html = html.replace(key + ';', str(new_map[key]))

return html

def parse_html(html):

content = etree.HTML(html)

title_li = content.xpath('/html/body/div[6]/div[2]/ul/li/div[2]/h2/a/text()')

price_li = content.xpath('/html/body/div[6]/div[2]/ul/li/div[3]/div[2]/b/text()')

for title, price in zip(title_li, price_li):

print(str(title).strip(), str(price).strip())

if __name__ == '__main__':

start_url = 'https://bj.58.com/chuzu/?PGTID=0d200001-0000-19e8-01d8-7a91306f22d9&ClickID=1'

response = requests.get(url=start_url)

html = response.text

get_font_data(html)

new_map = parse_xml()

new_html = get_new_html(new_map, html)

parse_html(new_html)

python可以爬取58同城代码_爬取58同城—字体反爬相关推荐

  1. Python爬虫 | 以滑雪为例演示大众点评商铺信息采集(字体反爬)

    文章目录 1.简述 2.字体反爬处理 2.1.获取字体文件链接 2.2.创建三类字体与实际字符映射关系 3.单页店铺信息解析 4.全部页数据获取 4.1.获取数据页数 4.2.采集全部数据 5.总结 ...

  2. python爬虫笔记五:汽车之家贴吧信息(字体反爬-动态映射)

    学习网址: https://jia666666.blog.csdn.net/article/details/108974149 ----------------------------------- ...

  3. Python +tensorflow+pygame 破解任意字体反爬

    什么是字体反爬? 每个字符在 都可以用 unicode 编码表示  而字体文件可以理解为Unicode 和 字体形状的映射 ,所以在计算机中字符可以变成我们人类所能理解的形状,所以字体反爬的关键就是字 ...

  4. 爬虫学习笔记(二十)—— 字体反爬

    文章目录 一.什么是字体反爬 二.编码原理 2.1.ASCII编码对照表 2.2.Unicode编号 2.3.UTF-8编码方式 2.4.字符矢量图 三.案例:58同城反爬字体 3.1.代码实现 一. ...

  5. 反爬终极方案总结---字体反爬

    最近临时受命,要针对采集我司网站的爬虫进行反制.虽然不太熟悉这个领域,但既然分到咱这儿了,那就上呗,有啥说的,谁让咱是"全栈工程师"呢(牛逼吹的大了点). 原本公司已经有了一套字体 ...

  6. 爬虫 某全国律师执业诚信信息公示平台 DES加密+中文字体反爬

    某全国律师执业诚信信息公示平台 DES加密+中文字体反爬 目标网站:aHR0cHM6Ly9jcmVkaXQuYWNsYS5vcmcuY24v 无限debugger DES加密 中文字体反爬 目标网站: ...

  7. python爬虫爬取58网站数据_Python爬虫,爬取58租房数据 字体反爬

    Python爬虫,爬取58租房数据 这俩天项目主管给了个爬虫任务,要爬取58同城上福州区域的租房房源信息.因为58的前端页面做了base64字体加密所以爬取比较费力,前前后后花了俩天才搞完. 项目演示 ...

  8. python爬取猫眼遇到动态字体反爬

    前一段时间,爬取了58同城,发现当时的网页对数字有字体反爬虫,然后废了九牛二虎之力找到了规律,终于破解了反爬虫,后来发现猫眼的这个网页虽然使用了字体反爬,但是和原来的58同城还是有很大的差别,后来了解 ...

  9. python爬取实习僧招聘信息字体反爬

    参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...

  10. 58同城数字字体反爬

    1.什么是字体反爬 字体反爬也就是自定义字体反爬,通过调用自定义的ttf文件来渲染网页中的文字,而网页中的文字不再是文字,而是相应的字体编码,通过复制或者简单的采集是无法采集到编码后的文字内容 比如5 ...

最新文章

  1. (以pytorch为例)路径(深度)的正则化方法的简单理解-drop path
  2. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑
  3. Dubbo系列(3)_官方Demo说明
  4. 套接字选项SO_KEEPALIVE
  5. “挖空三座山、装了几万台服务器”的绿色数据中心
  6. 苹果欲借免费纳米SIM卡技术控制行业标准
  7. 你研究过单例么?这样写单例效率最高.
  8. protobufjs 命令执行_protobufjs简单使用
  9. Django REST framework 源码中提供的默认配置
  10. php 执行mysql查询_php中执行mysql的常用操作
  11. 別人的心得。。。。。學習
  12. python socket 通信(2) 协程实现多人聊天室
  13. 实用的在线文本分析工具
  14. VS2015导出带文件的项目模板
  15. html三角形下拉列表,select自定义小三角样式代码(实用总结)
  16. matlab画概率密度图
  17. python音乐编程_可以编程写音乐的python库musicpy教程(第一期) musicpy的数据结构...
  18. 惠普打印机爆远程命令执行漏洞,黑客可任意操纵你的打印机
  19. 用犯罪分析软件CrimeStat做热点图、层次空间聚类图、时空移动平均图
  20. 电脑管家修复DNS服务器,DNS是什么?dns劫持是怎么回事?怎么处理?

热门文章

  1. 手机无网状态下获取经纬度,离线定位的方法。
  2. mysql 花生壳 2003_基于HTTP协议实现的小型web服务器的方法
  3. 软件实施工程师入坑经历
  4. Python字典合并方法大全
  5. 树莓派+小程序开发(一)
  6. 【实时渲染】RTR4 简要问答版
  7. 华为、腾讯、百度扎堆进入的自动驾驶仿真市场,到底藏着怎样的秘密?
  8. 纯html折叠文字代码,不用JS,教你只用纯HTML做出几个实用网页效果
  9. 测试开发实习日记(DAY1)
  10. win7/win8卸载matlab时提示 bummer -uninstller error exeption calling main