url中能出现的字符_python爬虫,解决大众点评字符库反爬机制的经验

刚开始写文章还希望大家可以喜欢,对于爬虫只是个人整理出的方法,爬虫大牛请嘴下留情。“”仅限学术交流,如有冒犯请联系作者删除“”话不多说,想分析天津地区餐饮行业的大致情况,要爬出(商铺名称,星级,评价条数,人均消费金额,菜系,商圈,团购活动等)。

17ad5bc7092546eb149aebdfdd64dc32.png

可是在爬虫时发现,这些数字都是以这类方框形式展示,再看源代码,以&#xXXXX这种形式展示,这是反爬机制中的字体库反爬,要把这些代码转化成前端看到的123或天津菜等数据。

1a96292d8e122dac295fb0452dd67e14.png
感觉跟特工密码一样,真让人兴奋。

要把这些代码对应出真正的数字或汉字,需要把css内的woff字符库爬出来。获取的css链接类似如下:http://s3plus.sankuai.com/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/9a2072f4d3d2589da1b348aebb034c6c.css

在源代码中找到这样的内容,爬取下来

48f52f3d1b63332923a7bb0fb85769c8.png
#爬取代码如下
pattern=re.compile(r'//s3plus..*?.css')
url=pattern.findall(html)
url1=''.join(url)
cssurl='http:'+url1

css链接爬下来后打开看看,里面的内容,哇塞,这是什么神仙结构,可以看到里面有2种字符库。

e60ac3349a7b619e98e9f65f203074eb.png
我之前遇到过里面有4种各不相同的字符库,这里只有2种字符库,简单多了

010c79a8cf32b14d4ee5037437a22397.gif

但是css内的字体文件一直在变,光抓下来一次woff文件是不够的,既然这里实时变更,就要采取爬虫实时抓取css、下载woff。

先把第一次爬取出来的css文件中的woff文件下载下来,上面截图看的出里面有2个woff文件,是否要把所有的woff文件都下载下来呢?这要看我们都需要爬取下来什么内容,(商铺名称,星级,评价条数,人均消费金额,菜系,商圈,团购活动)这些内容看他们的class标签,属于2类,shopNum,tagname,在css文件中能查到这2个标签,分别对应一个woff文件,也就是下载这2个woff文件即可。

e54e9ffed4268d9a30e9f946676cb4fd.png

b7702076741216da8e4f5c6e7a07a3d7.png

7f18609ae71965060da95cc8ca56ccfe.png下载

下载woff文件代码:

# 将css内对应shopNum,tagname标签的font-family内容爬取出来
def css_url(html):pattern=re.compile(r'//s3plus..*?.css')url=pattern.findall(html)url1=''.join(url)cssurl='http:'+url1f=requests.get(cssurl)f.encoding='utf-8'f1=f.textshopnumfont=re.findall(r'@font-face{font-family: "PingFangSC-Regular-shopNum".*?shopNum{font-family: 'PingFangSC-Regular-shopNum';}',f1)shopnum=''.join(shopnumfont)tagnamefont=re.findall(r'@font-face{font-family: "PingFangSC-Regular-tagName".*?tagName{font-family: 'PingFangSC-Regular-tagName';}',f1)tagname=''.join(tagnamefont)return shopnum,tagname
# 将对应标签内的woff下载在本地
def unicode_dict(shopnum):shopnumlist = re.findall(r'//s3plus.meituan.net/v1/w+/font/w+.woff',shopnum)shopnumurl = "http:" + ''.join(shopnumlist)response_shopnumwoff = requests.get(shopnumurl).contentfontname = shopnumurl[-13:-5]h=open(fontname + '.woff', 'wb')h.write(response_shopnumwoff)h.close()

现在先以shopNum标签举例,举一反三tagname也就知道怎么处理了。下面就是关键,把爬取出来的一个woff文件做为基础字符库,通过FontCreator可以把编码对应的数字或汉字显示出来,下面是fontcreator打开woff文件后呈现出来的样子。

aa5886680543f74a10f1807ecf710be2.png

