在做过58同城的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼是客户要求的网址,那么便开始搞起来。

目标网址

猫眼经典电影

2020大陆影片_电影_经典片-猫眼电影

很明显和汽车之家的论坛是字体的加密,那么按照之前的步骤走:
第一步:找到字体文件,下载下来。
第二步:通过Font Creator工具读取下载好的字体文件。
第三步:按顺序拿到各个字符的unicode编码,并写出对应的文字列表。
第四步:将顺序unicode编码写成对应的unicode的类型。
第五步:替换掉文章中对应的unicode的类型的文字。
按照上边的简单的步骤一顿乱搞,发现最后更本就不对,这点作者是深有体会,不禁想这是为什么?想了好久也没有想太明白,那么只有去网上找资源,还好关于猫眼的爬虫不少,作者这里参考了他们的思路:

目的

采集的2019、2018、2017的电影信息,字段含电影名、上演时间、上演地区、市场、评分、票房、评价总人次(本次源码里无)、演员,其余字段就靠大家积极补充了。(个人能力有限及时间有限)

分析

什么猫眼不同于汽车之家呢?这里最重要的一点是,猫眼这里的字体是多个字体文件,每次访问会给你返回不同的字体的文件,这也就是为什么对不上字体的原因。索性访问两次下载两套字体进行对比,如下图:

可以发现两次虽然是同一个文字但是字符编码发生了变化,完全和第一个不一样了,这个时候怎么解决呢?不禁考虑虽然对应的字符编码是改变的,那么同一个字体的结构会发生变化吗?(当然这是后话,以后自己可以往这个方向考虑),事实可以通过查看两个个字体文件内部数据结构,方法如下:

先手动查看源码找到对应的文件直接下载,如下图:

本次作者下载woff地址是:vfile.meituan.net/colorstone/c4e1abb1a992f1f2bf87821129b3a40d2280.woff

from fontTools.ttLib import TTFont
font = TTFont('test.woff')  # 打开本地字体文件online_base64.ttf
font.saveXML('test.xml')  # 将ttf文件转化成xml格式并保存到本地,主要是方便我们查看内部数据结构

打开test.xml文件可以看到类似html标签的结构.这里我们用到的标签是<GlyphOrder…>和<glyf…>如下图:

那么看一下<GlyphOrder…>标签,内包含着所有编码信息,注意前两个是不是0-9的编码,需要去除。如下图

在看一下<glyf…>标签 内包含着每一个字符对象,同样第一个和最后一个不是0-9的字符,需要祛除。在这里自己有点小理解:可以打开另外一个字体的结构,发现对象的结构是不变的,变化的只是对应的字符编码。

