猫眼字体反爬虫

 我在这里不直接瞎bb, 只提供代码。 因为好多人写的都很棒, 我在这里面提供链接,想看的童鞋可以去看, 一步步跟别人走就能 get 到你想要的。 大佬链接:

https://blog.csdn.net/xing851483876/article/details/82928607

https://blog.csdn.net/weixin_42812527/article/details/86548948\

其实我的代码也是偷的, 只不过稍微修改了下, 嘻嘻嘻,主要是会了就行, 别人的东西学会了就是自己的,贱贱的!!!

import re
import base64
import chardet
import requests
from scrapy import Selector
from fontTools.ttLib import TTFont


url = 'https://piaofang.maoyan.com/?ver=normal'
headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",
}
response = requests.get(url=url, headers=headers)
coding = chardet.detect(response.content).get('encoding', 'utf-8')    # 得到编码格式
response = str(response.content, encoding=coding, errors='ignore')    # 解码得到字符串

# 第一次获取的字体,以及对应编码位置,需要手动写一次。  getGlyphNames()  和  getGlyphOrder()  这个是有用的
origin_fonts = TTFont('online_base64.ttf')
origin_obj_list1 = origin_fonts.getGlyphNames()[1:-1]  # 获取所有字符的对象,去除第一个和最后一个,之前的图已经解释清楚为什么去掉最后一个和第一个。
origin_uni_list1 = origin_fonts.getGlyphOrder()[2:]    # 获取所有编码,去除前2个。
# origin_dict = {'uniF855': '1', 'uniF755': '8', 'uniF617': '9', 'uniE4CA': '4', 'uniE912': '6', 'uniF514': '3',
#                'uniE3A5': '7', 'uniF594': '5', 'uniF16A': '0', 'uniF09C': '2'}

# 写出第一次字体文件的编码和对应字体。
origin_dict = {'uniE08C': '8', 'uniE8F5': '2', 'uniEF9B': '1', 'uniEDD2': '9', 'uniEDA2': '3', 'uniF294': '4', 'uniF7F6': '0',
                'uniE352': '7', 'uniF357': '5', 'uniE35B': '6'}

# 获取字体文件的base64编码
online_ttf_base64 = re.findall(r"base64,(.*)\) format", response)[0]
print(online_ttf_base64)
online_base64_info = base64.b64decode(online_ttf_base64)
with open('new_online_base64.ttf', 'wb')as f:
    f.write(online_base64_info)
online_base64_fonts = TTFont('new_online_base64.ttf')  # 网上动态下载的字体文件。
online_obj_list2 = online_base64_fonts.getGlyphNames()[1:-1]  # 同上。
online_uni_list2 = online_base64_fonts.getGlyphOrder()[2:]


# 第一个 和 第二个进行对比, 得到的对象相同说明是相同的数字, 然后再替换一下得到的字符串。
# 接着就相当于获取得到了相同的对象, 根据第一个获取到的字典, 动态变化生成第二个。
# 下面的这个demo 是死的, 直接复制粘贴就行
for uni2 in online_uni_list2:
    obj2 = online_base64_fonts['glyf'][uni2]  # 获取编码uni2在online_base64.ttf中对应的对象
    for uni1 in origin_uni_list1:
        obj1 = origin_fonts['glyf'][uni1]  # 获取编码uni1在origin.ttf 中对应的对象。
        if obj1 == obj2:  # 如果对象一等于对象二
            dd = "&#x" + uni2[3:].lower() + ';'  # 把编码uni2替换成Unicode编码格式。
            if dd in response:  # 如果编码uni2的Unicode编码格式在response中,那么替换成origin_dict[uni1]的字体。
                response = response.replace(dd, origin_dict[uni1])

response_info = Selector(text=response)
all_info = response_info.xpath('//ul[@class="canTouch"]')  # 获取所有的信息
print(len(all_info))
exit()
print('电影名字' + '\t' + '实时票房(万元)' + '\t' + '票房占比' + '\t' + '排片占比' + '\t' + '上座率')
for each_info in all_info:
    # 这个一行一行的取数据, 也可以。  因为这个是规则的, 也可以一列一列的取, 一一对应就行了
    # extract_first()  相当于  extract()[0] 意思是一样的
    movie_name = each_info.xpath('li[1]/b/text()').extract_first()  # 电影名字
    ticket_number = each_info.xpath('li[2]/b/i[@class="cs"]/text()').extract_first()  # 实时票房(万元)
    ticket_rate = each_info.xpath('li[3]/i[@class="cs"]/text()').extract_first()  # 票房占比
    film_rate = each_info.xpath('li[4]/i[@class="cs"]/text()').extract_first()  # 排片占比
    upper_seat_rate = each_info.xpath('li[5]/span/i[@class="cs"]/text()').extract_first()  # 上座率
    print(movie_name + '\t' + ticket_number + '\t' + ticket_rate + '\t' + film_rate + '\t' + upper_seat_rate)

猜你喜欢

转载自blog.csdn.net/chang995196962/article/details/88344448