本帖最后由 wangguang 于 2022-8-1 19:51 编辑
网站链接:https://www.xxsy.net/chapter/3660424.html
思路:找到加密字体—>找到加密字体与字体文件的关系—>构建加密字体与原字体的关系—>把网站上加密的字体的数据替换成原数据
当我删除了网站<link href="//images.xxsy.net/css/pc/website/pagestatic.css?v=20210712" rel="stylesheet">这一行之后字体变了,说明字体反爬关键处在这个文件里
输入https://www.xxsy.net/Content/css/xxsyfont/xxsyfont.css便可直达css文件里面,可以看到里面的代码都是与字体有关的。那便取敌人首级,直接去拿字体文件。
抓包直接就能拿到字体文件
文件有了那么我们可以拿这个字体文件去解析字体的对应关系
接下来就是敲代码了
说下代码思路吧,先下载字体文件对其解析成我们所能理解的文件
然后获取字体的映射关系并且写字体字典
最重要的就是构建加密字体与字体字典的关系。网站源代码加密字体是这样子的—>的,字典文件里面的对应关系却是uniE800—>的
于是乎,把源代码的&#x替换成uni并把其他字符大写化
把被替换后的源代码里的uniE***替换成字典里面的uniE***—>*(*是所对应的字符的意思)
代码如下:import re
import requests
from fontTools.ttLib import TTFont
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}
#下载字体二进制文件—>微笑面对生活—^^—
font=requests.get("https://www.xxsy.net/Content/css/xxsyfont/yahei/font.ttf",headers=headers)
with open("font.ttf",mode="wb")as f:
f.write(font.content)
#转换字体文件为我们能看得懂的文件—>微笑面对生活—^^—
fo = TTFont("font.ttf")
fo.saveXML('font.xml')
#获取字体的映射关系—>微笑面对生活—^^—
font_map = fo['cmap'].getBestCmap()
#替换字典
zd = {'uniE800':'的',
'uniE801':'一',
'uniE802':'是',
'uniE803':'了',
'uniE804': '我',
'uniE805': '不',
'uniE806': '人',
'uniE807': '在',
'uniE808': '他',
'uniE809': '有',
'uniE80A': '这',
'uniE80B': '个',
'uniE80C': '上',
'uniE80D': '们',
'uniE80E': '来',
'uniE80F': '到',
'uniE810': '时',
'uniE811': '大',
'uniE812': '地',
'uniE813': '为',
'uniE814': '子',
'uniE815': '中',
'uniE816': '你',
'uniE817': '说',
'uniE818': '生',
'uniE819': '国',
'uniE81A': '年',
'uniE81B': '着',
'uniE81C': '就',
'uniE81D': '那',
'uniE81E': '和',
'uniE81F': '要',
'uniE820': '她',
'uniE821': '出',
'uniE822': '也',
'uniE823': '得',
'uniE824': '里',
'uniE825': '后',
'uniE826': '自',
'uniE827': '以',
'uniE828': '会',
'uniE829': '家',
'uniE82A': '可',
'uniE82B': '下',
'uniE82C': '而',
'uniE82D': '过',
'uniE82E': '天',
'uniE82F': '去',
'uniE830': '能',
'uniE831': '对',
'uniE832': '小',
'uniE833': '多',
'uniE834': '然',
'uniE835': '于',
'uniE836': '心',
'uniE837': '学',
'uniE838': '么',
'uniE839': '之',
'uniE83A': '都',
'uniE83B': '好',
'uniE83C': '看',
'uniE83D': '起',
'uniE83E': '发',
'uniE83F': '当',
'uniE840': '没',
'uniE841': '成',
'uniE842': '只',
'uniE843': '如',
'uniE844': '事',
'uniE845': '把',
'uniE846': '还',
'uniE847': '用',
'uniE848': '第',
'uniE849': '样',
'uniE84A': '道',
'uniE84B': '想',
'uniE84C': '作',
'uniE84D': '种',
'uniE84E': '开',
'uniE84F': '美',
'uniE850': '总',
'uniE851': '从',
'uniE852': '无',
'uniE853': '情',
'uniE854': '已',
'uniE855': '面',
'uniE856': '最',
'uniE857': '女',
'uniE858': '但',
'uniE859': '现',
'uniE85A': '前',
'uniE85B': '些',
'uniE85C': '所',
'uniE85D': '同',
'uniE85E': '日',
'uniE85F': '手',
'uniE860': '又',
'uniE861': '行',
'uniE862': '意',
'uniE863': '动'
}
# 获取网页源码—>微笑面对生活—^^—
html = requests.get("https://www.xxsy.net/chapter/3660424.html")
html1 = html.text
# 将网页上的&#x替换成uni,目的是为了后面更好替换字体—>微笑面对生活—^^—
html1 = html1.replace('&#x','uni')
# 正则创建—>微笑面对生活—^^—
re1=re.compile('<d>uni(.*?);</d>',re.I|re.S)
re1=re1.findall(html1)
# 将网页上面的&#x后面的字体大写化—>微笑面对生活—^^—
for i in range(0,1000):
try:
html1 = html1.replace(re1, re1.upper(), i)
except:
break
# 替换网页上的加密字体—>微笑面对生活—^^—
for x,y in font_map.items():
try:
thq = '<d>' + fo['cmap'].getBestCmap()[x] + ';</d>'
thh = zd[y]
html1=html1.replace(thq,thh,i)
except:
break
# 通过正则找到需要爬取的内容(文章标题与文章内容)—>微笑面对生活—^^—
re3=re.compile('<span class="chapter-section" data-index=".*?">(.*?)</span>',re.I|re.S)
re3=re3.findall(html1)
with open(re3[0] + '.txt', mode="w", encoding='utf-8')as f:
f.writelines(re3)
注意:文章仅供技术交流使用,如有侵权,联系我删除 |