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

文章目录

    • 前言
    • 1、网页查看
    • 2、字体反扒过程(细心看哦)
    • 3、字体反扒完整代码
    • 4、网页辅助分析
    • 5、运行结果


前言

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

Python高阶爬虫之字体反扒(GlideSky字体解密)_第1张图片

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

Python高阶爬虫之字体反扒(GlideSky字体解密)_第2张图片


1、网页查看

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

url后的page值就是当前页数,所以进行多页爬取的时候要拼接page值以达到多页爬取目的
Python高阶爬虫之字体反扒(GlideSky字体解密)_第3张图片


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

可见,网页源码中的图片与页面显示的图片不一致,这是因为源码中的数字是经过加密后再显示到页面上的
Python高阶爬虫之字体反扒(GlideSky字体解密)_第4张图片
注意:父标签中引入了style样式
Python高阶爬虫之字体反扒(GlideSky字体解密)_第5张图片
搜索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
Python高阶爬虫之字体反扒(GlideSky字体解密)_第6张图片
图2
Python高阶爬虫之字体反扒(GlideSky字体解密)_第7张图片
Python高阶爬虫之字体反扒(GlideSky字体解密)_第8张图片
图3
Python高阶爬虫之字体反扒(GlideSky字体解密)_第9张图片
图4
在这里插入图片描述
图5
Python高阶爬虫之字体反扒(GlideSky字体解密)_第10张图片


5、运行结果

Python高阶爬虫之字体反扒(GlideSky字体解密)_第11张图片
Python高阶爬虫之字体反扒(GlideSky字体解密)_第12张图片

闯关成功!


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

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

在这里插入图片描述

你可能感兴趣的:(#,Python爬虫,python,爬虫,字体反扒,爬虫高阶,列表)