本次以天眼查和猫眼电影为例,解析怎样爬取替换的真实数据,感谢 "两个眼" 。。,本文使用python3。

分析

先来个简单点的:天眼查

打开天眼查,找到阿里巴巴的页面 https://www.tianyancha.com/company/59837300,可以看到勇哥帅气的照片。。。

(注意:直接打开需要登陆的话通过百度搜索 “天眼查 阿里” 再点击访问,如果是用python请求,headers 带上 "Referer": "https://www.baidu.com/",伪装成百度跳转过来的)

79c4272c0969

页面信息

查看源代码后发现,注册资本和注册时间是无法直接在源代码中获取正确的值。

79c4272c0969

源代码中的值

这时需要思考原因,应该是 js 修改过或者替换过 字体文件,发现两个值的类都是 ”tyc-num“ ,可以尝试查看一下类的样式。经过搜索,找到样式如下:

@font-face {

font-family: "tyc-num";

src: url("https://static.tianyancha.com/web-require-js/public/fonts/tyc-num-ad584829a0.eot");

/* IE9*/

src: url("https://static.tianyancha.com/web-require-js/public/fonts/tyc-num-ad584829a0.eot#iefix") format("embedded-opentype"), url("https://static.tianyancha.com/web-require-js/public/fonts/tyc-num-832854095c.woff") format("woff"), url("https://static.tianyancha.com/web-require-js/public/fonts/tyc-num-7f971a8be7.ttf") format("truetype"), url("https://static.tianyancha.com/web-require-js/public/fonts/tyc-num-67f91eabd9.svg#tic") format("svg");

/* iOS 4.1- */

}

.tyc-num {

font-family: "tyc-num" !important;

font-style: normal;

-webkit-font-smoothing: antialiased;

-moz-osx-font-smoothing: grayscale;

}

可以看出,这是用css更改了加载的字体文件,自定义了字体。

在开发者工具中找到这个这个文件,看一下做了什么改变。

79c4272c0969

字体文件

显然是数字这个地方做了手脚,对比一下正常的字体。

79c4272c0969

正常的字体

好像比正常的还少了一个 "4",多了一个 "." ,猜想 "4" 对应的就是 "." ,所以这样可以得出数字的对应关系。

79c4272c0969

对应关系

把网页中的数据进行对应一下,果然没错。

423176999999万美元 ---> 15298.000000万美元

3995-90-38 ---> 2007-03-26

之后在提取数据时做一个逻辑判断替换即可得到真实数据了。

猫眼电影

打开猫眼电影详情页 http://maoyan.com/films/1198214,查看用户评分和累计票房,发现源码中是乱码。

79c4272c0969

源码

他们的class都是 "stonefont" ,找到 "stonefont" 的定义。

@font-face {

font-family: stonefont;

src: url('//vfile.meituan.net/colorstone/1881db7c788dfdf9d2d00a926734d0973168.eot');

src: url('//vfile.meituan.net/colorstone/1881db7c788dfdf9d2d00a926734d0973168.eot?#iefix') format('embedded-opentype'),

url('//vfile.meituan.net/colorstone/632958fd02509dc28d915375c3a835e02088.woff') format('woff');

}

.stonefont {

font-family: stonefont;

}

刷新几次,看到每次 url 是变化的,确定是动态生成字体,不要紧,生成哪个下载哪个。

加载一个页面,把这个字体文件下载下来拿去分析,可能是在文件中数字的地方进行了替换。在网上正好有一片是防止爬虫采集的文章: 利用自定义web-font实现数据防采集,看过后恍然大悟,这不正是我们要的吗,嘿嘿,爬虫是防不住的!

用 python 的 fonttools 库提取字体,fonttools 的用法可以网上查找一下

pip3 install fonttools # 安装

把 woff 的文件转换成我们熟悉的 xml 格式

from fontTools.ttLib import TTFont # 导包

font = TTFont('./632958fd02509dc28d915375c3a835e02088.woff') # 打开文件

font.saveXML('./6329.xml') # 转换成 xml 文件并保存

打开 xml 文件,红框内即为我们要的,略微不同,把 uni 改成 ,后面再加一个分号 。

