前言
本次的字体反扒是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__':
#爬取1000页
for 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、运行结果
闯关成功!
博主会持续更新,有兴趣的小伙伴可以点赞、关注和收藏下哦,你们的支持就是我创作最大的动力!