没时间了,先上源码莫嫌弃(后期在慢慢完善):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : cj.py
# @Author: itlaolang
# @Date  : 2020-01-13 04:39
# @Contact : itlaolang@163.com
# @Software : PyCharm
# @Desc  :描述
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : caiji.py
# @Author: itlaolang
# @Date  : 2020-01-07 16:51
# @Contact : itlaolang@163.com
# @Software : PyCharm
# @Desc  :采集猫眼电影
import os
import json
from  xml.etree import ElementTree as ET
# r = ET.parse('web.xml')
# print(r)
from xml.dom.minidom import parse
import xmltodict
from fontTools.ttLib import TTFontdef printtree(p):if p.hasChildNodes()==0:returnelse:for x in p.childNodes:printtree(x)def th(xmldoc1):xmldoc = parse(xmldoc1)text = json.dumps(xmltodict.parse(xmldoc.toxml()), indent=4)# print(text)text_json = json.loads(text)list = []list1 = []num = 0for k, v in text_json.get('ttFont').items():if k == 'cmap':list = v.get('cmap_format_4')if k == 'glyf':list1 = v.get('TTGlyph')ysbm = {}for i in list:if i['@platEncID'] == '3':num1 = 0for ii in i['map']:if num1 != 0 :ysbm[ii['@name']] = ii['@code'][1:]num1 = num1 + 1print(ysbm)temp1={}num2 = 0for i in list1:# print(i['@name'])if num2 != 0 :for k, v in i.items():ybm = ''data1=[]if k == 'contour':if type(v)==dict:for iiii in v.get('pt'):ybm = ybm+json.dumps(iiii)data1.append(iiii)# iiii         print(json.dumps(iiii))else:for iiii in v:for iiii in iiii.get('pt'):ybm = ybm+json.dumps(iiii)data1.append(iiii)# print('))))))))')# print(k)# print(ybm)temp1[i['@name']]=data1num2 = num2 + 1# print(temp1)data1={}data2={}for k,v in ysbm.items():data2[v]=temp1[k]# print(data2)return data2
def test():xmldoc1 = parse("test.xml")text = json.dumps(xmltodict.parse(xmldoc1.toxml()), indent=4)text_json = json.loads(text)list = []list1 = []num = 0for k, v in text_json.get('ttFont').items():if k == 'cmap':list = v.get('cmap_format_4')if k == 'glyf':list1 = v.get('TTGlyph')ysbm = {}for i in list:if i['@platEncID'] == '3':num1 = 0for ii in i['map']:if num1 != 0:ysbm[ii['@name']] = ii['@code'][1:]num1 = num1 + 1temp1 = {}num2 = 0for i in list1:# print(i['@name'])if num2 != 0:for k, v in i.items():ybm = ''data1 = []if k == 'contour':if type(v) == dict:for iiii in v.get('pt'):ybm = ybm + json.dumps(iiii)data1.append(iiii)# iiii         print(json.dumps(iiii))else:for iiii in v:for iiii in iiii.get('pt'):ybm = ybm + json.dumps(iiii)data1.append(iiii)# print('))))))))')# print(k)# print(ybm)temp1[i['@name']] = data1num2 = num2 + 1# print(temp1)data1 = {}data2 = {}j=["3","1","0","5","2","6","7","9","8","4"]numb=0for k, v in ysbm.items():data2[j[numb]] = temp1[k]numb=numb+1# print(data2)return data2def tihuan(s,ss):data={}for k,v in s.items():# print(v)for i in v:for k1,v1 in ss.items():for ii in v1:if i==ii:data[k]=k1breakprint('______________')print(data)return dataimport requests
from bs4 import BeautifulSoup
import re
import time
import csvdef xie(aa):b = [aa[0],aa[1], aa[2], aa[3],aa[4],aa[5],aa[6]]c = []c.append(b)with open("rul18.csv", "a+") as csvfile:writer = csv.writer(csvfile)# 先写入columns_name# writer.writerow(["index", "a_name", "b_name"])# 写入多行用writerowswriter.writerows(c)
heard={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','Cookie':'__mta=252426550.1578386784263.1578880752527.1578880757029.106; uuid_n_v=v1; uuid=305C6350312A11EAAFF74B96B91393FE697BD1F626FD454B9C9BE17C4573B069; _csrf=912fb7d87b6b2be10fa6c006c7f8ff3dca2e8046d150df287ae7b43373a62fe9; _lxsdk_cuid=16f7f2efd26c8-06db984d1a3a07-1d376b5b-13c680-16f7f2efd26c8; mojo-uuid=3628b7cca1fbe628e02e7217d561824a; lt=uWHePaJz08QdlIPJYXQc4EwhOp8AAAAAyQkAAHvmgHwm3_XWExp-YRStdbxmhB4H3lUFAlMqeZT2cVPczJr6q_RBKT-rbRuf6-2kdg; lt.sig=DWBPDQrL5UqBOS-B49b5VJfzr7c; theme=moviepro; _lxsdk=305C6350312A11EAAFF74B96B91393FE697BD1F626FD454B9C9BE17C4573B069; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1578663920,1578668029,1578827974,1578855616; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; mojo-session-id={"id":"1cb15fec3630c1c5d56b4c9512f97fa1","time":1578880176906}; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1578880909; __mta=252426550.1578386784263.1578880757029.1578880909045.107; mojo-trace-id=77; _lxsdk_s=16f9c978a6c-233-4ff-215%7C2796253285%7C102'
}
def xq(xqurl):# xqurl='https://maoyan.com/films/1279731'html = requests.get(xqurl, headers=heard).text# print(html.find("'woff'"))# print(html[html.find("embedded-opentype")+39:html.find("'woff'")-10])woff=html[html.find("embedded-opentype")+39:html.find("'woff'")-10]wofflink = 'http://' + woffr = requests.get(wofflink, headers=heard)with open('tt.woff', "wb") as f:f.write(r.content)f.close()font1 = TTFont('tt.woff')  # 读取woff文件font1.saveXML('tt.xml')  # 转成xmldata=tihuan(th('tt.xml'),test())# &#xe51c;for k ,v in data.items():print(k,v)html=html.replace("&#"+k+";",v)import time# time.sleep(600)htmltxet = BeautifulSoup(html, "html.parser")pianming=htmltxet.find("h3",attrs={"class":"name"}).text.strip()leixing=htmltxet.find_all("li",attrs={"class":"ellipsis"})[0].text.strip()shany = htmltxet.find_all("li", attrs={"class": "ellipsis"})[1].text.strip()dalu = htmltxet.find_all("li", attrs={"class": "ellipsis"})[2].text.strip()print(pianming)print(leixing,shany,dalu)# pingfen=re.search('<span class="stonefont">&#xef97;.&#xf03c;</span>')if htmltxet.find("span", attrs={"class": "stonefont"}) != None:pingfen1 = htmltxet.find("span", attrs={"class": "stonefont"}).textelse:pingfen1 = '暂无'if htmltxet.find("div",attrs={"class":"movie-index-content box"}) != None:pioafang=htmltxet.find("div",attrs={"class":"movie-index-content box"}).textelse:pioafang = '暂无'print(pioafang)print(pingfen1)yy=''for i in htmltxet.find_all("li",attrs={"class":"celebrity actor"}):print(i.find('a',attrs={"class":"name"}).text.strip())yy=yy+","+i.find('a',attrs={"class":"name"}).text.strip()print("44$$$$$$$$$$$$$$")data=[]data.append(pianming)data.append(leixing)data.append(shany)data.append(dalu)data.append(pingfen1)data.append(pioafang)data.append(yy)xie(data)d=0
for ii in range(6,68):print(ii)url="https://maoyan.com/films?sourceId=2&yearId=13&showType=3&sortId=3&offset="+str(ii*30)html=requests.get(url,headers=heard).texthtmltxet = BeautifulSoup(html, "html.parser")for i in htmltxet.find_all("div",attrs={"class":"movie-item"}):# print(i.find('a').get('href'))xqurl="https://maoyan.com"+i.find('a').get('href')d=d+1print("第{0}个电影链接:{1}".format(d,xqurl))xq(xqurl)# time.sleep(4)
# print(htmltxet)