79c4272c0969

xml文件

跟源代码中对应验证一下可以得出他们的对应关系如下。

79c4272c0969

对应关系

用fonttools 可以直接从文件得到这些值

from fontTools.ttLib import TTFont # 导包

font = TTFont('./632958fd02509dc28d915375c3a835e02088.woff') # 打开文件

gly_list = font.getGlyphOrder() # 获取 GlyphOrder 字段的值

for gly in gly_list[2:]: # 前两个值不是我们要的,切片去掉

print(gly) # 打印

最后补充完整代码

思路:前面知道字体库是随机的,可以一些提前把能刷新到的下载到本地,抓取页面时,如果已经在本地,直接使用,不在的话再下载下来。

本地目录:字体存在 fonts 目录下

79c4272c0969

目录结构

代码

完整代码

import requests

import re

import os

from fontTools.ttLib import TTFont

class MaoYan(object):

def __init__(self):

self.url = 'http://maoyan.com/films/1198214'

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"

}

# 发送请求获得响应

def get_html(self, url):

response = requests.get(url, headers=self.headers)

return response.content

# 创建 self.font 属性

def create_font(self, font_file):

# 列出已下载文件

file_list = os.listdir('./fonts')

# 判断是否已下载

if font_file not in file_list:

# 未下载则下载新库

print('不在字体库中, 下载:', font_file)

url = 'http://vfile.meituan.net/colorstone/' + font_file

new_file = self.get_html(url)

with open('./fonts/' + font_file, 'wb') as f:

f.write(new_file)

# 打开字体文件,创建 self.font属性

self.font = TTFont('./fonts/' + font_file)

# 把获取到的数据用字体对应起来,得到真实数据

def modify_data(self, data):

# 获取 GlyphOrder 节点

gly_list = self.font.getGlyphOrder()

# 前两个不是需要的值,截掉

gly_list = gly_list[2:]

# 枚举, number是下标,正好对应真实的数字,gly是乱码

for number, gly in enumerate(gly_list):

# 把 gly 改成网页中的格式

gly = gly.replace('uni', '').lower() + ';'

# 如果 gly 在字符串中,用对应数字替换

if gly in data:

data = data.replace(gly, str(number))

# 返回替换后的字符串

return data

def start_crawl(self):

html = self.get_html(self.url).decode('utf-8')

# 正则匹配字体文件

font_file = re.findall(r'vfile\.meituan\.net\/colorstone\/(\w+\.woff)', html)[0]

self.create_font(font_file)

# 正则匹配星级

star = re.findall(r'\s+(.*?)\s+', html)[0]

star = self.modify_data(star)

# 正则匹配评论的人数

people = ''.join(re.findall(r'''(.*?万)(人评分)''', html)[0])

people = self.modify_data(people)

# 正则匹配累计票房

ticket_number = ''.join(re.findall(r'''(.*?)(亿)''', html)[0])

ticket_number = self.modify_data(ticket_number)

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

print('评分人数: %s' % people)

print('累计票房: %s' % ticket_number)

if __name__ == '__main__':

maoyan = MaoYan()

maoyan.start_crawl()

效果图

79c4272c0969

网页浏览效果

79c4272c0969

爬虫运行完得到的

---- END ----