但要把这些编码和对应汉字转换成.xls或.txt还需要一个图像文字识别软件,推荐在线https://zhcn.109876543210.com/,把fontcreator中内容截图下来,用刚才的链接转换成.csv,直接把代码和对应的汉字都下载下来,方便直接生成字典(这是我的方法,可以根据自己的喜好来选择下载的形式),

eb264c504d5e072e04c6936a3979c876.png

aa5886680543f74a10f1807ecf710be2.png

这里的是不是unie045和&#xe045很像?只要把前面3个字符更换成uni就可以了?测试一下是真的可以的。那把编码和汉字对应上,形成字典,再replace(’uni’,’&#x’)就能把网页上的&#xXXXX转换成汉字或数字了,就能爬取下来正确的内容了。

可这只能生成一个字典,前面说过css内的woff是不断变换的,每个woff文件下载下来相同数字对应的编码都不相同,如图,

b0addd2a69a7fe7453a2e138aad715ee.png

61a8a78ca173439cb79ca53130dbd104.png

不可能每个woff文件都这样生成一个字典,其他字符库要怎么找到编码对应的汉字或数字呢?这里需要用到TTFont,from fontTools.ttLib import TTFont,把woff文件存为xml,每个编码都会生成这样一个坐标系,虽然编码不同,但是后面的坐标系是相同的,对应生成的数字或汉字也是相同的,这是一个切入点~

b371c3210c988d0fab96451226813ea2.png

303ebae8e7707e510723e997b44a74a3.png

只要通过一个字符库的xml找到坐标系和汉字、数字对应的关系,新爬下来的字符库转换成xml后,遍历他的坐标系和已知字符库的坐标系对上了,就把已知字符库的汉字或数字赋值给新的字符库,完成!

上代码:

newfont = TTFont(fontname + '.woff')
newfont.saveXML(fontname + '.xml')
basefont = TTFont('1d7914a7.woff')
unicodedict = {"unie046": "跟", "unif305": "块", "unif230": "1", "unie713": "2", "unie86f": "3", "unie5f3": "4","unif235": "5", "unie7c3": "6", "unif558": "7", "unie383": "8", "unif5f6": "9", "unie8f4": "0","unieb6b": "店", "unie015": "中", "unif44f": "美", "unif4fe": "家", "unif5b5": "馆", "unie6b4": "小","unif78b": "车", "unie0a1": "大", "unif191": "市", "unie5eb": "公", "unif33f": "酒","unif0a1": "行", "unie19a": "国", "unie075": "品", "unie4d5": "发", "unif2ed": "电", "uniea88": "金","uniec19": "心", "unie240": "业", "unif77e": "商", "unif87a": "司", "unief51": "超", "unie877": "生","uniebf3": "装", "unied5e": "园", "unie0c0": "场", "unie723": "食", "unif167": "有", "uniec25": "新","unief2b": "限", "unieb71": "天", "unie36b": "面", "unie4e5": "工", "unie820": "服","unieb69": "海", "unie591": "华", "unif5ab": "水", "unif653": "房", "unie3d5": "饰", "unif48e": "城","unif042": "乐", "unie31f": "汽", "unif76c": "香", "unie056": "部", "unie5b9": "利", "unif860": "子","unie661": "老", "unif316": "艺", "unie714": "花", "unif101": "专", "uniedf8": "东", "unie66e": "肉","unif6eb": "菜", "unif897": "学", "unif2a7": "福", "unie148": "饭", "unif313": "人","uniedf7": "百", "unied1a": "餐", "unif7be": "茶", "unie32e": "务", "unie63b": "通", "unie45b": "味","unif397": "所", "unieda8": "H1", "unie761": "区", "unif6cf": "门", "unie424": "药", "uniedc9": "银","unif87c": "农", "unie462": "龙", "unie04a": "停", "unie610": "尚", "unif0ea": "安", "unie913": "广","unie399": "鑫", "uniebb2": "—", "unie04b": "容", "unie21a": "动", "unie225": "南","unif024": "具", "unif165": "源", "unie259": "兴", "uniecb3": "鲜", "unie4a3": "记", "unif109": "时","unif4ed": "机", "unie5c7": "烤", "unif276": "文", "unie538": "康", "unied4c": "信", "uniedca": "果","unif1d5": "阳", "unif6f9": "理", "unie83a": "锅", "unif7e1": "宝", "unif094": "达", "unif18e": "地",....... }       # 太长了做缩略,全部代码后面会附上。
newfont_glyphNames=newfont.getGlyphNames()[1:-1]
basefont_glyphNames=basefont.getGlyphNames()[1:-1]
temp={}
a=len(unicodedict)
for i in range(0,a):for j in range(0,a):if newfont['glyf'][newfont_glyphNames[i]]==basefont['glyf'][basefont_glyphNames[j]]:temp[newfont_glyphNames[i].replace('uni','&#x').lower()]=unicodedict[basefont_glyphNames[j]]else:pass
return temp

