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

题目三:爬虫-字体反爬-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: 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的内容:
在这里插入图片描述
其中uni_list1 = font1.getGlyphOrder()[1:]获取到的即为以上绿色框中的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

merlin’s girl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值