我在这里不直接瞎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)