字体反爬虫

案例网址:http://www.porters.vip/confusion/movie.html

图片中的关键位置用到了字体反爬,比如评分的数字,我们调试模式查看时,会看到很多: □ ,在源代码中可以看到很多的:&#xe624.&#xe9c7

这种是自己设置了字体,字体文件打开可以看到都有对应的内容。

解决这种反爬目前我知道有两种方法:

一种是下载字体文件,找到他的字形信息,设置映射,后面爬取,对应一下即可,还需要说一句,有的网站在这基础上,随意动动字形信息,结果可能就识别不出来了,我们需要k近邻算法进行识别。

还有一种比较简单,截图,进行通用文字识别

代码如下:没有写完,思路明白了。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import requests, re, os, hashlib
from urllib.parse import urljoin
from parsel import Selector
from fontTools.ttLib import TTFont
# 获取目标页所有的css链接
url = 'http://www.porters.vip/confusion/movie.html'
response = requests.get(url)
sel = Selector(response.text)
css_path = sel.css('link[rel="stylesheet"]::attr("href")').extract()
woffs = []
# 遍历访问所有获取到的css链接,获取包含字体的文件路径
for _ in css_path:
    css_url = urljoin(url, _)
    resp = requests.get(css_url)
    pat = re.compile("src:url\('../(.*.woff)'\) format\('woff'\);")
    woff_path = pat.findall(resp.text)
    if woff_path:
        woffs.extend(woff_path)
# 所有字体文件经过TTFont处理过后放到列表里
TTf_list = []
for _ in woffs:
    woff_url = urljoin(url, _)
    res_ttf = requests.get(woff_url)
    filename = os.path.split(_)[-1]
    with open(filename, 'wb') as f:
        f.write(res_ttf.content)
    TTf_list.append(TTFont(filename))
# 例如:获取原网页字体编码信息(多少万人评分)
result = sel.css('span.score-num span::text')
people_list = [_.upper() for _ in result.extract_first()]
uni_list = eval(str(people_list).upper().replace('\\U', 'uni'))
result = []
for word in uni_list:
    if 'uni' in word:
        for _ in TTf_list:
            # 从字体文件中取出对应编码的字形信息
            content = _['glyf'].glyphs.get(word).data
            print(content)
            # 字形信息的md5
            glyph = hashlib.md5(content).hexdigest()
            # 下面就是比对之前预存的md5,将结果添加进列表
            pass

MD5需要的字形信息:

# str1 就是字形信息,将其MD5
str1 = '''
    <TTGlyph name="uniE9C7" xMin="0" yMin="0" xMax="511" yMax="707">
          <contour>
            <pt x="47" y="622" on="1"/>
            <pt x="47" y="707" on="1"/>
            <pt x="511" y="707" on="1"/>
            <pt x="511" y="638" on="1"/>
            <pt x="476" y="602" on="0"/>
            <pt x="409" y="505" on="0"/>
            <pt x="341" y="384" on="0"/>
            <pt x="290" y="261" on="0"/>
            <pt x="271" y="197" on="1"/>
            <pt x="246" y="107" on="0"/>
            <pt x="238" y="0" on="1"/>
            <pt x="147" y="0" on="1"/>
            <pt x="148" y="42" on="0"/>
            <pt x="165" y="144" on="0"/>
            <pt x="181" y="204" on="1"/>
            <pt x="212" y="324" on="0"/>
            <pt x="271" y="435" on="1"/>
            <pt x="301" y="492" on="0"/>
            <pt x="365" y="584" on="0"/>
            <pt x="398" y="622" on="1"/>
          </contour>
          <instructions/>
    </TTGlyph>
    '''

版权声明:
作者:hyzsj0106
链接:https://www.cxywy.com/?p=355
来源:程序员无垠
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
< <上一篇
下一篇>>