文章目錄
-
- 前言
- 1、網頁檢視
- 2、字型反扒過程(細心看哦)
- 3、字型反扒完整代碼
- 4、網頁輔助分析
- 5、運作結果
前言
本次的字型反扒是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、運作結果
闖關成功!
部落客會持續更新,有興趣的小夥伴可以點贊、關注和收藏下哦,你們的支援就是我創作最大的動力!
26個寶藏爬蟲項目教程,你值得擁有!