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日

相关文章

  • Python环境配置实现pip加速过程解析

    下面是Python环境配置实现pip加速过程解析的完整攻略。 环境配置 安装Python 首先,需要在官网 https://www.python.org/downloads/ 下载 Python 版本的安装文件。 下载完成后,双击安装包运行,一路点击下一步进行安装。安装完成后,打开命令提示符或者终端,输入以下命令检查 Python 是否安装成功: pytho…

    python 2023年5月14日
    00
  • 使用python实现excel的Vlookup功能

    下面我将详细讲解使用python实现excel的Vlookup功能的完整实例教程。 简介 Vlookup是Excel中的一个非常常用的函数,它可以在一个范围内查找某个值,并返回其在此范围内的对应值。Python中有一些库可以实现类似的功能,比如pandas和openpyxl等。在这个例子中,我们将使用pandas库来完成这个功能。 步骤 1. 安装panda…

    python 2023年5月13日
    00
  • Python 词典(Dict) 加载与保存示例

    接下来我将为你详细讲解 Python 词典(Dict) 加载与保存示例的完整攻略。 什么是 Python 词典(Dict)? Python 中的词典(Dict)是一种无序、可变的集合数据类型,用于存储以键-值对形式保存的数据。 以下是一种简单的词典示例: person = {‘name’: ‘Alice’, ‘age’: 25, ‘country’: ‘Ca…

    python 2023年5月13日
    00
  • Python下的twisted框架入门指引

    以下是详细讲解“Python下的twisted框架入门指引”的完整攻略,包含两个示例说明。 1. Twisted框架简介 Twisted是一个基Python的事件驱动网络框架,它提了异步I/O、网络协议、线程、进程和分布式应用等功能。Tw框架的核心是事件循环,它可以同时处理多个连接和请求,提高了网络应用的性能和可扩展。 2 Twisted框架安装 在使用Tw…

    python 2023年5月14日
    00
  • 用python进行视频剪辑

    用 Python 进行视频剪辑的完整攻略 介绍 很多人在创作视频时都需要进行剪辑,例如删减无用镜头、调整视频长度等等。这些任务通常需要使用视频编辑软件,例如Adobe Premiere和Final Cut Pro等。然而,如果你想批量剪辑大量视频,或者想用编程方式剪辑视频,Python将为你提供方便的解决方案。 在本文中,我们将介绍如何使用Python进行视…

    python 2023年6月2日
    00
  • 基于Python_脚本CGI、特点、应用、开发环境(详解)

    以下是“基于Python_脚本CGI、特点、应用、开发环境(详解)”的完整攻略: 什么是Python脚本CGI? Python脚本CGI是一种Web编程技术,它允许Python脚本在Web服务器上运行,并生成动态Web页面。CGI是“公共网关接口”的缩写,它是一种标准,用于在Web服务器和Web应用程序之间传递数据。 Python脚本CGI的特点 Pytho…

    python 2023年5月14日
    00
  • 浅谈python requests 的put, post 请求参数的问题

    以下是关于Python requests的PUT、POST请求参数的问题的攻略: 浅谈Python requests的PUT、POST请求参数的问题 在使用Python requests库发送PUT、POST请求时,需要设置请求参数。以下是浅谈Python requests的PUT、POST请求参数的问题的攻略。 PUT请求参数 使用Python reque…

    python 2023年5月15日
    00
  • plt.figure()参数使用详解及运行演示

    下面我来详细讲解一下“plt.figure()参数使用详解及运行演示”的攻略。 1. matplotlib.pyplot.figure() matplotlib.pyplot.figure()是用于创建一个具有指定属性的新Figure对象的函数。Figure对象用于承载并展示所有的图形元素。在创建Figure实例后,我们需要在其上添加一个或多个Axes对象才…

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