原因

今天下午在抓取一个网页时,发现的网页字体反爬,这种情况一句话总结:即网页文本里的数字与网页上显示的字体不一致。为什么会出现这样的情况呢?原因是开发者在网页文本里引入了改变字体的文件。

然后可以看到,这是网页文本里的数字:

这是网页显示数字:

手段并不是太高明,这个动态网页比,难度还是不大的。

解决办法如下:
在请求完网页下载完网页文本后,找到网页文本里字体的源地址:

然后,把它下载下来并保存:

然后,你需要使用 fontTools这个库, pip install fontTools,使用这个库需要注意地方,就是你本地先要有一份字体文件,然后,你在爬取每个网页的时候,就会下载那个网页独占的字体文件,再与本地的做对比,就能拿到正确的数字:



local 为本地文件, online 为每次下载的文件,这样便能得到正确的数字了。

总的来说,就是爬虫过程中,加入了下载字体文件,并识别字体文件的操作。

下面附上代码:

# !/usr/bin/env python 3.6
# -*- coding: utf-8 -*-
# Author: fcj
# Time: 2019-04-29
# Description: 字体反爬from fontTools.ttLib import TTFont
import requests
from lxml import etree
import redef get_html(html_url):headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'',application/signed-exchange;v=b3','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Cookie'','DNT': '1','Host':','Referer':','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}content, wof_url = get_content(get_url=html_url, headers=headers)file_path = get_file(wf_url=wof_url)online_fonts = TTFont(file_path)base_fonts = TTFont('D:/3yl1dB.woff')tmp = exec_wof(online=online_fonts, local=base_fonts)nums = content.xpath('//div[@class="col-md-1"]//text()')an = get_ans(nums=nums, tmp=tmp)return andef exec_wof(online, local):  #  得到对应的数字num_list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']eng_list = ['zero', 'four', 'eight', 'nine', 'five', 'six', 'two', 'seven', 'three', 'one']uni_list = online.getGlyphNames()[1:]uni_list.remove('glyph00011')tmp = {}for i in range(10):online_glyph = online['glyf'][uni_list[i]]  # 返回的是unicode对应信息的对象for j in range(10):base_glyph = local['glyf'][eng_list[j]]if online_glyph == base_glyph:tmp[uni_list[i]] = num_list[j]return tmpdef get_wof(content):  #  得到字体urlurl = re.findall('\("https.*?"\)', content)url = str(''.join(url)).replace('"', '').replace(')', '').replace('(', '')return urldef get_file(wf_url):  # 下载保存字体文件data = requests.get(url=wf_url,  verify=False)r = data.contentname = wf_url.split('/')[-1]path = 'D:/jiao cheng/'+namewith open(path, 'wb') as f:f.write(r)f.close()return pathdef get_ans(nums, tmp):  # 得到答案an = 0for num in nums:num = re.findall('[0-9]', ''.join(num))real_list = []for n in num:real_list.append(str(translate_num(str(n), tmp)))real_num = int(''.join(real_list))an += real_numreturn andef get_content(get_url, headers):  # 下载处理网页data = requests.get(url=get_url, headers=headers, verify=False)r = data.contentcontent = str(r, encoding='utf-8', errors='ignore')wof_url = get_wof(content=content)s = etree.HTML(content.replace('<br>', '').replace('\n', '').replace('</br>', '').replace('\t', '').replace('\xa0', '').replace('\u3000', '').replace('\r', ''))return s, wof_urldef translate_num(number, tmp):eng_list = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']number = eng_list[str(number) - 1]return tmp[number]if __name__ == '__main__':ul = 'asn = 0for index in range(1, 1001):hl = ul + str(index)asn += get_html(html_url=hlprint(asn)

