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
分析题目:
字体文件本质上是从字符到图像的一个映射,我们只需要找到该映射关系即可。
其中映射关系从页签源码中可以找到,但是是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:]获取到的即为以上绿色框中的内容。
本文地址:https://blog.csdn.net/qq_37016994/article/details/110860195