欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

GlidedSky爬虫学习探索之旅(二)

程序员文章站 2022-04-02 11:02:15
题目三:爬虫-字体反爬-1分析题目:字体文件本质上是从字符到图像的一个映射,我们只需要找到该映射关系即可。其中映射关系从页签源码中可以找到,但是是base64编码的东西,需要借助工具FontCreator查看。编码方式:工具查看:对应关系:0:1,5:1,8:2,7:3,4:4,9:5,6:6,3:7,2:8,1:9界面展示:抓取到的text及根据对应关系转换出来的值:value: 812 temp: 298value: 403 temp: 407value: 5...

题目三:爬虫-字体反爬-1

GlidedSky爬虫学习探索之旅(二)
GlidedSky爬虫学习探索之旅(二)

分析题目:

字体文件本质上是从字符到图像的一个映射,我们只需要找到该映射关系即可。
其中映射关系从页签源码中可以找到,但是是base64编码的东西,需要借助工具FontCreator查看。
编码方式:
GlidedSky爬虫学习探索之旅(二)
工具查看:
对应关系:0:1,5:1,8:2,7:3,4:4,9:5,6:6,3:7,2:8,1:9
GlidedSky爬虫学习探索之旅(二)
界面展示:
GlidedSky爬虫学习探索之旅(二)
抓取到的text及根据对应关系转换出来的值:

value: 812 temp: 298
value: 403 temp: 407
value: 510 temp: 190
value: 786 temp: 326
value: 724 temp: 384
value: 722 temp: 388
value: 534 temp: 174
value: 732 temp: 378
value: 796 temp: 356
value: 481 temp: 429
value: 525 temp: 181
value: 819 temp: 295

所以最重要的就是如何将工具查看到的对应关系存取下来,并在每次抓取到元素对应的text值后,根据对应关系进行转换即可。
这时候就需要使用到from fontTools.ttLib import TTFont工具包了。

具体编码:

#coding:utf-8
import base64,re
from fontTools.ttLib import TTFont
import asyncio,pyppeteer
#反字体反爬

async def main():
    sum = 0
    dict_1 = {'nine':9, 'four':4, 'eight':8, 'seven':7, 'three':3, 'zero':0, 'one':1, 'six':6, 'two':2, 'five':5}#方便后续根据字符转换成数字
    brower = await pyppeteer.launch(headless=False)
    page = await brower.newPage()
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0')
    await page.setJavaScriptEnabled(enabled=True)
    await page.evaluate(
        '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    address = "user"
    passwd = "password"
    await page.type('#email', address)
    await page.type("#password", passwd)
    button = (await page.xpath('//*[@id="app"]/main/div[1]/div/div/div/div[2]/form/div[4]/div/button'))[0]
    await button.click()
    await asyncio.sleep(3.0)
    for num in range(1,1001):
        page_str = "http://www.glidedsky.com/level/web/crawler-font-puzzle-1?page={0}".format(num)
        #await page.screenshot({'path':"1.png"})
        try:
            await page.goto(page_str)
        except:
            print(page_str)
        text = await page.xpath('/html/head/style/text()')
        value = await (await text[0].getProperty("textContent")).jsonValue()
        base_str = str(re.findall("base64,.*=", str(value))[0].split(',')[1])
        # print(re.findall("base64,.*=",str(value))[0],base_str)
        # print(await page.content())
        b = base64.b64decode(base_str)
        with open("zt.ttf", 'wb') as f:
            f.write(b)
        font1 = TTFont("zt.ttf")#读取ttf文件
        # font1.saveXML('html.xml')
        uni_list1 = font1.getGlyphOrder()[1:]#获取到对应关系中表头一栏数字,且不包含第一个,获取到的是字符串组成的list
        # print(uni_list1)
        dict_2 = {}
        for k in range(len(uni_list1)):
            dict_2[k] = dict_1[uni_list1[k]]#根据字符转换成数字
        new_dict1 = dict(zip(dict_2.values(), dict_2.keys()))
        # print(new_dict1)
        for i in range(1,13):
            item = await page.xpath('//*[@id="app"]/main/div[1]/div/div/div/div[{0}]'.format(i))
            value = await (await item[0].getProperty("textContent")).jsonValue()
            # print(str(value).strip())
            #根据编码处理
            value = str(value).strip()
            temp =  ""
            length = len(value)
            # print("value:",value)
            for item in range(length):
                temp = temp +str(new_dict1[int(value[item])])
            # print("temp:",temp)
            sum += int(temp)
    print(sum)
    await brower.close()

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

html.xml的内容:
GlidedSky爬虫学习探索之旅(二)
其中uni_list1 = font1.getGlyphOrder()[1:]获取到的即为以上绿色框中的内容。

本文地址:https://blog.csdn.net/qq_37016994/article/details/110860195

相关标签: python 爬虫