天眼查 乱码 java_反爬虫解析-字体替换(天眼查/猫眼电影)相关推荐

  1. 爬虫实战4:爬取猫眼电影排名Top100的详细数据保存到csv文件

    申明:资料来源于网络及书本,通过理解.实践.整理成学习笔记. 文章目录 猫眼电影 完整代码 运行结果 猫眼电影 完整代码 import time import requests import re i ...

  2. Python爬虫实战+数据分析+数据可视化(猫眼电影)

    一.爬虫部分 爬虫说明: 1.本爬虫是以面向对象的方式进行代码架构的 2.本爬虫爬取的数据存入到MongoDB数据库中 3.爬虫代码中有详细注释 代码展示 import re import timef ...

  3. Python爬虫之requests+正则表达式抓取猫眼电影top100以及瓜子二手网二手车信息(四)...

    requests+正则表达式抓取猫眼电影top100 一.首先我们先分析下网页结构 可以看到第一页的URL和第二页的URL的区别在于offset的值,第一页为0,第二页为10,以此类推. 二.< ...

  4. 一起学爬虫——使用xpath库爬取猫眼电影国内票房榜

    之前分享了一篇使用requests库爬取豆瓣电影250的文章,今天继续分享使用xpath爬取猫眼电影热播口碑榜 XPATH语法 XPATH(XML Path Language)是一门用于从XML文件中 ...

  5. Python爬虫实战Pro | (1) 爬取猫眼电影Top100榜单

    在本篇博客中,我们将使用requests+正则表达式来爬取猫眼电影官网的TOP100电影榜单,获取每部电影的序号,片名,主演,上映日期,评分和封面等内容. 之前在Python爬虫实战(1)中我们曾爬取 ...

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

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

  7. Python爬虫基础教程,详细讲解(含爬取文字为乱码解决办法、反爬虫机制解决办法)

    Python爬虫学习笔记 前言 适当爬取怡情,过度爬取- ** 爬取到的东西不要商用!爬取到的东西不要商用!爬取到的东西不要商用! 1.准备工具 获取Python request第三方库 方法一:同时 ...

  8. Python使用selenium过天眼查滑块验证码反爬实现模拟登录

    Python使用selenium过天眼查滑块验证码反爬实现模拟登录 天眼查的滑块验证码样式 一顿操作到滑块验证码阶段 破解滑块验证码 结束 天眼查的滑块验证码样式 在输入账号和密码后会发现这个令人讨厌 ...

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

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

  10. java 前端页面传过来的值怎么防止篡改_反爬虫,到底是怎么回事儿?

    有位被爬虫摧残的读者留言问:「网站经常被外面的爬虫程序骚扰怎么办,有什么方法可以阻止爬虫吗? 」 这是个好问题,自从 Python 火了起来,编写爬虫程序的门口越来越低,爬取别人网站数据也越来越猖獗. ...

最新文章

  1. 一个实用技巧,告别手动画图,自动生成数据库 ER 图|原创
  2. 【并发编程】Future模式及JDK中的实现
  3. labview如何进行串口通讯
  4. 币安布局去中心化交易所,原来是因为这三个原因!
  5. Ext 入门 (05) 打印+gridpanel()方法
  6. 【51Nod - 1432】独木舟 (贪心,思维,好题)
  7. cobbler介绍与部署
  8. js创建file对象 字符串 txt_js-创建对象的多种方式
  9. 安徽建立“库长制” 千余名库长保粮食安全
  10. 一对一语音视频直播双端原生APP源码/thinkphp后台源码/社交交友语音视频聊天即时通信APP源码
  11. 802.11n和802.11ac的MCS速率表
  12. python写数学公式大全_数学公式书写
  13. 城堡、游乐园、地下城!!!500+ 超棒 FBX 模型素材,全部都免费!
  14. 证券接口通达信系统对做趋势套利有何风险?
  15. Unity打包的PC项目生成一个EXE文件
  16. 跨境电商|为什么客户服务中沟通很重要?
  17. 全球首个机器人辅助试管婴儿降生
  18. created与mounted执行顺序
  19. 面试官说公司不是培训机构,我需要有经验的员工,应届生如何答?
  20. 计算机专业研究生西安就业,计算机专业需要考研吗?毕业之后该怎么发展?

热门文章

  1. 地图,GPS位置地图坐标系:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图),OpenGIS
  2. JAVA中黄金分割点的问题
  3. # python # # 分形 # Sierpinski Carpet 谢尔宾斯基地毯
  4. [爬虫系列(三)]用多线程爬取百度贴吧默认表情
  5. 计算机专业的在职研究生怎么样,计算机专业在职研究生难度大吗?
  6. 计算机基础——4.1 数字通信入门
  7. 一款阿里的知识管理工具
  8. 计算机桌面文字重影,电脑桌面图标有重影是什么问题?
  9. 校园表白墙、微信表白墙、大学生树洞,交流圈子,用Fotoo创建
  10. 吾爱破解python就业班_我吾 区别