下面我会给出完整的攻略,请认真阅读。
1. 前置知识要求
在学习本篇攻略之前,需要对以下内容有一定的了解:
- Python基础知识
- 网络爬虫基础知识
- 字体反爬机制及解决方案
如果您对以上内容并不熟悉,建议先学习相关知识再来阅读本篇攻略。
2. 需求分析
我们的目标是爬取2021猫眼电影票房榜单,并将结果存储到本地文件中。但是,猫眼电影网站进行了字体加密反爬策略,我们需要解决这个问题。
3. 技术选型
- Python 3.X
- requests 库
- lxml 库
- fontTools 库
4. 实现步骤
- 确定目标URL
我们要爬取的是2021年每日的猫眼电影票房榜单,可以选择以下URL:
https://box.maoyan.com/promovie/api/box/second.json
- 获取字体文件
打开该URL并观察网页源代码,发现其中有一串字体文件的URL:
https://vfile.meituan.net/colorstone/4f6db24e59331a9d59588cfcce393ccf3294.woff
将该URL保存到本地,这就是我们需要的字体文件。
- 解析字体文件
我们可以使用fontTools库来解析字体文件,这样就能将加密的字体转换成可读的文字。
下面是使用fontTools库解析字体文件的示例代码:
from fontTools.ttLib import TTFont
font = TTFont('font.woff')
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()
uni_dict = {}
for uni in uni_list[1:]:
obj = font['glyf'][uni]
uni_dict[uni] = obj.coordinates
print('字体编码值和坐标:', uni_dict)
- 发送网络请求并解析数据
发送GET请求,将获取到的数据使用lxml库进行解析。
下面是示例代码:
import requests
from lxml import etree
url = 'https://box.maoyan.com/promovie/api/box/second.json'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()['data']['list']
ids = []
names = []
for item in data:
ids.append(item['movieId'])
name = ''
for c in item['movieName']:
name += chr(uni_dict[c][1] // 3 - 7)
names.append(name)
print('电影ID:', ids)
print('电影名称:', names)
- 存储到本地
将获取到的每日电影票房数据存储到本地文件中,可以使用Python内置的文件操作函数来实现。
下面是示例代码:
with open('maoyan.txt', 'a', encoding='utf-8') as f:
for i in range(len(ids)):
f.write(str(ids[i]) + ' ' + names[i] + '\n')
5. 示例
下面我将给出两个示例:
示例1:爬取2021年10月1日电影票房并保存到本地文件
import requests
from lxml import etree
from fontTools.ttLib import TTFont
url = 'https://box.maoyan.com/promovie/api/box/second.json'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()['data']['list']
# 解析字体文件
font_url = 'https://vfile.meituan.net/colorstone/4f6db24e59331a9d59588cfcce393ccf3294.woff'
response_font = requests.get(font_url)
with open('font.woff', 'wb') as f:
f.write(response_font.content)
font = TTFont('font.woff')
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()
uni_dict = {}
for uni in uni_list[1:]:
obj = font['glyf'][uni]
uni_dict[uni] = obj.coordinates
ids = []
names = []
for item in data:
ids.append(item['movieId'])
name = ''
for c in item['movieName']:
name += chr(uni_dict[c][1] // 3 - 7)
names.append(name)
# 保存到本地文件
with open('maoyan.txt', 'w', encoding='utf-8') as f:
for i in range(len(ids)):
f.write(str(ids[i]) + ' ' + names[i] + '\n')
示例2:将每日电影票房数据保存到MySQL数据库中
import requests
from lxml import etree
from fontTools.ttLib import TTFont
import pymysql
url = 'https://box.maoyan.com/promovie/api/box/second.json'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()['data']['list']
# 解析字体文件
font_url = 'https://vfile.meituan.net/colorstone/4f6db24e59331a9d59588cfcce393ccf3294.woff'
response_font = requests.get(font_url)
with open('font.woff', 'wb') as f:
f.write(response_font.content)
font = TTFont('font.woff')
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()
uni_dict = {}
for uni in uni_list[1:]:
obj = font['glyf'][uni]
uni_dict[uni] = obj.coordinates
ids = []
names = []
for item in data:
ids.append(item['movieId'])
name = ''
for c in item['movieName']:
name += chr(uni_dict[c][1] // 3 - 7)
names.append(name)
# 保存到MySQL数据库中
conn = pymysql.connect(host='localhost', user='root', password='123456', database='test', charset='utf8mb4')
cursor = conn.cursor()
for i in range(len(ids)):
sql = "INSERT INTO maoyan(id, name) VALUES (%s, '%s')" % (ids[i], names[i])
try:
cursor.execute(sql)
conn.commit()
except:
conn.rollback()
cursor.close()
conn.close()
以上就是“Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)”的详细攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版) - Python技术站