在爬取一些网站信息的时候,经常会有一些数据通过一些加密问价进行了加密,如果我们直接按照原有的思路去进行爬取数据的话,我们所爬取的数据是有问题的,比如上图的情况,那这种情况怎么办的,接下来跟着鼠鼠的步骤。

 我们可以在这里发现,字体的加密就是通过这个font—family这个字体文件更改的。我们就进入页面源代码去查询我们所需要的字体文件地址

将下载的文件通过High-Logic FontCreator这个软件打开,我们就可以得到各个加密字体如下的编码

 其中上面是页面源代码中的编码,如果我们能够将页面源代码的数据全部替换成我们所需要的数据就行了,这就是我们解决问题的思路。

上面的数据一看就是有十六进制转变而来的,那我们这里的话可以使用python中的的hex函数将数字转化为16进制的代码。我们的想法就是把所有的数据进行匹配,把上述的所有字符转换为我们原本的数字

import requests
import re
from fontTools.ttLib import TTFont

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"
}

url = "https://www.shixiseng.com/interns?keyword=python&city=%E5%85%A8%E5%9B%BD&type=intern"

response = requests.get(url=url, headers=headers)
font_url = "https://www.shixiseng.com" + re.search(r"url\((.*?)\);}", response.text).group(1)  # 这里获取了我们所需要下载的字体url

resp = requests.get(font_url).content  # 将所获取的文件转成字节
with open("file.woff", "wb") as file:
    file.write(resp)

font = TTFont("file.woff")
font.saveXML("实习僧.xml")

glyf = font["glyf"]

glyf_map = {
    0: glyf["uni30"],
    1: glyf["uni31"],
    2: glyf["uni32"],
    3: glyf["uni33"],
    4: glyf["uni34"],
    5: glyf["uni35"],
    6: glyf["uni36"],
    7: glyf["uni37"],
    8: glyf["uni38"],
    9: glyf["uni39"],
}

cmap_dict = font.getBestCmap()  # 将我们下载下来的文字文件以字典的形式输出出来
# {120: 'x', 57543: 'uni4F5C', 57573: 'uni76', 57648: 'uni884C', 57668: 'uni31'}
response = response.text.replace("&#", "0")
for key_data, value_data in cmap_dict.items():
    key_data = hex(key_data)
    value_data = glyf[value_data]  # 将我们的uni30等这种类似的数据转换成对象
    for key_new, value_new in glyf_map.items():
        if value_new == value_data:  # 对glyf_map中的字典对象,与我们所需要交换的对象进行匹配如果匹配成功,
            # 我们就使用re.sub方法将字符串交换
            response = re.sub(key_data, str(key_new), response)

print(response)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