爬取网页曲线图数据的应用十分广泛。在市场分析领域,投资者可以通过分析金融网站上的股票曲线图数据来了解股市趋势,从而做出更明智的投资决策。在科学研究中,研究人员可以通过爬取科学期刊网站上的曲线图数据来分析实验结果,推动科学进步。在气象领域,气象学家可以通过爬取气象网站上的气温曲线图数据来进行天气预测和气候分析。此外,政府部门、社会科学研究机构等也可以利用爬取到的曲线图数据进行政策制定、社会调查等工作。
一、爬取数据步骤
爬取网页曲线图数据是一种获取网络上可视化数据的技术,在这个过程中,爬虫程序被用来自动地从网页上提取出曲线图所包含的数据,并将其用于进一步的分析、预测或可视化展示。下面将对爬取网页曲线图数据的过程、应用和相关注意事项进行详细探讨。通常情况下,这个过程可以分为以下几个步骤:
确定目标网页:确定需要从中提取数据的目标网页。这可能是包含所需曲线图的特定网站页面,或者是一个在线数据可视化平台。
分析网页结构:仔细分析目标网页的结构,找到曲线图的HTML元素以及包含数据的相关标签或属性。对网页的结构进行彻底的了解将有助于后续的数据提取工作。
解析数据:使用网络爬虫技术,编写代码来自动地从网页上提取出曲线图所包含的数据。这通常需要使用一些工具或库,如Python中的BeautifulSoup、Scrapy等,来解析HTML文档,并提取出需要的数据。
数据处理:获取到的数据可能需要进行一些处理,以确保其准确性和可用性。这可能包括数据类型转换、缺失值处理、异常值处理等操作,以使数据适合后续的分析和可视化。
可视化展示:最后,将爬取到的曲线图数据使用数据可视化工具进行展示。这可以是简单的折线图、散点图,也可以是更复杂的多变量图表或动态交互式图表,视需求而定。
二、网页曲线图常用的数据格式
在网络开发中,JSON(JavaScript Object Notation)数据格式已经成为一种非常流行的数据组织和交换方式,它也常被用来存储网页曲线图数据。JSON格式的数据组织具有简洁、灵活、易读易写等特点,在网页曲线图数据的存储和传输中有着诸多优势。JSON是一种轻量级的数据交换格式,其基本结构由键值对构成,适合用于表示结构化数据。在网页曲线图数据中,通常会有时间序列和对应的数值序列,而JSON格式正好可以很好地表达这种关系。以一个简单的例子来说明,假设有一个温度曲线图数据,包含时间和温度两个字段,那么可以使用JSON格式表示如下:
{
"data": [
{"time": "2024-02-27 08:00", "temperature": 20},
{"time": "2024-02-27 09:00", "temperature": 22},
{"time": "2024-02-27 10:00", "temperature": 24},
{"time": "2024-02-27 11:00", "temperature": 23},
{"time": "2024-02-27 12:00", "temperature": 25}
]
}
在这个JSON数据中,"data"键对应的值是一个包含多个时间-温度键值对的数组,每个元素表示一个时间点的温度数据。
2.1 JSON数据格式的特点
简洁性:JSON格式相对于其他数据格式(如XML)而言更加简洁,不需要像XML那样使用大量的标签,使得数据更加紧凑,便于传输和存储。
易读性:JSON格式的数据易于阅读和理解,这使得它在调试、开发和维护过程中更加方便。人们可以直观地理解数据的结构,而无需依赖特定的解析工具。
兼容性:JSON格式在各种编程语言中都有支持,这意味着无论是在前端JavaScript还是后端服务器端,都可以方便地解析和处理JSON格式的数据。
易于处理:JSON格式的数据可以轻松地转换为JavaScript对象,这使得在网页中直接使用这些数据变得非常方便。
可扩展性:JSON格式支持嵌套结构,可以很容易地表示复杂的数据关系,同时也支持添加额外的字段以满足需求的扩展。
2.2 JSON数据格式优劣势
优势 | 劣势 | ||
---|---|---|---|
轻量级 | JSON数据相比其他格式(如XML)更轻量,传输和解析速度更快 | 不适合大规模数据 | 对于大规模数据,JSON格式可能会占用较多的空间,不如二进制格式高效 |
易读性 | JSON数据结构清晰,易于理解和调试。 | 不适合复杂结构 | 虽然JSON支持嵌套结构,但相比XML等格式,其表达复杂结构的能力有限 |
跨平台性 | JSON在不同平台和编程语言中都有广泛的支持 | ||
易于处理 | JSON数据可以直接转换为JavaScript对象,方便在网页中使用 |
综上,JSON数据格式在网页曲线图数据的组织中具有诸多优势,包括简洁性、易读性、跨平台性和易处理性等。尤其在Web开发中,JSON已经成为了一种标准的数据交换格式,被广泛应用于前后端数据传输和存储中。然而,在实际应用中,需要根据具体需求和场景选择合适的数据格式,以达到最佳的效果。
三、应用实例
3.1 爬取网站https://wildershares.com/since_launch.php
- 查看网页结构(开发者模式)
- 解析数据
#数据在<Script></Script>里
import requests
from bs4 import BeautifulSoup
import re
import csv
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
# 定义目标网页的URL
url = "https://wildershares.com/since_launch.php"
# 定义请求头
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Cache-Control": "max-age=0",
"Referer": "https://wildershares.com/",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Upgrade-Insecure-Requests": "1",
"Host": "wildershares.com",
}
# 发送GET请求获取网页内容
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 200:
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(response.content, 'html.parser')
# 找到所有的<script>标签
script_tags = soup.find_all('script')
# 提取数据
data = []
for script_tag in script_tags:
script_text = script_tag.get_text()
pattern = r'x: new Date\((\d+), (\d+), (\d+)\),\s+y: ([\d.]+)'
matches = re.findall(pattern, script_text)
for match in matches:
x_year, x_month, x_day, y_value = match
date_str = f"{x_year}-{x_month}-{x_day}"
if "2024" in date_str: # 仅选择2024年的数据
data.append([date_str, float(y_value)])
# 写入CSV文件
with open("result.csv", "w", newline="") as csvfile:
writer = csv.writer(csvfile)
writer.writerow(["Date", "Value"])
writer.writerows(data)
# 提取年份和数值
dates = [item[0] for item in data]
values = [item[1] for item in data]
# 绘制曲线图
plt.figure(figsize=(10, 6))
plt.plot(dates, values, marker='o', linestyle='-')
plt.xlabel("Date")
plt.ylabel("Value")
plt.title("Data Since Launch (2024)")
plt.xticks(rotation=45)
plt.gca().xaxis.set_major_formatter(DateFormatter("%Y-%m-%d"))
plt.tight_layout()
# 显示图形
plt.show()
else:
print("Failed to retrieve the webpage. Status code:", response.status_code)
- 2024年曲线展示
3.2 爬取网站http://data.eastmoney.com/cjsj/oil_default.html
- 查看网页结构(开发者模式)
- 定位目标数据
点击上图网址(网址是动态的,不能直接抓取),打开网页
将上面数据复制用写字板保存为data.txt文件(JSON格式)
- 解析数据
mport json
import csv
import matplotlib.pyplot as plt
from datetime import datetime
datafile = 'data.txt'
resultfile = 'result.csv'
# Read the JSON data from the file
with open(datafile, 'r', encoding='utf-8') as file:
try:
data = json.load(file)
except json.JSONDecodeError as e:
print("Error decoding JSON:", e)
exit()
# Write the extracted data to a CSV file
with open(resultfile, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
# Write header
writer.writerow(['Date', 'Close', 'QY', 'CY'])
# Prepare data for plotting
dates = []
closes = []
qys = []
cys = []
# Iterate through each item in the JSON data
for item in data:
# Extract the required fields
date_str = item.get('DATE', '')
close = item.get('CLOSE', '')
qy = item.get('QY', '')
cy = item.get('CY', '')
# Write the extracted data to the CSV file
writer.writerow([date_str, close, qy, cy])
# Convert date string to datetime object
date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
dates.append(date)
closes.append(close)
qys.append(qy)
cys.append(cy)
# Plotting
fig, ax1 = plt.subplots(figsize=(10, 6))
color = 'tab:red'
ax1.set_xlabel('Date')
ax1.set_ylabel('Close', color=color)
ax1.plot(dates, closes, color=color, label='Close')
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('QY & CY', color=color)
ax2.plot(dates, qys, color=color, linestyle='--', label='QY')
ax2.plot(dates, cys, color=color, linestyle='-.', label='CY')
ax2.tick_params(axis='y', labelcolor=color)
fig.tight_layout()
plt.title('Stock Data Over Time')
fig.autofmt_xdate(rotation=45)
fig.legend(loc="upper left")
# Save the plot as an image file
plt.savefig('stock_data_plot_adjusted.png')
# Show the plot
plt.show()
- 图形展示
总结
网页曲线图通常使用JSON(JavaScript Object Notation)格式来组织数据。JSON是一种轻量级的数据交换格式,易于阅读和编写,也易于机器解析和生成。在网页曲线图中,数据以键值对的形式存储,常见的键包括时间(x轴)和数值(y轴)。例如,时间可以表示为日期格式,而数值则可以是整数或浮点数。JSON格式的数据结构简单直观,方便传输和处理。同时,它与JavaScript密切相关,可以直接在网页中使用,实现动态数据可视化。