python爬虫进阶-汽车之家贴吧信息(字体反爬-动态映射)
目的
获取汽车之家贴吧的内容信息
详细需求
汽车之家贴吧
思路解析
一、F12获取目标信息-进行分析
二、字体反爬解析-根据上一篇的文章,直接搜索关键词就好
三 根据其后的链接,保存为ttf在本地,查看TTF字体映射
字体工具:FontCreatorPortable,自行百度下载安装
在线工具:http://fontstore.baidu.com/static/editor/index.html
分析:
汽车之家字体反爬:
1.字体编码与文字皆为动态变换
2.文字为固定数目
3.每个贴子均有不同的加密TTF
4.对应的字体绘制坐标存在细微差别
解决方法:
1.先在本地保存一个TTF文件为模板,构建动态映射,使其一一对应
2.保存编码以及每个汉字所对应的一套坐标,这个坐标是用来绘制汉字的
3.获取网页源码所带的TTF链接,下载保存本地
4.提取刚下载的TTF文件的编码与每个编码所对应的一套坐标
5.与模板进行坐标比较,若在误差允许范围内,则判定为同一汉字
6.使刚下载的TTF文件实现一一映射的目标大众点评字体反爬
1.编码动态变化但字体顺序固定不变
2.文字数目固定
3.具有规律性
解决方法:字体顺序不变,为每个编码一一映射汉字即可
图解
四,整体思路
1.获取网页源码
2.提取字体链接并下载保存
3.与模板字体进行坐标比较,实现编码与汉字一一映射
4.提取文章内容
5.对文章内容的加密字体进行解密
6.打印文章内容
源码实现
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : jia666
# @Time : 2020/10/09 9:08import re
import requests
from html import unescape
from fontTools.ttLib import TTFontclass Car_Family(object):def __init__(self,url):self.head = {'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',}self.url=url #目标帖子地址self.main()def Get_html(self):'源网页请求'with requests.get(self.url,headers=self.head) as res:self.html=res.textself.html = re.sub('\s', '', self.html) # 去空格def TTF_parse(self):'字体的分析处理'TTF_link=re.findall(",url\('(.*?)'\)format\('woff'\)",self.html,re.S)[0] #提取贴子字体链接b = requests.get('http:' + TTF_link, headers=self.head).content #字体链接请求with open('汽车之家2.ttf', 'wb')as f: #保存到本地f.write(b)font1 = TTFont('汽车之家1.ttf') #本地预先下载的字体文件u_list = font1.getGlyphOrder()[1:] #获取字体的编码word_list = '九十左少矮多二七长更上近八坏右得不短低地三五高大的小很远了和六着下呢好是一四' #字体编码对应的汉字be_p1 = [] # 保存38个字符的(x,y)信息for uni in u_list:p1 = [] # 保存一个字符的(x,y)信息p = font1['glyf'][uni].coordinates # 获取对象的x,y信息,返回的是一个GlyphCoordinates对象,可以当作列表操作,每个元素是(x,y)元组for f in p: # 把GlyphCoordinates对象改成一个列表p1.append(f)be_p1.append(p1)font2 = TTFont('汽车之家2.ttf') #网络刚下载的字体文件,用于参考1.ttf比较后映射对应文字uni_list2 = font2.getGlyphOrder()[1:]self.utf8List = ['&#x' + uni[3:] for uni in uni_list2]on_p1 = []for i in uni_list2:pp1 = []p = font2['glyf'][i].coordinatesfor f in p:pp1.append(f)on_p1.append(pp1)n2 = 0 # uni下标计数self.x_list = []for d in on_p1:n2 += 1n1 = 0for a in be_p1:n1 += 1if self.comp(a, d):# print(uni_list2[n2 - 1], word_list[n1 - 1])self.x_list.append(word_list[n1 - 1])def comp(self,l1, l2): # 定义一个比较函数,比较两个列表的坐标信息是否相同if len(l1) != len(l2): # 两数据的数目不等return False # 判断结束else: # 数据相同mark = 1 # 成功标志:1代表True,0代表Falsefor i in range(len(l1)):if abs(l1[i][0] - l2[i][0]) < 40 and abs(l1[i][1] - l2[i][1]) < 40:passelse:mark = 0breakreturn markdef Content_parse(self):te = re.findall('<divclass="rconten">(.*?)]<\/div>', self.html, re.S)[0]#贴吧内容提取# print(te)for i in range(len(self.utf8List)): #替换加密文字# print(self.utf8List[i].lower(), self.x_list[i])# # if self.utf8List[i] in te:te = te.replace(self.utf8List[i].lower()+';', self.x_list[i])word = re.sub('<.*?>', '', unescape(te))#提取文字word=word.replace('。', '\n') #换行替换print(word) #打印处理后的内容def main(self):self.Get_html() #网页请求self.TTF_parse() #字体动态映射构建self.Content_parse()#贴子文字替换与提取if __name__ == '__main__':url='https://club.autohome.com.cn/bbs/thread/1f05b4da4448439b/76044817-1.html#%23%23' #论坛帖子地址example=Car_Family(url)
注意:源码不能直接用,需要根据实际情况,下载一个作为模板并改写1.ttf的映射关系
实现效果
参考文章:
作者:Mars_DD
https://blog.csdn.net/xing851483876/article/details/82928607
汽车之家的字体反爬解决方案来自此处
python爬虫进阶-汽车之家贴吧信息(字体反爬-动态映射)相关推荐
- python爬虫笔记五:汽车之家贴吧信息(字体反爬-动态映射)
学习网址: https://jia666666.blog.csdn.net/article/details/108974149 ----------------------------------- ...
- python爬虫进阶-大众点评店铺信息(字体反爬-静态映射)
目的 获取大众点评店铺信息 详细需求 http://www.dianping.com/shenzhen/ch10 思路解析 一 通过F12查找目标信息位置,进行分析 同理进行其他信息的解析,分析汇总 ...
- python爬取实习僧招聘信息字体反爬
参考博客:http://www.cnblogs.com/eastonliu/p/9925652.html 实习僧招聘的网站采用了字体反爬,在页面上显示正常,查看源码关键信息乱码,如下图所示: 查看网页 ...
- python爬虫之汽车之家论坛帖子内容爬取
Datawhale爬虫 第五期 Day7 实战项目:汽车之家车型论坛帖子信息 作为国内目前第一大汽车论坛,反爬虫很恶心,中间很多坑. 新手,第一次搞这么复杂的爬虫,前期没有排查,都是遇到坑的时候再返回 ...
- Python 爬虫实战 汽车某家(四) 车型配置
文章目录 一.工具选择 二.demo示例 三.完整代码 前言:汽车之家车型配置数据是js加载+js动态伪元素防爬加载,原始页面中不存在任何数据,因此通过scrapy显式爬取已经不太可能,通过查阅大量资 ...
- Python 爬虫实战 汽车某家(一) 品牌
文章目录 一.品牌爬取 1.进入主页.测试待爬取内容是否为动态加载 2.找到动态请求 3.shell测试请求 附件:异步请求返回的品牌导航栏html 环境: python3.6 scrapy1.5.1 ...
- Python 爬虫实战 汽车某家(五) 口碑、评分
文章目录 一.项目结构 二.核心类代码 爬取内容 1.用户口碑明细评分 2.口碑标题.发表日期.口碑推荐级别 3.购车目的 4.购车价格 5.购车经销商 一.项目结构 point.txt 为断点保存文 ...
- Python 爬虫实战 汽车某家(三) 车型
文章目录 一.爬取逻辑分析 核心 二.爬取页面销售状态分析 三.爬取页面车型列表分析 四.停售分页分析 五.指导价和评分爬取 1.指导价html片段 2.有评分html片段 3.无评分html片段 一 ...
- Scrapy框架第一个爬虫项目--汽车之家二手车列表信息抓取
废话不多说,上代码 1.以下代码为spider文件 import scrapy from car_home.items import che168Itemclass Che168Spider(scra ...
最新文章
- PyTorch max()函数取最大值
- 3月6日 输入与输出 数据类型 运算符
- Vue011_ 内置指令与自定义指令
- 一个java源文件允许_一个Java源文件中最多只能有一个class定义
- oracle删除唯一索引sql语句_高级SQL之在选择语句中使用更新和删除
- 子查询四(在select子句中使用子查询)
- javaWeb:相关监听方法汇总
- google protobuf Linux环境下的安装与使用
- 在Node中基于Mongoose对MongoDB进行增删查改(CRUD)操作(一)
- linux mc服务器 mod_使用阿里云服务器搭建饥荒联机版服务器(最新有效2020.2.9更新)...
- 数据终端设备与无线通信模块之间串行通信链路复用协议(TS27.010)在嵌入式系统上的开发【转】...
- 查看当前python环境_python-环境
- python实现logistic增长模型拟合2019-nCov确诊人数2月1日更新
- 格拉姆矩阵(Gram Matrix)
- 前端html的base64使用方法window.btoa()和window.atob()
- 应用中删除iCloud照片或视频 删除相册照片或视频
- Ubuntu安装播放器 或 Linux上比较好用强大、并且可以倍速播放的播放器SMplayer
- 一、webpack的全局安装和局部安装以及使用
- Mac xmind 8完美破解教程
- MySQL数据打标_易打标(标签条码打印软件)
热门文章
- 用python绘制叠加等边三角形_使用turtle库绘制叠加等边三角形
- 截流式合流制设计流量计算_截流式合流制管渠的水力计算要点
- 【Disturbed People】【CodeForces - 1077B】(思维水题)
- 有个程序员的老公是种什么体验,嫁给程序员,我超级后悔!
- 深度学习第一章(rnn)
- CSDN创作中心Markdown编辑器基本使用方法
- 使用百度地图API实现地图生成、标记以及标注
- 11月赠书活动获奖读者
- 会说话的代码 Python pyttsx3,及AttributeError:partially initialized module......(......)报错,解决方法
- 一根均线选股法_一根均线选股法视频教程