专栏首页快学PythonPython爬虫遇到字体反爬?教你搞定!

Python爬虫遇到字体反爬?教你搞定!

人生苦短,快学Python

大家在使用Python爬虫时,经常会遇到各种反爬问题。今天就以猫眼电影为例,看看如何解决其中的 字体反爬

由于对于一部电影来说,它的票房和评分数据是非常重要的,所以网站开发人员对它进行了保护,也就是字体反爬,今天的目标是破解猫眼电影网站的字体反爬。

一、需求分析

我们是需要爬取论坛文本数据,如下图所示:

部分网页源码展示:

我们发现数据是不在网页源码里面,而是以一种特殊的字符存在的。

二、发起请求

import requests
url = "https://maoyan.com/films/1298542"
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"
}
r = requests.get(url,headers=headers)
print(r.text)

然后得到如下数据(部分数据截图):

和网页源码里面的数据一样,通过requests简单请求之后发现评分,票房数据被特殊字符替换掉了,此时再次查看Elenments对应的标签里的数据,如下图所示:

由图可以发现有的字被替换掉了,所以我们需要找到数字被替换的方式(规律),然后替换回去。

三、替换规律

通过上面分可知,该网站中使用的字体对应的是stonefont,它是该网站为了反爬设置的自定义字体,它一定存在于style(样式)标签里面:

然后拿到url对应属性(xxx57..woff),它是不同于.ttf的字体文件,但是同样可以使用FontCreator打开:

//k3.autoimg.cn/g1/M02/D0/99/wKgHFVsUz1eAH_VRAABj9PS-ubk57..ttf 注意:如果该属性打不开文件,可以在属性前加上 https://maoyan.com

查看后发现是一个字体文件:

然后打开字体查看文件,把字体文件拖拽进去,如下图所示:(使用软件为FontCreator,可以查看字体的软件)

如果不想使用软件,可以打开百度字体平台网站,对应页面和软件打开是一样的

粗略一看其实发现不了什么,所以我们需要使用fontTools第三方库查看字体文件:

from fontTools.ttLib import TTFont
font = TTFont('./f0a30a4dda64b4f8f344858115f54fc92296 (1).woff')
print(font.getGlyphOrder())

结果如下图所示:

['glyph00000', 'x', 'uniF4EF', 'uniF848', 'uniF88A', 'uniE7A1', 'uniE343', 'uniE137', 'uniF489', 'uniE5E2', 'uniF19B', 'uniE8CD']

然后我们发现比如在先前的网页源码中发现的,

.  # 对应网页中的9.2

然后由此查看后缀,9----e7a1,在上图中

四、数据抓取

1、导包,我们使用re第三方库解析

import requests
import re
from fontTools.ttLib import TTFont

2、定制一个类(Maoyan),以及初始化属性设置:

class MaoYan(object):
    def __init__(self):
        self.url = 'https://maoyan.com/films/1298542'
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"
        }
        self.font = TTFont('./f0a30a4dda64b4f8f344858115f54fc92296 (1).woff')
        self.numList = ['6', '3', '7', '9', '8', '0', '4', '2', '5']

3、相关方法设置

发送请求获取相应

def get_html(self, url):
    response = requests.get(url, headers=self.headers)
    return response.content

处理字体文件

def getNewList(self):
    newList = []
    glyList = self.font.getGlyphOrder()[2:]  # 前两个数据是没有用的,剔除
    for gly in glyList:
        m = gly.replace('uni', '&#x').lower() + ';' # replace字符替换
        newList.append(m)

    return newList

解析数据

def parseData(self, data):
    for i in self.getNewList():
        if i in data:
            print(self.numList[self.getNewList().index(i)])
            data = data.replace(i, self.numList[self.getNewList().index(i)])

    return data

正则匹配以及最终输出

def start_crawl(self):
    html = self.get_html(self.url).decode('utf-8')
    # 正则匹配星级
    star = re.findall(r'<span class="index-left info-num ">\s+<span class="stonefont">(.*?)</span>\s+</span>', html)[0]
    print(star)
    star = self.parseData(star)

    print('用户评分: %s 星' % star)

4、最后运行:

if __name__ == '__main__':
    maoyan = MaoYan()
    maoyan.start_crawl()

结果如下,文字替换成功:

由于票房数据和这个评分有着异曲同工之妙,所以这里不再赘述,感兴趣的小伙伴可以去试一下。

五、小结

通常在2爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用 Python 爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码。这种一般是网站设置了字体反爬。字体反爬是一种比较常见的反爬方式,因为很多网站的文字信息是比较重要的,像是前面提到的猫眼电影电影票房评分等数据,非常重要,网站维护者当然会把这种数据进行反爬处理,只要好好分析,还是能够抓取到目标数据。

注意点:

  1. 字符匹配以及替换,还有正则表达式的书写规范
  2. 猫眼验证,当用户频繁的发起请求时,他会有一个验证,滑块验证,这个时候最好使用selenium手动操作一下,然后就可以正常的请求数据。

