目标地址:http://glidedsky.com/level/web/crawler-font-puzzle-1

打开google调试工具检查发现网页上和源码之中的数字不一样, 已经确认该题目为 字体反扒 直接进入正题:

获取字体文件:

1丶直接找到数字节点属性:style 的 font-family 的值:glided_sky,在源码中找到 引入的的字体文件 并保存下来到本地



2丶该字体文件通过base64编码保存的 直接请求 将编码的值 和 节点中的数字内容 获取到 (获取的方式自己选择合适的即可,本文使用 pyquery 模块进行操作 )

import base64
import requests
from pyquery import PyQuery as pyq response = requests.get(f'http://glidedsky.com/level/web/crawler-font-puzzle-1?page=1', headers=headers, cookies=cookies,verify=False)
doc = pyq(response.text)
cts = doc('style')
base_info = ''.join([ pyq(i).text().split('base64,')[1].split(')')[0] for i in cts])
cts = doc('.col-md-1')
num_list = ([pyq(i).text() for i in cts])
print(f' num_list {num_list}')

3丶将获取得到的base64值保存为本地 .ttf 并将 源码中的数值进行匹配 得到网页上展示的真正值

将保存的字体文件使用 字体编辑器 打开并手动确认编码和数字之间的对应关系

具体实现代码如下

# 字体转换
def font_switch(base_info, number_info):
page_one = base_info
b=base64.b64decode(page_one)
with open('new_page.ttf','wb')as f:
f.write(b)
font=TTFont('main.ttf') # 提前保存的一份本地文件 打开本地字体文件local.ttf
# font.saveXML('main.xml') #将ttf文件转化成xml格式并保存到本地,主要是方便我们查看内部数据结构
obj_list1=font.getGlyphNames()[1:] #获取所有字符的对象,去除第一个
uni_list1=font.getGlyphOrder()[1:] #获取所有编码,去除前1个
print(f' uni_list1 {uni_list1}') # 手动确认编码和数字之间的对应关系,保存到字典中
dict={
'seven':6,
'six':8,
'four':0,
'eight':5,
'two':1,
'five':4,
'one':9,
'zero':7,
'nine':2,
'three':3,
} # 网页新下载的
font2=TTFont('new_page.ttf') # 打开新下载的字体文件
obj_list2=font2.getGlyphNames()[1:] #获取所有字符的对象,去除第一个
uni_list2=font2.getGlyphOrder()[1:] #获取所有编码,去除前1个
new_dict= {}
for uni2 in uni_list2:
print(f'uni2 : {uni2}')
obj2=font2['glyf'][uni2] #获取编码uni2在new_page.ttf中对应的对象
for uni1 in uni_list1:
obj1=font['glyf'][uni1]
if obj1==obj2:
new_dict[f'{uni2}'] = dict[uni1]
# 得到字体转化后的真正值
print(f' new_dict {new_dict}') #TODO 将传进来的数字转化
number = number_info
# 列表
lists = [
'zero',
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
]
new_number = [int(''.join([str(new_dict[lists[int(n)]]) for n in num])) for num in number]
return sum(new_number)

将获取的值传入这个方法就能获取得到网页上的正确数值了

!!!搞定!!! 将剩下的 999 页的值 统计出来 求和 就得到了正确答案

