博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记录猫眼电影的自定义字体反爬
阅读量:6323 次
发布时间:2019-06-22

本文共 2917 字,大约阅读时间需要 9 分钟。

猫眼电影用的是动态字体库

猫眼电影榜单国内票房榜,地址:

首先需要获得字体文件,在页面或css里搜@font-face或font-famil

在font刷新页面几次发现字体会变化,字体库是动态的

解决方案

建立字和动态字体库字形的联系

原理

字体用类似表的结构记录字,比如cmap记录了unicode索引和字形,这里反爬用到的表示glyf字形表,表里记录了具体的字形笔画数据,

且表里只记录了字形数据,不关联其他表。有专门的loca表按顺序记录glyf表里字形的位置,在使用字体时通过loca表来找到具体字形。

所以可以利用字形数据来找到自定义字体unicode与字的联系。

字体资料整理记录在:  

找关联思路:

 

1.在猫眼电影下载一个字体做为基准,建立基准字体unicode和字的关系。

2.刷新网页后下载新字体,记为网站字体2,通过比较网站字体1和网站字体2的字形找到unicode和新unicode联系。

3.再通过相同的unicode来建立字和变化字体库unicode的联系,最后将新unicode替换成字。

 代码

headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}r=requests.get("https://maoyan.com/board/1",headers=headers)font1_url="http:"+re.findall("url\(\'(\/\/.*?woff)\'\)",r.text,re.M)[0] #创建font目录保存基准字体if not os.path.exists("font"):    font1=requests.get(font1_url,headers=headers) os.mkdir("font") with open("./font/base.woff","wb")as f: f.write(font1.content)

下载一次基准字体并保存到font目录

base_font = TTFont('./font/base.woff')base_dict=[]for i in range(len(baseFont.getGlyphOrder()[2:])):    print(f"对应的数字{i+1}:")    w=input()    base_dict.append({"code":baseFont.getGlyphOrder()[2:][i],"num":w})

建立基准字体的unicode和真实字符的关系,查看unicode使用的软件是FontCreator

 

代码只需要执行一次,直接按顺序输入数字

new_font_url="http:"+re.findall("url\(\'(\/\/.*?woff)\'\)",r.text,re.M)[0]font=requests.get(new_font_url,headers=headers)with open("new_font.woff","wb")as f:    f.write(font.content)new_font = TTFont('new_font.woff')new_font_code_list=new_font.getGlyphOrder()[2:]

页面改变后的字体下载,获取unicode列表

replace_dic=[]for i in range(10):    news = new_font['glyf'][new_font_code_list[i]]    for j in range(10):        bases = base_font['glyf'][base_dict[j]["code"]]        if news == bases: unicode=new_font_code_list[i].lower().replace("uni","&#x")+";" num= base_dict[j]["num"] replace_dic.append({"code":unicode,"num":num})

建立新unicode和字符的关系

org_data=r.textfor i in range(len(replace_dic)):    new_data=new_data.replace(replace_dic[i]["code"],replace_dic[i]["num"])

全局替换unicode成字符

tree=etree.HTML(org_data)dds=tree.xpath('//dl[@class="board-wrapper"]/dd')info=[]for dd in dds:    title=dd.xpath('.//p[@class="name"]/a/@title')[0]    star=dd.xpath('.//p[@class="star"]/text()')[0].replace("主演:","") time=dd.xpath('.//p[@class="releasetime"]/text()')[0].replace("上映时间:","") realticket=dd.xpath('.//p[@class="realtime"]//text()')[1]+dd.xpath('.//p[@class="realtime"]//text()')[2].strip() totalticket=dd.xpath('.//p[@class="total-boxoffice"]//text()')[1]+dd.xpath('.//p[@class="total-boxoffice"]//text()')[2].strip() info.append({"标题":title,"主演":star,"上映时间":time,"实时票房":realticket,"总票房":totalticket})

抓一些信息,下面是结果

保存成csv

import csvcsv_file = open("1325.csv", 'w', newline='')keys = []writer = csv.writer(csv_file)keys = info[1].keys()writer.writerow(keys)for dic in info: for key in keys: if key not in dic: dic[key ] = '' writer.writerow(dic.values()) csv_file.close()

结果

用的库

转载于:https://www.cnblogs.com/shenyiyangle/p/10711065.html

你可能感兴趣的文章
【web charting】21个Javascript图表插件程序
查看>>
div没有设置高度时背景颜色不显示(浮动)
查看>>
NYOJ39水仙花数
查看>>
20165318 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
查看>>
python爬虫-韩寒新浪博客博文
查看>>
redis 的配置 redis.conf
查看>>
大话设计模式读书笔记5——装饰模式
查看>>
OCP 12c最新考试原题及答案(071-6)
查看>>
场解决方案添加webpart(Create Webpart to page using code)
查看>>
canvas学习笔记1——canvas基础应用
查看>>
传小米秘密自研操作系统mios 将应用于小米4(
查看>>
Device /dev/sdb1 not found (or ignored by filtering)
查看>>
猴年大吉!
查看>>
linux install JDK
查看>>
Synchronized锁性能优化偏向锁轻量级锁升级 多线程中篇(五)
查看>>
nginx tcp负载均衡配置
查看>>
OpenGL+VS2010环境配置及遇到的问题
查看>>
JavaScript设计模式 观察者模式
查看>>
[数据结构】【c语言】链表的创建和遍历
查看>>
使用多态性实现线性表(插入、删除、测长等)
查看>>