python爬取带stonefont字体网页的经历

本文讲述了在爬取使用stonefont字体的电影网站票价信息时遇到的问题及解决方案。作者通过分析网页源代码,下载字体库文件,并使用FontCreator软件查看字形定义,建立数字与编号的对应关系,实现字符解码,从而正确获取票价信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

在爬取某电影网站票价信息时,使用selenium定位票价元素信息时,发现票价显示“□□”,如下图所示:


而通过chrome浏览器“查看网页源代码”方式查看该元素数值时,显示的是非正常票价数值,如下图所示:


二、 问题解决思路

百度查询相关解决方案,发现该网页使用了web-font字体,网页在打开时调用美团字体库对页面中数值进行渲染,需要找出当前网页使用的字体库,因为每次打开网页调用的字体库不一样, 所以需要每次都与基本库字形进行对比,找出实际对应的数字。在该网页源代码中字体库地址如下图所示:


三、解决流程

1、环境

from  selenium import webdriver
from selenium.webdriver.chrome.options import Options
from fontTools import ttLib

FontCreator软件,用于查看下载的字体库文件,可以比较直观的查看字形定义和字形代码。

2、解决流程

1)下载字体文件

下载网页字体库文件woff,保存到电脑中(文件后缀为woff),用于建立用于后期对比的基本字形库(字形名和字形定义),只下载一次即可。需要使用正则表达式搜索网页源代码中字体下载地址。这部分功能用的requests库,其它用的selenium,其实也可以全部用selenium,requests和selenium在解决该类问题时的区别在后面再说一下。

### 猫眼电影实时票房数据爬虫实现方法 猫眼电影作为中国领先的电影票务平台,提供了丰富的电影数据。为了抓取其实时票房数据,可以使用 Python 的 `requests` 和 `BeautifulSoup` 或 `selenium` 工具来实现。以下是具体的实现方式和代码示例。 #### 1. 使用 Requests 和 BeautifulSoup 抓取数据 如果目标页面的票房数据是通过 HTML 渲染的,可以使用 `requests` 和 `BeautifulSoup` 来解析页面内容并提取所需信息。 ```python import requests from bs4 import BeautifulSoup import pandas as pd # 设置请求头,模拟浏览器访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } # 请求猫眼电影实时票房页面 url = "https://maoyan.com/board/1" # 示例URL,请根据实际情况调整 response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 解析票房数据 movies = [] for item in soup.select('.board-item-content'): name = item.find('p', class_='name').text.strip() box_office = item.find('p', class_='realtime').find('span', class_='stonefont').get('data-act').split('-')[-1] total_box_office = item.find('p', class_='total-box-office').find('span', class_='stonefont').get('data-act').split('-')[-1] movies.append({ '电影名称': name, '当日票房': box_office, '累计票房': total_box_office }) # 将数据保存为CSV文件 df = pd.DataFrame(movies) df.to_csv('maoyan_box_office.csv', index=False, encoding='utf-8-sig') print(df.describe()) print("票房均值:", df['当日票房'].astype(float).mean()) # 转换为浮点数计算均值[^1] ``` #### 2. 使用 Selenium 处理动态加载数据 如果猫眼电影的实时票房数据是通过 JavaScript 动态加载的,则需要使用 `selenium` 来模拟浏览器行为。 ```python from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By import pandas as pd # 启动Chrome浏览器 service = Service('path/to/chromedriver') # 替换为本地chromedriver路径 driver = webdriver.Chrome(service=service) # 打开猫眼电影实时票房页面 url = "https://maoyan.com/board/1" driver.get(url) # 提取数据 movies = [] items = driver.find_elements(By.CLASS_NAME, 'board-item-content') for item in items: name = item.find_element(By.TAG_NAME, 'a').text box_office = item.find_element(By.CLASS_NAME, 'realtime').text.split(':')[-1] total_box_office = item.find_element(By.CLASS_NAME, 'total-box-office').text.split(':')[-1] movies.append({ '电影名称': name, '当日票房': box_office, '累计票房': total_box_office }) # 关闭浏览器 driver.quit() # 保存为CSV文件 df = pd.DataFrame(movies) df.to_csv('maoyan_box_office_selenium.csv', index=False, encoding='utf-8-sig') print(df.describe()) print("票房均值:", df['当日票房'].str.extract(r'(\d+)').astype(float).mean()) # 提取数字并计算均值[^2] ``` #### 注意事项 - **反爬虫机制**:猫眼电影可能对频繁访问进行限制,建议设置合理的请求间隔或使用代理 IP。 - **数据格式化**:部分数据可能包含特殊字符(如字体图标),需通过 `data-act` 属性或其他方式提取实际数值。 - **合法性**:确保爬取行为符合目标网站的服务条款和相关法律法规[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值