通过上面几步,基本上就可以把爬取下来的字段对应出正常的汉字或数字了,再保存到mysql中,结果如下。

5dd72f0d4e47a0417b9cbe97df02ece7.png

整理思路:

1、 爬取出css链接,从css内解析出shopNum,tagname标签的woof文件

2、 将下载下来的一个woff文件做为基础,用fontcreator和诚华OCR,将编码对应的汉字和数字整理成字典。

3、 将已知的字符库用TTFont存为xml,用getGlyphNames()和if条件语句判断新下载的字符库和已知字符库是否有相同的坐标系,有的话将字典内的值赋给新的字符库的编码,用replace(‘uni’,‘&#x’)将Unicode编码转换为网页上的编码,形成新的字典。

4、 通过以上方式生成2类字典,shopNum字典和tagname字典。

5、 将爬取出来的&#xXXXX这个格式的内容,区分匹配哪类字典,再将字典的值赋给对应的编码,形成最终的前端显示的文字或数字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上课点名app_【APP种草】网瘾少年的自我救赎之最强锁机软件

相信在这个魔幻的2020,大家都经历了很多个不寻常吧。作为学生党,算是圆梦了在家学习的愿望,可当这一切都变成现实的时候,也还是没逃过点名、没逃过网课,这不,连期末考也又双叕叕地来了。作为一名需要在家完…

qrcode生产带logo_比亚迪换新标?新Logo的含义你了解吗?

对于许多制造业品牌来说,由于时代发展的速度太快,科技的力量进步太快,即便是规模庞大的老牌企业,也需要不断改变自己,以此来适应社会的改变求得生存。这就意味着,无论是什么品牌,都需要定期改变…

超前进位加法器实验报告_干货 | 加法器与反相加法器原理解析

什么是加法器加法器是为了实现加法的,即是产生数的和的装置。加数和被加数为输入,和数与进位为输出的装置为半加器。若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。常用作计算机算术逻辑部件,执行逻辑操作、…

php 支付宝小程序授权登陆验签_星巴克“啡快”登陆支付宝小程序,让你“飞快”取到咖啡...

当代年轻人的生活方式是怎样的?靠地铁通勤,靠咖啡续命早上睁不开眼,咖啡来一杯中午昏昏欲睡,咖啡来一杯晚上熬夜加班,咖啡来一杯喝完这杯,还有一杯“宁可食无肉,不可早无星”是当代年轻人的座右…

python导入同一文件夹下的类_python自定义模块

模块的引入方式:1.import 模块名:导入模块中的所有内容(引入多个用逗号分隔)import random,time2.from 模块名 import 函数名1,函数名2...导入部分模块(导入部分的话直接使用)3.from 模块名 imp…

上河南星海科技_揭秘丨赣江新区网红打卡点,为你按下科技快进键!

人类对科学和未来永无止境的求知欲,是人类社会发展的根本动力之一。整合历史长河中积累的科学文明,探索和体验未来的黑科技,在赣江新区,一座国际创新科技馆在全城翘首中揭开了神秘面纱,一举跃升为赣江新区的网红打卡点…

模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!

在Excel中,有一类函数被称为查找和引用函数,今天,小编给大家分享6个查询函数(Choose、Lookup、Hlookup、Vlookup、Match、Index)的应用技巧,可以收藏备用哦!一、Choose。功能:根据序…

共阳极管的代码_共阳极数码管-共阳极数码管显示

共阴极数码管高电平驱动,公共端是负极 共阳极数码管低电平驱动,公共端是正极共阳极七段数码管,如果要显示字母L,则abcdefg七段对应的段应该接电平是答案是:A1110001最低027元/天开通百度文库会员,可在文库查…

python环境介绍_Python介绍以及Python环境搭建

Python介绍以及Python环境搭建1.Python 发展历史Python是由Guido van Rossum在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的,据说是在圣诞节花了一个圣诞节的时间用C语言创造出来的,Python用一部他喜欢的英国喜剧《Mo…

oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)

