天天看點

Python高階爬蟲之字型反扒(GlideSky字型解密)

文章目錄

    • 前言
    • 1、網頁檢視
    • 2、字型反扒過程(細心看哦)
    • 3、字型反扒完整代碼
    • 4、網頁輔助分析
    • 5、運作結果

前言

本次的字型反扒是Glidedsky爬蟲網站的一到題目,難度是有的,大家好好看,好好學!希望你們有所收獲。

Python高階爬蟲之字型反扒(GlideSky字型解密)
Python高階爬蟲之字型反扒(GlideSky字型解密)
溫馨提示:保護好頭發!!!
Python高階爬蟲之字型反扒(GlideSky字型解密)

1、網頁檢視

一共1000頁

Python高階爬蟲之字型反扒(GlideSky字型解密)

url後的page值就是目前頁數,是以進行多頁爬取的時候要拼接page值以達到多頁爬取目的

Python高階爬蟲之字型反扒(GlideSky字型解密)

2、字型反扒過程(細心看哦)

可見,網頁源碼中的圖檔與頁面顯示的圖檔不一緻,這是因為源碼中的數字是經過加密後再顯示到頁面上的

Python高階爬蟲之字型反扒(GlideSky字型解密)

注意:父标簽中引入了style樣式

Python高階爬蟲之字型反扒(GlideSky字型解密)

搜尋font-family可見如下

Python高階爬蟲之字型反扒(GlideSky字型解密)

結合題目分析可知,該段我們不認識的亂碼就是網頁内嵌的base64

Python高階爬蟲之字型反扒(GlideSky字型解密)

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

Python高階爬蟲之字型反扒(GlideSky字型解密)

圖2

Python高階爬蟲之字型反扒(GlideSky字型解密)
Python高階爬蟲之字型反扒(GlideSky字型解密)

圖3

Python高階爬蟲之字型反扒(GlideSky字型解密)

圖4

Python高階爬蟲之字型反扒(GlideSky字型解密)

圖5

Python高階爬蟲之字型反扒(GlideSky字型解密)

5、運作結果

Python高階爬蟲之字型反扒(GlideSky字型解密)
Python高階爬蟲之字型反扒(GlideSky字型解密)
闖關成功!

部落客會持續更新,有興趣的小夥伴可以點贊、關注和收藏下哦,你們的支援就是我創作最大的動力!

26個寶藏爬蟲項目教程,你值得擁有!
Python高階爬蟲之字型反扒(GlideSky字型解密)