python爬虫---字体反爬的更多相关文章

  1. Python爬虫-字体反爬-猫眼国内票房榜

    偶然间知道到了字体反爬这个东西, 所以决定了解一下. 目标:  https://maoyan.com/board/1 问题: 类似下图中的票房数字无法获取, 直接复制粘贴的话会显示 □ 等无法识别的字 ...

  2. python解析字体反爬

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 一.58同城 用谷歌浏览器打开 ...

  3. 抖音爬虫教程,python爬虫采集反爬策略

    一.爬虫与反爬简介 爬虫就是我们利用某种程序代替人工批量读取.获取网站上的资料信息.而反爬则是跟爬虫的对立面,是竭尽全力阻止非人为的采集网站信息,二者相生相克,水火不容,到目前为止大部分的网站都还是可 ...

  4. Python爬虫实战——反爬策略之模拟登录【CSDN】

    在<Python爬虫实战-- Request对象之header伪装策略>中,我们就已经讲到:=="在header当中,我们经常会添加两个参数--cookie 和 User-Age ...

  5. Python爬虫实战——反爬机制的解决策略【阿里】

    这一次呢,让我们来试一下"CSDN热门文章的抓取". 话不多说,让我们直接进入CSND官网. (其实是因为我被阿里的反爬磨到没脾气,不想说话--) 一.URL分析 输入" ...

  6. python爬虫--cookie反爬处理

    Cookies的处理 作用 保存客户端的相关状态 在爬虫中如果遇到了cookie的反爬如何处理? 手动处理 在抓包工具中捕获cookie,将其封装在headers中 应用场景:cookie没有有效时长 ...

  7. Python爬虫实战——反爬策略之代理IP【无忧代理】

    一般情况下,我并不建议使用自己的IP来爬取网站,而是会使用代理IP. 原因很简单:爬虫一般都有很高的访问频率,当服务器监测到某个IP以过高的访问频率在进行访问,它便会认为这个IP是一只"爬虫 ...

  8. Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二

    说说这个网站 汽车之家,反爬神一般的存在,字体反爬的鼻祖网站,这个网站的开发团队,一定擅长前端吧,2019年4月19日开始写这篇博客,不保证这个代码可以存活到月底,希望后来爬虫coder,继续和汽车之 ...

  9. Python爬虫入门教程 63-100 Python字体反爬之一,没办法,这个必须写,反爬第3篇

    背景交代 在反爬圈子的一个大类,涉及的网站其实蛮多的,目前比较常被爬虫coder欺负的网站,猫眼影视,汽车之家,大众点评,58同城,天眼查......还是蛮多的,技术高手千千万,总有五花八门的反爬技术 ...

随机推荐

  1. Linux项目部署 jdk tomcat 安装配置 linux下 failed connect to localhost:8080;Connection refused

         ONBOOT=yes 5.安装wget (1)安装 yum -y install wget (2) 查看版本  wget --version或 wget -V 一.安装jdk 配置 (1)安 ...

  2. ZYNQ SGI、PPI、SPI三种中断的实例(含代码)

    ZYNQ中断分为3类: SGI(Software Generated Interrupts)软件中断 PPI(Private Peripheral Interrupts)私有外设中断 SPI(Shar ...

  3. 造成panic_oom问题的测试代码

    写一个内核模块,来构造内核模块出现panic oom,主要采用vmalloc函数: #include <linux/module.h> #include <linux/mm.h> ...

  4. SVPWM实现概述

    SVPWM是FOC的基础,其实现流程大致如下所示: 1. 判断合成矢量所在扇区 2. 计算相邻矢量作用时间 3. 计算各桥臂导通时间 4. 得到各相PWM占空比 5. 更新相应寄存器值  SVPWM目 ...

  5. C++ TCHAR* 与char* 互转

    C++ TCHAR* 与char* 互转 在MSDN中有这么一段: Note: The ANSI code pages can be different on different computers, ...

  6. zookeeper 负载均衡和 nginx 负载均衡区别 ?

    zk 的负载均衡是可以调控,nginx 只是能调权重,其他需要可控的都需要自己写插件:但是 nginx 的吞吐量比 zk 大很多,应该说按业务选择用哪种方式.

  7. vue Cannot read property ‘tapPromise‘ of undefined

    https://blog.csdn.net/qq379682421/article/details/111574290 https://github.com/SimenB/add-asset-html ...

  8. JDBC 中文编码

    在使用JDBC开发的过程中,通常会遇到中文保存到数据库乱码的问题. 这个问题的产生有3个方面: 数据库,包括数据库编码.表编码.字段编码等 在Java Web 程序中,请求对象(Request)未进行 ...

  9. OOP 中的 组合、聚合和关联有什么区别?

    如果两个对象彼此有关系,就说他们是彼此相关联的.组合和聚合是面向对象中 的两种形式的关联.组合是一种比聚合更强力的关联.组合中,一个对象是另一 个的拥有者,而聚合则是指一个对象使用另一个对象.如果对象 ...

  10. 学习Haproxy (七)

    haproxy是个高性能的tcp和http的反向代理.它就是个代理.不像nginx还做web服务器 官网地址为www.haproxy.org nginx的优点和缺点 ? 1 2 3 4 5 6 7 8 ...