Python高阶爬虫之字体反扒(GlideSky字体解密)


前言

本次的字体反扒是Glidedsky爬虫网站的一到题目,难度是有的,大家好好看,好好学!希望你们有所收获。在这里插入图片描述

在这里插入图片描述

温馨提示:保护好头发!!!

在这里插入图片描述


1、网页查看

一共1000页
在这里插入图片描述

url后的page值就是当前页数,所以进行多页爬取的时候要拼接page值以达到多页爬取目的
在这里插入图片描述


2、字体反扒过程(细心看哦)

可见,网页源码中的图片与页面显示的图片不一致,这是因为源码中的数字是经过加密后再显示到页面上的
在这里插入图片描述
注意:父标签中引入了style样式
在这里插入图片描述
搜索font-family可见如下
在这里插入图片描述
结合题目分析可知,该段我们不认识的乱码就是网页内嵌的base64
在这里插入图片描述


3、字体反扒完整代码

import requests
from fontTools.ttLib import TTFont
import base64
import json
import re
from bs4 import BeautifulSoup

#头信息
headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36",
    "Cookie": ""  #记得填上cookie,参考图1
}
#数字总和
sum = 0

#映射
number_map = {
    ".notdef":-1,
    "zero":0,
    "one":1,
    "two":2,
    "three":3,
    "four":4,
    "five":5,
    "six":6,
    "seven":7,
    "eight":8,
    "nine":9
}

#爬取
def download(response):
	#引入全局变量sum
    global sum
    html_data = response.text
    
    #保存当前网页,此操作纯粹是我测试时方便数据查看,小伙伴们可自行选择删除或留下
    with open("字体文件.html", mode="w") as f:
        f.write(html_data)
	
	#使用re模块正则匹配到当前网页中的base64字体文件,参考图2
    font_base = re.findall("base64,(.*?)\) format", response.text)[0]
    #使用base64库进行解码
    result = base64.b64decode(font_base)
    #解码之后保存
    with open("字体文件.ttf", mode="wb") as f:
        f.write(result)
	
	#使用TTFont打开字体文件并保存为xml文件以供阅读
    font = TTFont('字体文件.ttf')
    font.saveXML("font.xml")
    
	#参考图3
	#getGlyphOrder()可获取GlyphOrder标签下的GlyphID标签的全部name值
    font_map = font.getGlyphOrder()
    lists = []
    for name in font_map:
    	#getGlyphID()根据name获取GlyphID标签的id值
    	#将获取到的数减一,再添加到lists列表中去
        lists.append(font.getGlyphID(name) - 1)

    # GlyphOrder映射
    #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    #使用zip后再转化为字典
    dicts = dict(zip(font_map, lists))

    # 替换字典中的key值,替换后结果参考图4
    for key in dicts.keys():
        dicts[number_map[key]] = dicts.pop(key)
		
	#使用BeautifulSoup的lxml库解析网页
    data = BeautifulSoup(html_data, "lxml")
    #参考图5
    numbers = data.find(class_="row").find_all(class_="col-md-1")
    for num in numbers:
        num = BeautifulSoup(str(num), "lxml")
        #获取文本值并去掉前后空格
        num_temp = num.text.strip()
        #把数字拆分变为列表
        l = list(str(num_temp))
        #对照dicts替换成真正的数字
        l[0] = str(dicts[int(l[0])])
        l[1] = str(dicts[int(l[1])])
        l[2] = str(dicts[int(l[2])])
        #将列表在拼接为数字,再进行加法运算
        sum += int("".join(l))


#开始
if __name__ == '__main__':
	#爬取1000for i in range(1000):
        print("正在爬取第"+str(i+1)+"页")
        #url拼接
        url = "http://glidedsky.com/level/web/crawler-font-puzzle-1?page=" + str(i+1)
        #发起get请求
        response = requests.get(url=url, headers=headers)
        download(response)
    
    #打印最后数字总和
    print(sum)

4、网页辅助分析

图1
在这里插入图片描述
图2
在这里插入图片描述
在这里插入图片描述
图3
在这里插入图片描述
图4
在这里插入图片描述
图5
在这里插入图片描述


5、运行结果

在这里插入图片描述
在这里插入图片描述

闯关成功!


博主会持续更新,有兴趣的小伙伴可以点赞关注收藏下哦,你们的支持就是我创作最大的动力!

26个宝藏爬虫项目教程,你值得拥有!

在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值