python爬虫之字体反爬虫相关推荐

  1. 快手字体反爬虫?请给我10分钟,让我破了他

    文章目录 前景摘要 字体反爬虫 突破字体反爬虫思路的探索 最终突破快手反爬虫代码 前景摘要 最近一个朋友问我,字体反爬虫的事,他发给我一个快手网站,我由于比较忙没回他,于是后来他说解决不了就要上scr ...

  2. Python 爬虫工程师必看,深入解读字体反爬虫

    字体反爬虫开篇概述 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这 ...

  3. 深入细枝末节,Python的字体反爬虫到底怎么一回事

    内容选自 即将出版 的<Python3 反爬虫原理与绕过实战>,本次公开书稿范围为第 6 章--文本混淆反爬虫.本篇为第 6 章中的第 4 小节,其余小节将 逐步放送 . 字体反爬虫开篇概 ...

  4. 【python实现网络爬虫(4)】实习僧网站信息爬取(字体反爬虫破解)

    实习僧网站 实习僧网址,地址为北京,在搜索框输入"python",如下 实战解析 步骤一.建立for循环爬取前20页的内容 首先.查看翻页URL的信息,找规律 第一页:https: ...

  5. Python爬虫:字体反爬处理(猫眼+汽车之家)-2018.10

    环境:Windows7 +Python3.6+Pycharm2017 目标:猫眼电影票房.汽车之家字体反爬的处理 -全部文章: 京东爬虫 .链家爬虫.美团爬虫.微信公众号爬虫.字体反爬.Django笔 ...

  6. 用前考虑清楚,伤敌一千自损八百的字体反爬虫

    内容选自即将出版的<Python3 反爬虫原理与绕过实战>,本次公开书稿范围为第 6 章--文本混淆反爬虫.本篇为第 6 章中的第 4 小节,其余小节将逐步放送. 字体反爬虫开篇概述 在 ...

  7. 爬虫进阶-- 字体反爬终极解析

    爬取一些网站的信息时,偶尔会碰到这样一种情况:网页浏览显示是正常的,用python爬取下来是乱码,F12用开发者模式查看网页源代码也是乱码.这种一般是网站设置了字体反爬 什么是字体反爬? 字体反爬虫: ...

  8. Python有道翻译爬虫,破解反爬虫机制,解决{errorCode:50}错误

    一.引言 参考网址:https://tendcode.com/article/youdao-spider/ 当前成功时间:2019-6-28 转自个人开源博客:https://my.oschina.n ...

  9. 爬虫原理及反爬虫机制以及反爬虫方法的应对策略

    爬虫原理及反爬虫机制 关于爬虫 爬虫原理 反爬虫机制 1.检验数据头User-Agent反爬虫机制解析: 2.访问频率限制或检验 3.蜜罐技术 反爬虫机制的应对方法 1.设定Request Heade ...

最新文章

  1. 2022-2028年中国体育用品行业投资分析及前景预测报告(全卷)
  2. c# for提升效率的写法
  3. Python编程基础:第二十一节 函数返回Return
  4. Spring框架中的设计模式(三)
  5. 人工智能的策略,如果国家优先发展”梦想成真”?
  6. Android 颜色渲染(九) PorterDuff及Xfermode详解
  7. mongodb mongoose 常用操作符号 整理
  8. python继承如何进行引用传递的区别_python在什么情况下会引用传递呢?
  9. python中递归函数写法_python中递归函数如何创建
  10. Linux删除安卓温控,RK平台关闭温度控制降频功能
  11. MySQL错误:ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY
  12. 软件测试岗位,BAT大厂面试题集锦
  13. 接口测试第二课(Fiddler实现APP抓包)
  14. 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
  15. 这 4 款电脑记事本软件,得试试
  16. 80psi等于多少kpa_压力单位PSI与kpa换算
  17. win10弹出计算机的内存不足,win10提示计算机显卡内存不足情况的解决办法介绍...
  18. Ja进av阶书籍推荐
  19. vue02——vue中v-XXX指令
  20. 对撞机 (Standard IO)

热门文章

  1. 电子计算机芯片半导体的区别,芯片,半导体,集成电路之间的区别
  2. 专业之路:13条PS高阶技巧
  3. 关于@Transactional(readonly = false)注解不起作用的可能性
  4. python异常处理--猜字游戏
  5. urlib爬取哔哩哔哩搜索
  6. 京东开普勒导购模式代码分享[java]
  7. form.vue 选择性打印
  8. 2020中国最好学科排名发布,各专业哪家强?
  9. 20年前和现在-为什么程序员越来越累
  10. 软信天成:企业如何对数据资产追根溯源?