但是该网站针对一些比较敏感的数据(比如:票房、热度、评分等)做了字体反爬
本篇文章将以「 影片热度 」为例,讲解字体反爬的完整处理方案
1、安装依赖
# 依赖
# OCR
pip3 install ddddocr
# 字体管理
pip3 install fontTools
# 图片管理
pip3 install Pillow
2、下载字体及格式转换
通过分析,我们发现关键数字与网页中中引入的字体样式有关,并且每次刷新页面,引用的字体地址是变化的
因此,我们需要获取网页源码,利用正则表达式解析出字体的下载地址
def download_font(url, font_path):
headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "www.maoyan.com",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
"sec-ch-ua": "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Google Chrome\";v=\"114\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\""
}
# 获取网页源码
resp_pre = requests.get(url, headers=headers)
resp = resp_pre.text
# 解析出字体文件(woff格式)的下载地址
font_file = re.findall(r's3plus\.meituan\.net\/v1\/mss_73a511b8f91f43d0bdae92584ea6330b\/font\/(\w+\.woff)', resp)[
0]
font_url = 'https://s3plus.meituan.net/v1/mss_73a511b8f91f43d0bdae92584ea6330b/font/' + font_file
获取字体 URL 下载地址后,我们将字体文件下载到本地
需要注意的是,下载字体时设置请求头和上面请求头不一致,不然下载的字体可能受损
font_headers = {
'authority': 's3plus.meituan.net',
'accept': '*/*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
'origin': 'https://www.**.com',
'referer': 'https://www.**.com/',
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'font',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'cross-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
}
# 下载字体文件到本地
# 注意:这里下载字体必须使用特有的Header,不然下载的字体会受损
font_content = requests.get(font_url, headers=font_headers)
with open(f'./{font_file}', 'wb') as f:
f.write(font_content.content)
f.close()
最后,将 woff 字体文件转换为 ttf 格式
from fontTools.ttLib.woff2 import decompress
...
# 将 woff文件转成 ttf 文件
decompress(font_file, font_path)
3、字体映射关系
通过 FontCreator 工具打开字体文件,可以获取数字和字体编码的映射关系
通过对多个字体文件进行对比发现,上面的映射关系不是固定的
因此,我们需要借助字体图片绘制及 OCR,动态获取字体中的映射关系
from PIL import ImageFont, Image, ImageDraw
from io import BytesIO
from fontTools.ttLib import TTFont
from fontTools.ttLib.woff2 import decompress
import ddddocr
def get_font_keymap(font_path):
...
# 映射字典
font_dict = {}
# 解析字体文件中的编码对应关系
for cmap_code, glyph_name in font.getBestCmap().items():
# print(cmap_code,glyph_name)
# 实例化一个图片对象(给定的模式和大小创建一个新图像) 白色
img = Image.new('1', (img_size, img_size), 255)
# img.show()
# 绘制图片
draw = ImageDraw.Draw(img)
x, y = draw.textsize(chr(cmap_code), font=font_img)
draw.text(((img_size - x) // 2, (img_size - y) // 2), txt, font=font_img, fill=0)
bytes_io = BytesIO()
img.save(bytes_io, format="PNG")
# 使用OCR识别字体
content= ocr.classification(bytes_io.getvalue())
# 加入到键值对中
font_dict[glyph_name] = content
return font_dict
4、网页内容还原
通过上面数字与字体编码的映射关系,我们将网页中做了字体反爬的内容替换为正确的数字
# 3、替换源码,将加密内容替换为明文
# .
for key in font_dict.keys():
# print("key:", f'&#x{key[3:]};'.lower())
# 去掉前面3个字符,将内容替换成对应的数字
resp = resp.replace(f'&#x{key[3:]};'.lower(), font_dict[key])
5、爬虫
接下来,我们就可以对网页关键数据进行提取的
import re
from lxml import etree
import os
# 使用lxml解析HTML
root = etree.HTML(resp)
elements = root.xpath('//span[@class="stonefont"]/text()')
for element in elements:
print(element)
我已经将文中所有源码上传到后台,回复关键字「 230710 」即可以获取完整源码
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
推荐阅读
用 Python 远程控制 Windows 服务器,太好用了!
JavaScript 逆向爬虫中的浏览器调试常见技巧
JavaScript 逆向爬虫中的浏览器调试常见技巧(下)
反爬篇 | 手把手教你处理 JS 逆向之图片伪装
反爬篇 | 手把手教你处理 JS 逆向之字体反爬
关键词有排名没有点击怎么回事家居关键词排名怎么做如何应对关键词排名不高自然流量关键词排名应用关键词排名优化平顶山百度关键词自然排名技术延安百度优化关键词排名陕西怎么做关键词排名优化服务刷关键词排名当然云速捷用对上海市网站关键词排名优化射阳县关键词seo排名优化修水关键词排名优化关键词优化排名优火9星优化关键词排名认准火18星百度排名关键词价格查询绍兴seo关键词排名关键词排名首推乐云seo十年安阳百度关键词点击排名系统关键词的排名是什么决定的廊坊抖音搜索关键词排名规则深圳百度关键词排名公司店铺关键词排名查询系统关键词360排名查询医院关键词排名知识2019年百度关键词排名丹东市关键词排名公司电话华为关键词排名第一如何进行关键词优化排名武汉市关键词排名匹配价格表网站关键词排名监控工具建百度seo关键词排名软件什么软件查看淘宝关键词排名关键词排名推广技术嘉义关键词自然排名青浦区网站关键词排名优化甘肃关键词排名直通车关键词排名怎么做起来搜狗微信关键词排名生意参谋能查宝贝关键词排名湖州关键词推广排名关键词排名快照优化哪个公司好百度关键词排名没了恩施关键词排名焦作百度长尾关键词排名技巧亚马逊关键词广告排名监控网站重庆怎样提升关键词排名提升百度关键词排名 s关键词排名优化微金苹果拼多多关键词排名分析福建求推荐seo关键词排名惠州关键词排名案例竞价和关键词排名的区别百度搜索榜排名关键词包装关键词排名行业淘宝关键词排名的位置关键词排名是一个什么原理什么是关键词排名优化服务网站关键词排名与指数的关系上栗县关键词seo排名优化河源关键词排名咨询云南关键词排名推广公司湖南关键词排名推广提升神马关键词优化排名顺义关键词排名优化福建获取关键词排名淘宝店铺如何提升关键词排名周口官网长尾关键词排名工具网站关键词排名优化价格_关键词排名优化格要火20星影视关键词排名查询工具周口官网关键词优化排名沧州市关键词排名加盟那些刷关键词排名软件关键词排名点击挛云速捷假如长尾关键词排名热门易速达钱家关键词排名全达上海百首云南关键词排名检测济南关键词排名平台网站关键词排名报表周口网站关键词排名呼兰网站关键词排名拼多多改关键词会掉排名吗手机网站关键词排名提阿里关键词排名查询打开是空白关键词排名点击可靠易速达大理关键词排名公司苏州手机的关键词排名优化关键词排名用大将军21安徽代做关键词排名刷关键词排名xr金手指效率seo查看关键词排名怎么看亚马逊关键词排名洛阳搜索引擎关键词排名多少钱亚马逊关键词排名一直下跌许昌关键词排名哪家好连云港关键词万词霸屏排名关键词排名kr金手指效率松原关键词快速排名关键词排名发包程序长治关键词排名方法焦作百度seo关键词排名技巧批量关键词排名优化技巧2018十大关键词排名刷网站关键词快速排名软件海南淘宝查关键词排名下拉刷关键词排名火乚星21北京产品关键词排名济源搜狗长尾关键词排名推广云南网站关键词排名推广费用seo关键词排名给您好的建议朝阳首页关键词排名优化苏州新区京东关键词排名优化营口网页关键词排名测图关键词排名自己关键词的排名在哪里看南通关键词推广排名京东关键词突然排名不见凯里关键词排名金昌关键词推广公司排名刷网站关键词排名价芙蓉百度关键词排名鹤岗关键词快速排名刷关键词排名仌有名宙r斯好黄山百度关键词排名优化选哪家提升关键词排名首荐金苹果鞍山百万关键词排名六安关键词排名渠道辽宁关键词排名软件郑州网站关键词排名公司高明网站关键词排名经济危机关键词搜索排名东湖区关键词seo排名优化关键词优化排名乐云seo四川营销关键词排名优化方案浙江关键词排名按天收费抖音刷关键词排名关键词出价越高排名越高吗洛阳哪里有关键词排名工具长治关键词排名案例曼朗百度关键词排名郑州搜狗长尾关键词排名公司关键词排名分析用哪个拼多多搜索推广中关键词排名湖南怎么学关键词排名优化学习关键词排名竞价托管外包焦作百度关键词排名代理皮革关键词排名策略开阳网站关键词排名搜索关键词排名专业选云速捷毕节关键词排名外包贵阳seo关键词排名关键词排名优先等级红安县网站关键词排名优化代理360关键词排名百度提升seo关键词排名概念开封搜狗长尾关键词排名关键词竞价排名综合易速达seo新关键词排名外推西城网站关键词排名优化黄冈seo关键词排名优化山东关键词排名表关键词排名下降亚马逊网站关键词排名联系方式阿里卖家怎么看关键词排名云梦县百度关键词排名价格番禺微信关键词排名沧州行业关键词排名安阳长尾关键词排名工具关键词排名癶首选金手指15亚马逊关键词排名如何加节点搜索关键词排名前10在哪里看汕尾seo关键词排名江苏所有关键词排名淘宝关键词让排名靠前潜江产品关键词排名标题关键词排名和权重官网关键词排名技术价格有没有关键词排名优化关键词快速排名就连火1星惠好用的关键词排名平台长尾关键词排名软件seo优化关键词排名培训抖音内容搜索关键词排名规则南阳搜狗关键词排名价格免费关键词排名app拼多多关键词排名越靠前越好吗滁州行业关键词排名常州关键词网站排名关键词排名软件讲明易速达亚马逊如何监控关键词排名焦作新站关键词搜索排名工具青浦区网站关键词排名优化关键词排名派代关键词加型号对排名有用照明关键词排名2018公众号关键词排名湖南360关键词点击排名系统黑龙江关键词快速排名软件安阳网站关键词点击排名厂家花露水关键词排名淘宝