Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)

下面我会给出完整的攻略,请认真阅读。

1. 前置知识要求

在学习本篇攻略之前,需要对以下内容有一定的了解:

  • Python基础知识
  • 网络爬虫基础知识
  • 字体反爬机制及解决方案

如果您对以上内容并不熟悉,建议先学习相关知识再来阅读本篇攻略。

2. 需求分析

我们的目标是爬取2021猫眼电影票房榜单,并将结果存储到本地文件中。但是,猫眼电影网站进行了字体加密反爬策略,我们需要解决这个问题。

3. 技术选型

  • Python 3.X
  • requests 库
  • lxml 库
  • fontTools 库

4. 实现步骤

  1. 确定目标URL

我们要爬取的是2021年每日的猫眼电影票房榜单,可以选择以下URL:

https://box.maoyan.com/promovie/api/box/second.json
  1. 获取字体文件

打开该URL并观察网页源代码,发现其中有一串字体文件的URL:

https://vfile.meituan.net/colorstone/4f6db24e59331a9d59588cfcce393ccf3294.woff

将该URL保存到本地,这就是我们需要的字体文件。

  1. 解析字体文件

我们可以使用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)
  1. 发送网络请求并解析数据

发送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)
  1. 存储到本地

将获取到的每日电影票房数据存储到本地文件中,可以使用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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 解决python3.5 正常安装 却不能直接使用Tkinter包的问题

    针对 Python3.5 正常安装却不能直接使用 Tkinter 包的问题,可以按照以下步骤进行解决: 问题分析 在 Python3.5 中,Tkinter 包已经默认安装,但在某些情况下可能无法正常使用,这是因为 Tkinter 包本身依赖于 Tcl/Tk 库,如果 Tcl/Tk 库没有正确安装或者环境变量没有配置好,Tkinter 包就无法直接使用。 解…

    python 2023年6月13日
    00
  • 由浅入深学MySQL之事务全攻略

    前言 从今天开始本系列就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1707】 字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图,让你更好的理解和运用文中的技术概念,并可以给你带来具有足够…

    python 2023年5月9日
    00
  • Python小游戏之300行代码实现俄罗斯方块

    Python 小游戏之 300 行代码实现俄罗斯方块,是一篇非常有实用意义的文章,下面将详细讲解该篇文章的攻略。 准备工作 首先,需要安装 Pygame 以及 Python 开发环境,然后创建一个新的 Python 文件,命名为 tetris.py,这将是我们的项目文件。 导入 Pygame 库 在项目文件中,首先需要导入 Pygame 库,以便我们可以使用…

    python 2023年6月3日
    00
  • Python异常 ValueError的问题

    Python异常ValueError的问题攻略 在Python编程中,我们经常会遇到ValueError异常。这个异常通常是由于传递给函数的参数类型不正确或参数值不在函数预期范内引起的。本攻略将介绍如何解决ValueError异常,并提供两个示例。 解决方法 在解决ValueError异常,我们可以尝试以下方法: 检查参数类型和值 使用try-except语…

    python 2023年5月13日
    00
  • 用python计算分歧

    【问题标题】:Compute divergence with python用python计算分歧 【发布时间】:2023-04-05 19:45:01 【问题描述】: 根据this 的回答,数值向量场的散度可以这样计算: def divergence(f): num_dims = len(f) return np.ufunc.reduce(np.add, […

    Python开发 2023年4月6日
    00
  • python线程的几种创建方式详解

    我来详细讲解一下“Python线程的几种创建方式详解”的攻略。 简介 Python线程是指在一个程序内部,同时执行多个不同的线程以完成不同任务的一种机制。使用线程能够提高程序的运行效率,因为它可以同时执行多个任务,使得程序可以在某些任务被阻塞时,继续执行其他任务。 Python线程的创建方式有以下几种: 使用threading.Thread类创建线程对象 继…

    python 2023年5月19日
    00
  • 详解Python中的测试工具

    下面是详解Python中的测试工具的完整攻略。 1. 什么是测试工具 测试工具指的是用于测试和验证代码功能正确性的工具,通常包括测试框架、断言库、Mock库等。 在Python中,常用的测试工具包括unittest(Python自带)、pytest、doctest等。 2. unittest unittest是Python自带的测试框架,可以用于编写单元测试…

    python 2023年6月3日
    00
  • Python异常对象Exception基础类异常捕捉

    Python异常对象Exception基础类异常捕捉 在Python的程序执行过程中,如果遇到错误(即异常),Python解释器会停止程序的执行并抛出异常。为了更好地处理这些异常,Python提供了try和except语句来捕捉并处理异常。 try和except语句 在Python中,异常是一个类,它继承自BaseException。当程序出现异常时,Pyt…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部