从网页中提取数据:JSON 数据读取全指南
在当今的互联网时代,网页早已不再是静态的文本和图片集合,它们背后通常隐藏着丰富的数据,这些数据以结构化的格式存储,JSON(JavaScript Object Notation) 是最流行、最常用的一种,无论是获取天气信息、股票行情,还是爬取社交媒体动态,学会如何从网页中读取 JSON 数据都是一项至关重要的技能,本文将为你详细拆解这个过程,从基础概念到实际代码,带你一步步。
什么是 JSON?为什么网页爱用它?
在开始读取之前,我们首先要明白 JSON 是什么。
JSON 是一种轻量级的数据交换格式,它易于人类阅读和编写,也易于机器解析和生成,它的结构非常直观,类似于 JavaScript 中的对象和数组,由两种基本结构组成:
- 键值对 (Key-Value Pair):由一个“键”(字符串)和一个“值”(可以是字符串、数字、布尔值、数组、对象或 null)组成,用冒号 分隔。
"name": "张三"。 - 数组 (Array):值的有序集合,用方括号
[]括起来,值之间用逗号 分隔。["苹果", "香蕉", "橙子"]。
一个复杂的 JSON 对象可能同时包含这两种结构:
{
"status": "success",
"data": {
"userId": 123,
"userName": "李四",
"posts": [
{
"id": 1,
"title": "我的第一篇博客",
"content": "这是博客内容..."
},
{
"id": 2,
"title": "今日天气真好",
"content": "阳光明媚,适合出游。"
}
]
}
}
网页为什么偏爱 JSON?
- 简洁高效:相比于 XML 等格式,JSON 文件更小,解析速度更快。
- 与 JavaScript 无缝集成:JSON 本身就是 JavaScript 的一个子集,在浏览器端可以非常方便地直接解析,无需额外的库。
- 结构清晰:层次分明的结构使得数据组织井然有序,易于理解和操作。
从网页获取 JSON 数据的两种主要方式
网页提供 JSON 数据通常有两种途径:API 接口 和 内嵌脚本。
-
API 接口(最常见、最推荐的方式) 许多网站会提供公开的 API(Application Programming Interface),你可以向特定的 URL 发送一个请求(通常是 HTTP GET 请求),服务器就会返回一个包含 JSON 格式数据的响应,查询天气的 API 可能会返回一个 JSON 字符串告诉你当前城市的温度、湿度等信息。
-
内嵌脚本(在 HTML 中查找) 有些网站为了在页面加载后动态渲染内容,会将数据以 JSON 格式直接写在
<script>标签里,这些<script>标签通常会有一个特殊的type属性,type="application/ld+json"(用于结构化数据)或type="application/json",你可以直接解析这些标签内的文本内容。
实战演练:如何读取 JSON 数据
下面我们通过具体的代码示例,展示如何在不同场景下读取 JSON 数据,我们将使用 Python 语言,因为它在数据爬取和处理方面拥有强大的库支持。
通过 API 接口读取 JSON
这是最标准、最优雅的方式,我们将使用 requests 库来发送 HTTP 请求,并用 json 库来解析返回的数据。
步骤 1:安装必要的库
如果你还没有安装 requests,请先在终端或命令行中运行:
pip install requests
步骤 2:编写代码
假设我们要访问一个公开的 API(JSONPlaceholder,一个免费的在线测试 API)来获取一篇博客文章的数据。
import requests
import json
# 1. 定义要请求的 API URL
api_url = "https://jsonplaceholder.typicode.com/posts/1"
try:
# 2. 发送 GET 请求,获取响应
response = requests.get(api_url)
# 3. 检查请求是否成功 (状态码 200 表示成功)
response.raise_for_status()
# 4. 解析 JSON 数据
# response.text 是原始的 JSON 字符串
# response.json() 会自动将 JSON 字符串解析为 Python 字典
data = response.json()
# 5. 打印并使用数据
print("成功获取数据!")
print("-" * 20)
print(f"数据类型: {type(data)}") # <class 'dict'>
print(f"标题: {data['title']}")
print(f"内容: {data['body']}")
print(f"用户ID: {data['userId']}")
except requests.exceptions.HTTPError as http_err:
print(f"HTTP 错误发生: {http_err}")
except requests.exceptions.RequestException as err:
print(f"请求发生错误: {err}")
except json.JSONDecodeError:
print("响应内容不是有效的 JSON 格式。")
代码解析:
requests.get(api_url):向指定的 URL 发送一个 GET 请求。response.raise_for_status():如果请求失败(服务器返回 404 或 500 错误),这行代码会抛出异常,帮助我们快速定位问题。response.json():这是最关键的一步。requests库的Response对象内置了json()方法,它会自动将服务器返回的 JSON 格式文本内容解析成一个 Python 字典,这样你就可以像操作普通 Python 字典一样访问数据了。
从网页的 <script> 标签中读取 JSON
假设我们访问一个网页,其 HTML 中包含以下脚本:
<script type="application/json" id="product-data">
{
"productId": "SKU-98765",
"productName": "无线蓝牙耳机",
"price": 299.00,
"inStock": true,
"features": ["降噪", "长续航", "快充"]
}
</script>
我们可以使用 requests 获取 HTML 内容,然后用 BeautifulSoup 库来解析 HTML 并提取 <script> 标签中的文本。
步骤 1:安装必要的库
pip install requests beautifulsoup4
步骤 2:编写代码
import requests
import json
from bs4 import BeautifulSoup
# 1. 定义要请求的网页 URL
# 注意:这里我们用一个包含示例数据的本地文件或一个真实网页进行演示
# html_content = """
# <html>
# <head><title>测试页面</title></head>
# <body>
# <h1>产品信息</h1>
# <script type="application/json" id="product-data">
# {
# "productId": "SKU-98765",
# "productName": "无线蓝牙耳机",
# "price": 299.00,
# "inStock": true,
# "features": ["降噪", "长续航", "快充"]
# }
# </script>
# </body>
# </html>
# """
# 在实际应用中,你会用 requests.get(url).text 替代上面的 html_content
url = "https://example.com/product-page" # 替换成你想要爬取的真实网页
try:
# 获取网页内容
response = requests.get(url)
response.raise_for_status()
# 2. 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 3. 根据 ID 找到目标 <script> 标签
script_tag = soup.find('script', id='product-data')
if script_tag:
# 4. 获取标签内的文本内容(即 JSON 字符串)
json_string = script_tag.string
# 5. 解析 JSON 字符串
product_data = json.loads(json_string)
# 6. 打印并使用数据
print("成功从脚本中提取数据!")
print("-" * 20)
print(f"产品名称: {product_data['productName']}")
print(f"价格: ¥{product_data['price']}")
print(f"库存状态: {'有货' if product_data['inStock'] else '缺货'}")
print(f"特性: {', '.join(product_data['features'])}")
else:
print("未找到 ID 为 'product-data' 的 script 标签。")
except Exception as e:
print(f"发生错误: {e}")
代码解析:
BeautifulSoup(response.text, 'html.parser'):将网页的 HTML 内容解析成一个可操作的对象。soup.find('script', id='product-data'):查找id属性为product-data的<script>



还没有评论,来说两句吧...