一、行转列pivot关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型))select * from table_name pivot(max(column_name) --行转列后的列的值value,聚合函数是必须要有的for column_name in(value_1,value_2,value_3…

python安装poi第三方库_使用Python获取城市POI数据

1.数据接口:本次使用百度地图开放平台中的地点检索API来获取城市POI数据,此次以矩形区域检索为例。2.获取思路:因为百度出于数据保护目的,单次访问服务最多同时返回400条数据,不过官方也给出了解决方案,即通…

oracle 对两列加唯一性束_oracle中创建unique唯一约束(单列和多列) 。

oracle中的unique约束是用来保证表中的某一类,或者表中的某一类组合起来不重复的一种手段。我们在可以在创建表时或者创建好后通过修改表的方式来创建oracle中的unique约束。下面是一些创建unique约束的例子:create table unique_test(id number,fname varchar2(20)…

foc 电流环解耦_永磁同步电机矢量控制的解耦及电流环的设计

闸的情况下,系统的初始加速度均为LTJ,如此看来,不管如何优化设定系统的参数,能够改变的仅仅是加速度的变化模式及其经历过程的时间长短,而其最大加速度数值是无法改变的。实际系统当然不会这么理想,至少传…

vivoy9s怎么设置返回键_vivoy9s怎么设置返回键 可以使用虚拟导航键

vivoy9s是支持全面屏手势的,若用户想要返回操作的话,主要看用户选择的手势导航方式,一般来说可以通过上滑返回到手机桌面,当然了,若用户不习惯手势导航,可以设置虚拟导航键,这样的话手机屏幕下方…

1万并发服务器配置_小程序后端服务器搭建:云服务器配置(1)

起因最近在搞小程序,有一个留言与图片上传并展示的功能,用小程序自带云服务器也可以实现,但如果与别的端进行多端互动就需要一个服务器来做为后端,进行图片与留言的上传,并把留言内容和上传后的图片地址保存到sql数据库…

cgo的效率 golang_golang CGO FAQ TIPS : cgo 从 C 传递 slice 到 go

cgo 从 C 传递 slice 到 go这里一般会用在c的callback中。需要加一个wrapper,比直接调用go函数中间多了一个转换步骤,但方便了许多。执行流程为,c调用发起 -> c wrapper -> go export.go://export a_function_callbackfunc a_function_…

php 图片印章_php工具型代码之印章抠图

能将白底红字的印章抠出来,用的是php,框架是laravel,其他框架请自行调节。扣其他颜色也可以,把里面的那段rgb参数判断改改就行了,最后抠出来的效果就是白底变透明,然后只留下红色的章,放在其他页…

vb mysql_VB连接MYSQL实例

VB连接MYSQL实例电脑需安装数据库mysql server和mysql connector net相关版本软件。在工程的‘项目’-‘添加引用’中添加引用‘mysql.data’实现代码如下:Imports System.IOImports SystemImports System.DataImports System.Windows.FormsImports MySql.Data.MySq…

c web mysql数据库_C连接Mysql数据库代码

//vc工具中添加E:\WAMP\BIN\MYSQL\MYSQL5.5.8\LIB 路径//在工程设置-》链接》库模块中添加 libmysql.lib#include #include #include #include #include "E:\wamp\bin\mysql\mysql5.5.8\include\mysql.h"void main(){MYSQL *conn;MYSQL_RES *res;MYSQL_ROW row;char …

ext 如何判断是否是整数_Excel表格技巧—如何用ISNUMBER判断是否是数值

在EXCEL的单元格中,有些单元格为填写的不是数值,在某些情况下,会影响计算结果,例如,以下的表格中,红框内的单元格一个是输入了一个空格,另一个“—”符号,后面平均值的计算未将该单元…