源码文件下载链接:https://download.csdn.net/download/qq_31151511/12099755

20200113Python爬虫---猫眼字体反爬相关推荐

  1. Python爬虫---猫眼字体反爬

    在做过汽车之家论坛的字体反爬过后,信心稍微增长点,那么索性找点字体文件反爬的网址,猫眼便是一个不错的网址,那么便开始搞起来. 目标网址 https://piaofang.maoyan.com/?ver ...

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

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

  3. 十三、学习分布式爬虫之字体反爬

    字体反爬 字体反爬原理 网页开发者自己创造一种字体,因为在字体中每个文字都有其代号,那么以后在网页中不会直接显示这个文字的最终的效果,而是显示他的代号,因此即使获取到了网页中的文本内容,也只是获取到文 ...

  4. 爬虫woff字体反爬破解

    好久没写爬虫了,最近发现很多网站都出现了woff字体反爬.百度找了一下,发现都要钱,只好默默说一声fuck 那么,只好自己破解了.好的,那么开始. 如果你在抓去某个网站时候,抓下来的文字读不通,打开n ...

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

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

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

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

  7. python爬虫: 使用knn算法破解猫眼动态字体反爬

    猫眼字体反爬 动态变化的字形使用阈值判断误差率较大,甚至看到有的老哥使用ocr去搞-,大概两个月前,第一次看到有大佬使用knn算法搞字体反爬(源码地址),听说效果不错,一直没有时间去尝试,不仅仅是没有 ...

  8. 猫眼电影字体反爬-自动处理字体加密

    猫眼电影字体反爬 我们再爬取猫眼电影的时候,会遇到如下情况: 我们想要其中想看人数的数据,但是在网页源代码中并不是直接显示数字而是这一串东西. 这一串,其实是猫眼本身的一种字体,目的是不想每个人都获取 ...

  9. 爬取在线全面小说网小说(字体反爬)

    小说网字体反爬 小说网址:https://www.tianhuajinshu.com/ 在手机端浏览小说时,有时候开启无图模式发现部分文字加载不出来,还有的不能使用浏览自带的阅读模式进行阅读,也就是无 ...

最新文章

  1. 手把手教你重构乱糟糟的代码
  2. 计算机技术在农业上应用论文,浅谈计算机在农业中的应用论文(2)
  3. 关于Raid0,Raid1,Raid5,Raid10的总结
  4. 算法提高课-搜索-最短路模型-AcWing 1076. 迷宫问题:bfs最短路、路径
  5. 风控特征—时间滑窗统计特征体系
  6. 获取ntoskrnl的基址
  7. WPF中的触发器(Trigger)
  8. C#的多线程机制探索2
  9. 二维数据和一维指针数组
  10. 题目SPOOLing系统的设计与实现
  11. 有关 !DOCTYPE HTML
  12. 【Python】彩色图片转为灰度图(4行脚本搞定)
  13. 50个提高会话技巧的方法 (转IT经理人)
  14. UCINET软件使用简介——主菜单简介2
  15. 三体 读后思考-泰勒展开/维度打击/黑暗森林
  16. air dots 配对_AirDots 使用分享
  17. java机顶盒_Java技术在数字电视机顶盒中的应用
  18. python自动发送短信验证码、短信通知、营销短信、语音短信
  19. C语言实现简单小游戏---扫雷
  20. LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件...

热门文章

  1. 偏爱小市值策略的,进来了解下这个策略
  2. OPENGL中GLU和GLUT工具箱
  3. 手工玫瑰花_手工折纸玫瑰花的超级好学教程(转)
  4. 【论文解读 EMNLP 2018 | JMEE】Jointly Multiple EE via Attention-based Graph Information Aggregation
  5. java打字游戏和解析_java类与对象案例之打字游戏
  6. Android 动态改变SeekBar进度条颜色与滑块颜色
  7. MAC Boook打印长图
  8. 华为手机信息不弹屏了为什么_华为手机短信不提醒如何解决?四种方法来帮你!...
  9. 初遇初识初知接下来是什么_初识爱|《傲慢与偏见》书评
  10. C语言基础-fscanf函数使用示例