最后,如果觉得今天的文章不错,就给右下角点个赞吧~

本文分享自微信公众号 - 快学Python(kxpython),作者:快快

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学Python,最先从哪里入手?然后学哪个方向?

    前段时间为了写爬虫专栏,顺便又把Python基础看了一遍,说实话有很多不常用的已经忘了。 其实做开发行业就是这样,常用的语法就几个,其他的只要了解知道即可。

    看、未来
  • 月薪2万的爬虫工程师,Python需要学到什么程度?

    非计算机专业,正在自学python,很多教程里提到的网站的爬虫都会写了。比如拉勾网,豆瓣,实习僧,京东,淘宝,某妹子图等等……但是因为不是计算机专业的,也没学所...

    一墨编程学习
  • 如果你不知道做什么,那就学一门杂学吧

    多年以后,面对人工智能研究员那混乱不堪的代码,我会想起第一次和S君相见的那个遥远的下午。那时的B公司,还是一个仅有6个人的小团队,Mac和显示器在桌上依次排开,...

    青南
  • 我是这样开始写Python爬虫的

    刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件。 利用这些数据,可以做很多领域的分...

    企鹅号小编
  • 我是如何零基础开始能写爬虫的

    利用这些数据,可以做很多领域的分析、市场调研,获得很多有价值的信息,可以应用在很多的工作场景,于是果断开始学习。

    Python中文社区
  • 爬虫篇 | 高级爬虫(三):使用Scrapy爬取拉勾网数据并写入数据库

    之前我们讲到了使用Scrapy,今天我们使用Scrapy来作一个项目实战。Scrapy详细教程可以看前面两篇:

    龙哥
  • 我去!爬虫遇到字体反爬,哭了

    比如这里看到评论数(4位数)都有对应着一个编号(相同的数字编号相同),应该是对应着网站的字体库。

    Python研究者
  • 一文揭秘,爬虫那些不为人知的套路

    1、真实世界的爬虫比例 大家应该听过一句话吧,大概意思是说,整个互联网上大概有50%以上的流量其实是爬虫。第一次听这句话的时候,我还不是很相信,我觉得这个说法实...

    BestSDK
  • 高级爬虫(三):使用Scrapy爬取拉勾网数据并写入数据库

    之前我们讲到了使用Scrapy,今天我们使用Scrapy来作一个项目实战。Scrapy详细教程可以看前面两篇:

    龙哥
  • Python爬虫小白入门必读,成为大牛必须经历的三个阶段

    学习任何一门技术,都应该带着目标去学习,目标就像一座灯塔,指引你前进,很多人学着学着就学放弃了,很大部分原因是没有明确目标,所以,一定要明确学习目的,在你准备学...

    一墨编程学习
  • 反击“猫眼电影”网站的反爬虫策略

    0x01 前言 前两天在百家号上看到一篇名为《反击爬虫,前端工程师的脑洞可以有多大?》的文章,文章从多方面结合实际情况列举了包括猫眼电影、美团、去哪儿等大型电商...

    FB客服
  • 一键查询明星个人信息,并以知识图谱可视化展示

    最近想搞一点好玩的事情(技术),今天打算做一个小程序:一键查询明星个人信息。(从数据抓取到知识图谱展示,全程代码完成原创,不涉及调用api包)

    Python研究者
  • Python爬虫学习路线

    1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Py...

    py3study
  • 干货 | 那些你不知道的爬虫反爬虫套路

    崔广宇,携程酒店研发部开发经理,与去哪儿艺龙的反爬虫同事是好基友。携程技术中心“非著名”段子手。

    华章科技
  • 那些你不知道的爬虫反爬虫套路

    爬虫与反爬虫,是一个很不阳光的行业。 这里说的不阳光,有两个含义。 第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚...

    小小科
  • 干货 | 那些你不知道的爬虫反爬虫套路

    作者简介 崔广宇,携程酒店研发部开发经理,与去哪儿艺龙的反爬虫同事是好基友。携程技术中心“非著名”段子手。 前言 爬虫与反爬虫,是一个很不阳光的行业。 这里说的...

    携程技术
  • 爬虫需谨慎!!!那些你不知道的爬虫反爬虫套路

    作者简介 崔广宇,携程酒店研发部开发经理,与去哪儿艺龙的反爬虫同事是好基友。携程技术中心“非著名”段子手。 本文来自携程技术中心(ID:ctriptech) 前...

    小莹莹
  • 4个核心要点揭开爬虫真面目,小心被反爬!

    爬虫与反爬虫,是一个很不阳光的行业。   这里说的不阳光,有两个含义。   第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会...

    BestSDK
  • 关于爬虫与反爬虫,这些“套路”你必须知道

    爬虫与反爬虫,是一个很不阳光的行业。这里说的不阳光,有两个含义。 第一是,这个行业是隐藏在地下的,一般很少被曝光出来。很多公司对外都不会宣称自己有爬虫团队,甚至...

    钱塘数据

扫码关注云+社区

领取腾讯云代金券