首页 > 编程语言 >爬取网页曲线图的后台数据——Python实现

爬取网页曲线图的后台数据——Python实现

时间:2024-02-27 12:11:21浏览次数:40  
标签:plt 网页 曲线图 Python data 爬取 JSON 数据

爬取网页曲线图数据的应用十分广泛。在市场分析领域,投资者可以通过分析金融网站上的股票曲线图数据来了解股市趋势,从而做出更明智的投资决策。在科学研究中,研究人员可以通过爬取科学期刊网站上的曲线图数据来分析实验结果,推动科学进步。在气象领域,气象学家可以通过爬取气象网站上的气温曲线图数据来进行天气预测和气候分析。此外,政府部门、社会科学研究机构等也可以利用爬取到的曲线图数据进行政策制定、社会调查等工作。

一、爬取数据步骤

爬取网页曲线图数据是一种获取网络上可视化数据的技术,在这个过程中,爬虫程序被用来自动地从网页上提取出曲线图所包含的数据,并将其用于进一步的分析、预测或可视化展示。下面将对爬取网页曲线图数据的过程、应用和相关注意事项进行详细探讨。通常情况下,这个过程可以分为以下几个步骤:

确定目标网页:确定需要从中提取数据的目标网页。这可能是包含所需曲线图的特定网站页面,或者是一个在线数据可视化平台。
分析网页结构:仔细分析目标网页的结构,找到曲线图的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密切相关,可以直接在网页中使用,实现动态数据可视化。

参考文献

  1. 利用python提取网站曲线图数据
  2. 使用Python爬虫技术获取动态网页数据简洁方法与实践案例

标签:plt,网页,曲线图,Python,data,爬取,JSON,数据
From: https://www.cnblogs.com/haohai9309/p/18036143

相关文章

  • python基础知识
    《跟着孙兴华学Python基础》一、常见数据类型字符串:不能修改的字符序列。除了不能修改,可把字符串当成列表一样处理。列表:我觉得列表就是我们日常生活中经常见到的清单。比如,统计过去一周我们买过的东西,把这些东西列出来,就是清单。由于我们买一种东西可能不止一次,所以清单中是允......
  • 使用python批量删除redis key
     比如我的业务。刚上线默认为超级管理员新增权限--请导出id用于清缓存svc格式请注意分页需要导出全部selectCONCAT('@rbac/ent/aclgr/',e.id)as需要清理缓存的rediskeyfroment_rbac_groupewherenotexists(selectp.`groupid`froment_rbac_group_permissionp......
  • Python 中动态调用函数或类的方法
    使用importlib#module.pyclassA:deffoo(self):print('thisisfoo.')@staticmethoddefstatic_method():print('thisisstatic.')defbar():print('bar……')defbaz():print('==......
  • Vue+Vite+Ts+Python后端demo
    一、创建前端工程1.安装node进入官网下载:Node.js(nodejs.org) 选择安装路径后,默认安装;确认是否成功安装: 2.创建vite项目①:npminitvite@latest②:输入项目名、选择Vue、选择Ts;cd到项目文件夹里;安装依赖项:npmi,启动项目:npmrundev③:打开浏览器,进入:http://localhost:5......
  • Python3中的“联动”现象
    技术背景在python中定义一个列表时,我们一定要注意其中的可变对象的原理。虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上。如果此时我们定义另外一个变量也指到同一个可变对象的话,就会造成一个“联动”的现象。也就是改变其中的一个值时......
  • python3的json数据库-TinyDB效率篇
    安装了这个TinyDB库后,我突然想到一般来说python执行的速度并不算高,那这个库写文件速度如何呢?测试代码如下:fromtinydbimportTinyDBimporttime#创建数据库对象db=TinyDB('db.json')milliseconds1=int(time.time()*1000)db.insert({'type':'apple','count':......
  • Python函数每日一讲 - 简洁快速学会globals()函数
    引言在Python中,globals()函数是一个强大的工具,它允许您访问全局命名空间中的所有变量和函数。本文将深入探讨globals()函数的语法、用法以及实际应用场景,帮助大家更好地理解和使用这个函数。语句概览globals()函数的语法如下:globals()函数实例下面是globals()函数......
  • python3的json数据库-TinyDB
    无意间看到TinyDB这个词汇,就去查了一下,就发现了它的官方网站这里然后就是按照他说的步骤去做。第1步安装  pip3installtinydb 安装成功后,创建一个文件名字叫做 test.py,输入下面的代码:fromtinydbimportTinyDB,Query#创建数据库对象db=TinyDB('db.json')#......
  • 深入解析Python并发编程的多线程和异步编程
    本文分享自华为云社区《Python并发编程探秘:多线程与异步编程的深入解析》,作者:柠檬味拥抱。在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别是在处理I/O密集型任务时。Python提供了threading模块,使得多线程编程变得相对简单。本文将深入探讨thre......
  • 把python脚本制作成exe
    将Python脚本转换为可执行文件(exe)的方法之一是使用PyInstaller。这是一个流行的第三方库,可以将Python脚本打包成独立的可执行文件,在没有安装Python解释器的计算机上运行。以下是详细步骤:1.安装PyInstaller首先,确保你已经安装了Python和pip。然后在命令行或终端中运行以下命令来......