Python爬虫技术 第28节 数据可视化
Python 爬虫设计结合数据可视化是一个非常强大的组合,可以用来分析和展示从网络获取的数据。以下是如何设计一个 Python 爬虫并结合数据可视化的详细步骤:
步骤 1: 确定数据源和目标
首先,确定你想要爬取的数据源和目标。例如,你可能想要爬取一个新闻网站的所有头条新闻,并对其进行可视化分析。
步骤 2: 设计爬虫
使用 Python 的 requests 和 BeautifulSoup 库来设计爬虫。
import requests
from bs4 import BeautifulSoupdef fetch_news(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')news_items = soup.find_all('h2', class_='news-title')news_data = [{'title': item.text, 'link': item.a['href']} for item in news_items]return news_data
步骤 3: 存储数据
将爬取的数据存储到文件或数据库中。
def store_data(news_data, filename='news_data.json'):import jsonwith open(filename, 'w', encoding='utf-8') as file:json.dump(news_data, file, ensure_ascii=False, indent=4)
步骤 4: 数据清洗
对存储的数据进行清洗,确保数据的质量和一致性。
def clean_data(news_data):# 清洗数据的逻辑cleaned_data = [news for news in news_data if news['title'] and news['link']]return cleaned_data
步骤 5: 数据可视化
使用 Python 的 matplotlib、seaborn 或 plotly 等库来进行数据可视化。
示例:使用 matplotlib 绘制新闻标题的词云
from wordcloud import WordCloud
import matplotlib.pyplot as pltdef generate_wordcloud(cleaned_data):text = ' '.join([news['title'] for news in cleaned_data])wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)plt.figure(figsize=(10, 5))plt.imshow(wordcloud, interpolation='bilinear')plt.axis('off')plt.show()# 假设已经清洗了数据
cleaned_news_data = clean_data(fetch_news('http://example-news.com'))
store_data(cleaned_news_data)
generate_wordcloud(cleaned_news_data)
示例:使用 seaborn 绘制新闻发布时间的分布图
import seaborn as sns
import pandas as pd
from datetime import datetimedef plot_news_distribution(cleaned_data):# 假设每条新闻数据中包含发布时间news_df = pd.DataFrame(cleaned_data)news_df['published_time'] = pd.to_datetime(news_df['published_time'])sns.histplot(news_df['published_time'], kde=False)plt.title('News Distribution Over Time')plt.xlabel('Time')plt.ylabel('Number of News')plt.show()# 假设已经清洗了包含时间的数据
plot_news_distribution(cleaned_news_data)
步骤 6: 交互式可视化
使用 plotly 创建交互式图表,提高用户体验。
import plotly.express as pxdef interactive_news_visualization(cleaned_data):news_df = pd.DataFrame(cleaned_data)fig = px.bar(news_df, x='published_time', y='title', title='Interactive News Bar Chart',labels={'title': 'News Title', 'published_time': 'Published Time'})fig.show()interactive_news_visualization(cleaned_news_data)
步骤 7: 定期更新和自动化
使用 schedule 库定期运行爬虫和可视化脚本,实现自动化。
import schedule
import timedef job():print("Fetching and visualizing news...")cleaned_news_data = clean_data(fetch_news('http://example-news.com'))store_data(cleaned_news_data)generate_wordcloud(cleaned_news_data)plot_news_distribution(cleaned_news_data)interactive_news_visualization(cleaned_news_data)# 每12小时运行一次
schedule.every(12).hours.do(job)while True:schedule.run_pending()time.sleep(1)
步骤 8: 用户界面
为了使数据可视化更加友好,可以创建一个简单的用户界面,使用 Flask 或 Django 等框架。
步骤 9: 分析和洞察
最后,分析可视化结果,获取数据背后的洞察,并根据需要进行进一步的数据处理和分析。
通过上述步骤,你可以设计一个完整的 Python 爬虫项目,并结合数据可视化技术来展示和分析爬取的数据。这不仅可以帮助你更好地理解数据,还可以为决策提供支持。
接下来,让我们进一步扩展上述代码,确保它更加健壮、易于维护,并具有更好的用户体验。
爬虫代码简介
首先,我们完善爬虫部分的代码,增加异常处理和日志记录。
import requests
from bs4 import BeautifulSoup
import logging# 设置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')def fetch_news(url):try:response = requests.get(url, timeout=5)response.raise_for_status() # 检查请求是否成功except requests.exceptions.HTTPError as err:logging.error(f"HTTP error occurred: {err}")return []except requests.exceptions.RequestException as e:logging.error(f"Error during requests to {url}: {e}")return []soup = BeautifulSoup(response.text, 'html.parser')news_items = soup.find_all('h2', class_='news-title')news_data = [{'title': item.text.strip(), 'link': item.a['href']} for item in news_items]return news_datadef store_data(news_data, filename='news_data.json'):try:import jsonwith open(filename, 'w', encoding='utf-8') as file:json.dump(news_data, file, ensure_ascii=False, indent=4)except IOError as e:logging.error(f"Error writing to file {filename}: {e}")
数据清洗代码简介
接下来,完善数据清洗的代码,确保数据的一致性和准确性。
def clean_data(news_data):cleaned_data = []for news in news_data:if 'title' in news and 'link' in news:cleaned_data.append({'title': news['title'],'link': news['link'],'published_time': datetime.now() # 假设每条新闻的发布时间是爬取时间})return cleaned_data
数据可视化代码简介
然后,我们来完善数据可视化部分的代码,确保图表的准确性和美观性。
词云生成代码简介
from wordcloud import WordCloud
import matplotlib.pyplot as pltdef generate_wordcloud(cleaned_data):text = ' '.join(news['title'] for news in cleaned_data)wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)plt.figure(figsize=(15, 10))plt.imshow(wordcloud, interpolation='bilinear')plt.axis('off')plt.title('News Title Word Cloud')plt.show()
新闻发布时间分布图代码简介
import seaborn as sns
import pandas as pddef plot_news_distribution(cleaned_data):news_df = pd.DataFrame(cleaned_data)news_df['published_time'] = pd.to_datetime(news_df['published_time'])plt.figure(figsize=(12, 6))sns.histplot(news_df['published_time'], bins=24, kde=False, color='skyblue')plt.title('News Distribution Over Time')plt.xlabel('Time')plt.ylabel('Number of News')plt.xticks(rotation=45)plt.show()
完善交互式可视化代码
使用 plotly 创建交互式图表。
import plotly.express as pxdef interactive_news_visualization(cleaned_data):news_df = pd.DataFrame(cleaned_data)fig = px.bar(news_df, x='published_time', y='title', title='Interactive News Bar Chart',labels={'title': 'News Title', 'published_time': 'Published Time'},barmode='overlay')fig.show()
自动化和定期更新代码简介
使用 schedule 库定期运行爬虫和可视化脚本。
import schedule
import timedef job():logging.info("Fetching and visualizing news...")news_data = fetch_news('http://example-news.com')cleaned_news_data = clean_data(news_data)store_data(cleaned_news_data)generate_wordcloud(cleaned_news_data)plot_news_distribution(cleaned_news_data)interactive_news_visualization(cleaned_news_data)# 每12小时运行一次
schedule.every(12).hours.do(job)while True:schedule.run_pending()time.sleep(1)
用户界面简介
创建一个简单的 Flask 应用作为用户界面。
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():return render_template('index.html') # 假设你有一个index.html模板if __name__ == '__main__':app.run(debug=True)
确保你的 Flask 应用有一个 templates 文件夹,里面有一个 index.html 文件,这个 HTML 文件可以包含一些基本的链接或按钮,用于触发爬虫和可视化脚本。
通过这些完善,你的 Python 爬虫和数据可视化项目将更加健壮、易于维护,并且具有更好的用户体验。
要进一步优化我们的爬虫和数据可视化项目,我们可以关注以下几个方面:
1. 代码模块化
将功能拆分成独立的模块,提高代码的可读性和可维护性。
# news_scraper.py
def fetch_news(url):# ... 现有代码 ...# data_cleaner.py
def clean_data(news_data):# ... 现有代码 ...# data_visualizer.py
def generate_wordcloud(cleaned_data):# ... 现有代码 ...def plot_news_distribution(cleaned_data):# ... 现有代码 ...def interactive_news_visualization(cleaned_data):# ... 现有代码 ...
2. 配置管理
使用配置文件来管理 URL、文件路径、API 密钥等配置信息。
# config.py
NEWS_URL = 'http://example-news.com'
DATA_FILE = 'news_data.json'
API_KEY = 'your_api_key_here'
在爬虫和存储函数中使用配置文件:
from config import NEWS_URL, DATA_FILEdef fetch_news():# 使用 NEWS_URL...def store_data(news_data):# 使用 DATA_FILE...
3. 错误处理和重试机制
引入更复杂的错误处理和重试机制,确保爬虫的稳定性。
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retrydef requests_retry_session(retries=3, backoff_factor=0.3, status_forcelist=(500, 502, 504), session=None):session = session or requests.Session()retry = Retry(total=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist)adapter = HTTPAdapter(max_retries=retry)session.mount('http://', adapter)session.mount('https://', adapter)return session
4. 异步处理
使用异步请求提高数据获取效率。
import aiohttpasync def fetch_news_async(url, session):async with session.get(url) as response:return await response.text()# 使用 aiohttp 运行异步爬虫
async def main():async with aiohttp.ClientSession() as session:html = await fetch_news_async(NEWS_URL, session)# 解析 html 并处理数据
5. 数据库存储
考虑使用数据库(如 SQLite, MySQL, MongoDB)来存储数据,而不是简单的 JSON 文件。
# 使用 SQLite 示例
import sqlite3def store_data_to_db(cleaned_data):conn = sqlite3.connect('news_data.db')c = conn.cursor()c.execute('''CREATE TABLE IF NOT EXISTS news_data (title TEXT, link TEXT, published_time TEXT)''')for news in cleaned_data:c.execute("INSERT INTO news_data (title, link, published_time) VALUES (?, ?, ?)", (news['title'], news['link'], news['published_time']))conn.commit()conn.close()
6. 交互式 Web 界面
使用 Flask 或 Django 创建一个更完整的 Web 界面,允许用户自定义可视化参数。
# app.py
from flask import Flask, request, render_templateapp = Flask(__name__)@app.route('/visualize', methods=['POST'])
def visualize():# 根据用户请求获取数据并进行可视化...if __name__ == '__main__':app.run(debug=True)
7. 单元测试
编写单元测试来确保代码的每个部分按预期工作。
# test_news_scraper.py
def test_fetch_news():news_data = fetch_news(NEWS_URL)assert news_data, "Should return news data"...# 使用 unittest 或 pytest 运行测试
8. 日志记录
增加更详细的日志记录,帮助监控和调试。
logging.getLogger().setLevel(logging.DEBUG) # 设置日志级别
logging.debug("This is a debug message")
9. 用户文档
编写用户文档,说明如何安装、配置和使用你的项目。
10. Docker 容器化
使用 Docker 容器化你的应用,确保在不同环境中的一致性。
# Dockerfile
FROM python:3.8WORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY . .CMD ["python", "./app.py"]
通过这些优化,你的项目将更加专业、健壮和易于维护。记得在每次优化后进行充分的测试,确保新加入的特性和改进不会破坏现有功能。
相关文章:
Python爬虫技术 第28节 数据可视化
Python 爬虫设计结合数据可视化是一个非常强大的组合,可以用来分析和展示从网络获取的数据。以下是如何设计一个 Python 爬虫并结合数据可视化的详细步骤: 步骤 1: 确定数据源和目标 首先,确定你想要爬取的数据源和目标。例如,你…...
react中的装饰器
一、初见react装饰器 初初接触react,发现一些神秘符号和语法,觉得很神奇。类似这样: import React, { PureComponent, Fragment } from react; import {Form} from antd;Form.create() class UpdateForm extends PureComponent {。。。 }哇…...
Elasticsearch:用例、架构和 6 个最佳实践
1. 什么是 Elasticsearch? Elasticsearch 是一个开源分布式搜索和分析引擎,专为处理大量数据而设计。它建立在 Apache Lucene 之上,并由Elastic 支持。Elasticsearch 用于近乎实时地存储、搜索和分析结构化和非结构化数据。 Elasticsearch 的…...
tcp常用网络接口 linux环境
TCP(传输控制协议)网络通信是常见的网络应用形式,它提供了面向连接的、可靠的数据传输服务。TCP通信常用的接口主要包括以下几个方面: 常用接口 1. socket() int socket(int domain, int type, int protocol); 功能࿱…...
第10节课:JavaScript基础——网页交互的魔法
目录 JavaScript的作用JavaScript的基本语法基本语法规则变量、数据类型和运算符变量数据类型运算符 实践:使用JavaScript增强网页功能结语 JavaScript是一种高级的、解释型的编程语言,它使得网页能够从静态文档转变为具有动态交互性的应用程序。本节课将…...
springboot+vue+mybatis汽车租赁管理+PPT+论文+讲解+售后
汽车租赁系统是针对目前汽车租赁管理的实际需求,从实际工作出发,对过去的汽车租赁管理系统存在的问题进行分析,完善客户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高&…...
.NET C# 将文件夹压缩至 zip
.NET C# 将文件夹压缩至 zip 文章目录 .NET C# 将文件夹压缩至 zip1 使用 System.IO.Compression1.1 环境1.2 压缩文件夹1.2.1 简单压缩1.2.2 复杂压缩 1.3 解压缩1.3.1 简单解压缩1.3.2 复杂解压缩 2 使用 SharpZipLib2.1 环境2.2 压缩文件夹2.3 解压缩 3 压缩效果简单测试 1 …...
软考基本介绍
一,基本了解 计算机技术与软件专业技术资格(水平)考试(简称软件考试)为国家级考试。 考试设置了27个专业资格,涵盖5个专业领域, 3个级别层次(初级、中级、高级)。 中国计算机技术职业…...
【Vue】vue3 中使用 ResizeObserver 监听元素的尺寸宽度变化
要监听 div 宽度的变化,可以使用 ResizeObserver 接口。ResizeObserver 允许你观察一个或多个元素的尺寸变化,并在发生变化时执行回调函数。这种方法比使用 MutationObserver 更专注于尺寸变化,且不受元素属性变化的影响。 使用 ResizeObserv…...
信息安全专业好吗?
22 届的 211 信安毕业生,目前在读研(虽然已经和安全没关系),整体来看大部分高校的信安都是作为计算机的附属专业存在的,除了极具特色的几个高校,例如山大的密码学,广州大学某院士加持的网络安全…...
梧桐数据库(WuTongDB):数据库中元数据表的常见信息
元数据表是数据库系统中用于存储和管理元数据的表。这些表提供关于数据库对象(如表、列、索引、视图、存储过程等)的详细信息。以下是元数据表的一些常见类型及其详细解释: 常见元数据表类型 表信息表 表名:TABLES描述࿱…...
在 Linux 9 上安装 Oracle 19c:克服兼容性问题 (INS-08101)
Oracle 数据库 19c 的基础版本 (19.3) 发布的时候还没有 Linux 9 ,因此在Linux 9上面安装Oracle 19c会遇到很多兼容性问题。本文将探讨如何解决这些问题。 安装步骤 设置环境变量以绕过操作系统检查: Oracle 19.3 安装程序无法识别 Linux 9。 [WARNIN…...
【踩坑】pytorch中的索引与copy_结合不会复制数据及其解决方案
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景知识 实验验证 结论分析 错误案例 处理方法 注意事项 附加说明 基本索引返回视图 高级索引返回副本 赋值操作都是原地操作 以下内容…...
十六、【Python】基础教程 - 【Flask】网络编程开发
目录 前言 Flask 基础概念 安装 Flask 示例:创建一个 Flask Web 应用 运行 Flask 应用 更复杂的例子 测试新功能 前言 Flask 是一个用 Python 编写的微型 Web 框架,它以简单性和灵活性著称,非常适合快速开发小型到中型的 Web 应用。F…...
C#初级——List 容器
容器 在C#中,容器通常指的是用于存储和组织数据的集合类。 本文介绍的容器是动态数组:List<T> 内部使用数组来存储元素,当添加元素超出当前数组容量时,会自动调整大小(扩容)。 list容器 List<&g…...
serial靶机教程
靶机下载地址 https://download.vulnhub.com/serial/serial.zip 主机发现 arp-scan -l 端口扫描 nmap 192.168.229.131 -A 根据对⽐可知serial的⼀个ip地址为192.168.47.143 该靶机开启了22端⼝和80端⼝ 对⽹站进⾏⼀个访问,⼤概意思为这是对新的cookie处理程序…...
【Linux-MISC设备】
目录 1. MISC设备2. MISC蜂鸣器实验 1. MISC设备 MISC设备的主设备号为10.MISC设备会自动创建cdev,不需要再手动创建。MISC设备是基于platform的. MISC驱动的编写的核心就是初始化miscdevice结构体变量,然后用misc_register函数向内核注册,…...
【随笔】VRRP+MSTP
虚拟路由冗余协议(Virtual Router Redundancy Protocol,VRRP) 设计采用主备模式,将VRRP组内多个路由设备都映射为一个虚拟路由设备。 一个VRRP组中只能由一台处于主控角色的路由器,可以有一个或多个备份角色的路由器。…...
vue 动态增删行,并form表单校验(附v2\v3)
Vue3 组件用的 ant 可以换成你们用,主要是form校验 前端代码 <a-formref"formRef":model"formData":label-col-props"{ span: 5 }":wrapper-col-props"{ span: 17 }"><a-row><a-form-itemlabel"角色…...
计算机网络的基本概念
IP地址(Internet Protocol Address)是指在计算机网络中每个设备的唯一标识符。它用于区分不同设备并在网络中进行数据包的路由。我们平常所使用的IP地址主要版本: IPv4 格式: 由四个整数(0到255)组成,以点…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
