实战:爬取数据存入数据库并做可视化分析
本文选用天气预报数据作为本次文章的主题。
本文大致思维:首先登录网站,查看网页内容及数据格式(使用代码查看内容),选择两个城市及对应月份,爬取对应天气数据,进行数据预处理(如缺失值处理、数据类型转换、字符串截取等),数据的初步探索性分析(如描述性统计、数据可视化查看数据分布特征等),然后将处理后天气属性数据存储到数据库表和本地文件。存入成功后,使用代码读取数据检验是否正确。
如果本文对你有所帮助,文末点个赞支持下呀~
网页分析
第一步:选择适合进行信息爬虫的网页。
(1)由于要获取的是历史天气信息,我们不考虑常见的天气预报网页,最后选择了“天气后报网”作为目标网站。
首先我们登陆天气后报网站http://www.tianqihoubao.com
,如下:
天气后报网站
然后定位到我们需要爬取的数据所存在的网页:http://www.tianqihoubao.com/lishi/beijing/month/202209.html
。如下图,该网站天气信息按条分布,符合我们的爬虫需求。
北京9月历史天气
(2)我们查看了该网站的robots协议,通过输入相关网址,我们没有找到robots.txt
的相关文件,说明该网站允许任何形式的网页爬虫。
(3)我们查看了该类网页的源代码,如下图所示,发现其标签较为清晰,不存在信息存储混乱情况,便于爬取。
第二步:对该网页相关信息所在的url进行获取。
(1)对网页的目录要清晰的解析
网页结构
为了爬取到北京、天津两地各个月份每一天的所有天气信息,我们小组首先先对网页的层次进行解析,发现网站大体可以分为三层。
第一层是地名的链接,通向各个地名的月份链接页面
第二层是月份链接,对应各个网页具体天数
第三个层次则是具体每一天的天气信息
与是我们本着分而治之的原则,对应不同网页的不同层次依次解析对应的网页以获取我们想要的信息。
第三步:通过解析url对应的网页获取信息并存储。
(1)设置请求登录网页功能,根据不同的url按址访问网页,若请求不成功,抛出HTTPError异常。
(2)设置获取数据功能,按照网页源代码中的标签,设置遍历规则,获取每条数据。注意设置encoding='gb18030'
,改变标准输出的默认编码, 防止控制台打印乱码。
(3)设置文件存储功能,将爬取的数据按年份和月份分类,分别存储在不同的CSV文件中。注意文件名的设置为城市名加日期,方便后期整理。
爬取数据
登录天气后报网站http://www.tianqihoubao.com/
,查看网页内容及数据格式(使用代码或开发者模式查看内容)选择两个城市(如北京和天津),分别选取连续6个月的数据(注意观察网址URL的变化规律),爬取网页中的天气数据(包括城市名、日期、天气状况、气温、风力和风向),保存到DataFrame对象中,控制台输出显示上述DataFrame对象的头5行和后5行。
代码流程图
导入相关库
import numpy as np
import pandas as pd
import requests
import seaborn as sns
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
网页爬取代码
def downloadtq(url):#获取网页源代码resp = requests.get(url)html = resp.content.decode('gbk')#数据提取soup = BeautifulSoup(html,'html.parser')tr_list = soup.find_all('tr')dates,conditions,temp ,fengxiang= [],[],[],[]for data in tr_list[1:]:## 解析数据sub_data = data.text.split()dates.append(sub_data[0])conditions.append(''.join(sub_data[1:3]))temp.append(''.join(sub_data[3:6]))fengxiang.append(''.join(sub_data[6:8]))_data = pd.DataFrame()_data['日期'] = dates_data['天气情况'] = conditions_data['气温'] = temp_data['风力'] = fengxiangreturn _dataurl = 'http://www.tianqihoubao.com/lishi/beijing/month/202107.html'
d1=pd.DataFrame({},columns=['日期','天气情况','气温','风力'])
for y in [2021]:## 遍历循环1-6月的信息for m in ['01','02','03','04','05','06']:url = f'http://www.tianqihoubao.com/lishi/beijing/month/{y}{m}.html'tmp=downloadtq(url)d1=pd.concat([d1,tmp])
# d.to_csv('BJ.csv',index=0,encoding='gbk')
北京天气数据
日期 | 天气情况 | 气温 | 风力 | |
---|---|---|---|---|
0 | 2021年1月1日 | 晴/晴 | 0℃/-11℃ | 南风1-2级 |
1 | 2021年1月2日 | 晴/多云 | 1℃/-9℃ | 西南风1-2级 |
2 | 2021年1月3日 | 多云/多云 | -1℃/-9℃ | 南风1-2级 |
3 | 2021年1月4日 | 多云/晴 | -1℃/-11℃ | 西北风1-2级 |
4 | 2021年1月5日 | 晴/晴 | -2℃/-11℃ | 西南风1-2级 |
27 | 2021年6月26日 | 雷阵雨/多云 | 31℃/23℃ | 东南风1-2级 |
28 | 2021年6月27日 | 多云/晴 | 34℃/23℃ | 东风1-2级 |
29 | 2021年6月28日 | 雷阵雨/雷阵雨 | 35℃/22℃ | 南风1-2级 |
30 | 2021年6月29日 | 雷阵雨/雷阵雨 | 29℃/22℃ | 东北风1-2级 |
31 | 2021年6月30日 | 雷阵雨/阴 | 32℃/23℃ | 东南风1-2级 |
天津天气数据
日期 | 天气情况 | 气温 | 风力 | |
---|---|---|---|---|
0 | 2021年1月1日 | 晴/晴 | 0℃/-8℃ | 东北风1-2级 |
1 | 2021年1月2日 | 晴/多云 | 2℃/-6℃ | 北风1-2级 |
2 | 2021年1月3日 | 多云/多云 | 0℃/-5℃ | 东北风1-2级 |
3 | 2021年1月4日 | 多云/晴 | 1℃/-8℃ | 北风1-2级 |
4 | 2021年1月5日 | 晴/多云 | -2℃/-9℃ | 西南风3-4级 |
27 | 2021年6月26日 | 雷阵雨/雷阵雨 | 34℃/22℃ | 南风1-2级 |
28 | 2021年6月27日 | 多云/多云 | 31℃/22℃ | 东北风1-2级 |
29 | 2021年6月28日 | 阴/雷阵雨 | 32℃/23℃ | 东南风1-2级 |
30 | 2021年6月29日 | 雷阵雨/雷阵雨 | 30℃/22℃ | 东南风1-2级 |
31 | 2021年6月30日 | 阴/阴 | 31℃/22℃ | 东南风3-4级 |
数据预处理
将北京和天津的不同月份天气数据,连接合并,保存到统一的DataFrame对象中将上述保存天气的DataFrame对象,根据日期创建年度列和月份列及对应数据使用上述爬取存储DataFrame对象,将气温和天气状况属性数据(以“/”
符号分割的前后两个数字分别是白天和夜间的,如xsC/25c
) ,分别拆分为白天气温、夜间气温和白天天气状况和夜间天气状况属性数据,日期中不能有周六日信息,将数据按照日期按升序进行排序。
气温数据转换为数字形式,去除“c”显示查看字符串类型白天和夜间天气状况的非重复值个数,查看其描述性统计,显示查看数字类型白天气温和夜间气温的描述性统计,显示查看天气状况和气温属性是否有缺失值,如果有缺失值进行填充(如相邻值)按照城市和月份分组统计白天气温的均值(只有一个年度的可只用月份列,否则需要结合年度和月份两列分组),显示两个城市每个月的分组统计结果。
可视化分析
以日期为横轴x,以白天气温为纵轴y,分别绘制显示两个城市的折线图和散点图进行比较分别绘制两个城市白天气温的箱型图进行比较将两个城市每个月的分组统计结果数据,按月份绘制相应的柱状图。(完整代码请联系云朵君获取:wx: Mr_cloud_data)
存入数据库和本地
将上述处理后的数据和分组统计数据,存入数据库中对应的一个表中(不要求建立多个表,如城市表和天气表),数据库可以是sqlite或mysql。使用数据库sqlite的,需要上传数据库文件;使用数据库mysql的,需要将数据导出为sq|脚本文件上传,这里我们使用的是SQL数据库的操作,需要包含分别使用数据库专用模块和通用模块练习的代码数据库和表的名称,将上述处理后的数据和分组统计数据,导出为Excel或CSV格式文件(选择其一即可)。
import pymysql
from sqlalchemy import create_engineengine = 'mysql+pymysql://root:666@127.0.0.1:3306/PyDataStudio'
conn = create_engine(engine)## 连接数据库
try:d1.to_sql('data',conn,if_exists='replace',index=False)### 写入数据库
except:print('error')
数据库和本地文件读取
读取上述存储到本地文件中的天气数据,输出显示前5行和后5行。
import pymysql
from sqlalchemy import create_enginesql = 'select * from data'
engine = 'mysql+pymysql://root:666@127.0.0.1:3306/PyDataStudio'
conn = create_engine(engine)## 链接数据库
pdata = pd.read_sql(sql, conn)### 读取数据库信息
pd.concat([pdata.head(5), pdata.tail(5)], axis=0)
写在最后
批量爬取
注意爬取网页的网址变化规律,可用变量拼出网址字符串进行循环爬取。
例如,我们在分析北京2022年9月1日的天气时,发现url有如下的规律:
固定网址:http://www.tianqihoubao.com/lishi/
变量网址:地名拼音+时间字符串
这样就可以通过赋值变量,批量循环爬取了,该部分内容留给同学们继续深入探究。
便捷方法
其实我们做爬取的该网页,属于表格类数据的网页,而爬取该类网页有一个比较便捷的方法,就是使用 pandas 的read_html()
,大家可以尝试一下。
学习更多Python知识与技巧,关注与私信博主(888)!
热爱学习和渴望进阶的小伙伴,各种Python学习路线、笔记、面试题PDF,免费分享!
实战:爬取数据存入数据库并做可视化分析相关推荐
- 把爬取信息导出到mysql,关于爬虫学习的一些小小记录(四)——爬取数据存入数据库...
关于爬虫学习的一些小小记录(四)--爬取数据存入数据库 创建数据库 pymysql 模块 具体操作 预知后事如何 前面我们已经讲了怎么访问网页,并且从网页源码中提取数据.既然数据有了,怎样管理就是下一 ...
- python爬取新闻存入数据库_python爬取数据存入数据库
昨天本来写了一篇关于python爬取的文章,结果没通过,正好今天一起吧.用python同时实现爬取,和存入数据库,算是复习一下前面操作数据库的知识. 1.准备工作 既然是爬取,那自然要连接到爬取的页面 ...
- 爬取中国福彩网并做可视化分析
一.问题: 利用python的matplotlib和requestss两个库对中奖号码进行可视化分析.经过分析可以知道中奖号码为红色和蓝色两种,数据是以json进行存储. 二.方法: 1.首先:mat ...
- 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...
- python实现百度新闻爬取并存入数据库(二)
上节课学习了爬取搜狗新闻网站的内容,这节课讲解如何把爬取的数据存入数据库表中,使用mysql数据库. 先简单说下mysql数据库的安装 mysql的安装文件可在网盘下载,安装即可,安装过程注意设置账号 ...
- 【Python】爬取中国历史票房榜,可视化分析
[Python]爬取中国历史票房榜,可视化分析 最近电影<哪吒之魔童转世>票房已经超过<流浪地球>,<复联4>.升到中国内地票房第二位.就好有哪些电影排进了历史票房 ...
- python爬取新闻存入数据库_Python爬取数据并写入MySQL数据库的实例
按 F12 或 ctrl+u 审查元素,结果如下: 结构很清晰简单,我们就是要爬 tr 标签里面的 style 和 tr 下几个并列的 td 标签,下面是爬取的代码: #!/usr/bin/env p ...
- 【Python】Scrapy完成电影信息爬取并存入数据库
本文使用了scrapy框架对电影信息进行爬取并将这些数据存入MySQL数据库. 一.安装相关python模块 根据你所使用的python包管理器安装相应的模块.比如使用pip: pip install ...
- python3爬取数据存入mysql_Python如何爬取51cto数据并存入MySQL
实验环境 1.安装Python 3.7 2.安装requests, bs4,pymysql 模块 实验步骤1.安装环境及模块 2.编写代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
最新文章
- mysql的条件替换_MySQLwhere条件替换疑问?
- App 运营的指标具体都有哪些?(二)
- fun是什么意思 python中def_【python】 numpy中的矩阵转置(ndarray.T)为什么不加括号却可以实现方法的功能...
- spring jaxb_自定义Spring命名空间使JAXB变得更容易
- 上海云栖:金融政企行业的CDN最佳实践
- Replace Parameter with Methods(以函数取代参数)
- 如何构建一个流量无损的在线应用架构 | 专题尾篇
- 怎样用 Python 控制图片人物动起来?一文就能 Get!
- python的最大优势之一是有理数吗_Python里的有理数类(精度高,可计算)
- TF-IDF来源及理论推导 熵推导出
- telnet如何测试端口?
- 计算机处理答题卡原理,中高考答题卡扫描进电脑原来是这样的!难怪要被多扣分了(附卷面高分八法)...
- 桌面应用之electron开发
- SQL(之一)-SQL经典题目
- FF首次适应算法与BF最佳适应算法(C++实现)
- D1-阿里音乐流行趋势预测竞赛数据清洗整合——纯python
- Linux下的makefile编写 ——陈皓《跟我一起写Makefile》学习笔记(一)
- ev录屏嵌入摄像头花屏问题
- 22年知网“研究生科学素养提升”在线测试
- 中国冷饮(水冰)市场销售渠道与投资前景预测报告2021-2026年
热门文章
- 【论文阅读】MFAN: Multi-modal Feature-enhanced Attention Networks for Rumor Detection --- 多模态,谣言检测,注意力机制
- js逆向-ast混淆还原入门案例(1)
- thinkphp ajax volist,thinkphp中的volist标签在ajax中操作详解
- WampServer:Your port 8080 is actually used by : Server: Embedthis-http
- Android游戏开发实践指南(华章程序员书库)
- 梦幻西游服务器物品掉落概率,梦幻西游:牛人鉴定2万件装备,摸索出了无级别几率...
- 全球与中国汽车座椅骨架市场深度研究分析报告(2022)
- 【愚公系列】2022年11月 微信小程序-本地生活项目-商家列表
- mysql完全备份 二进制日志,MySQL二进制日志备份和恢复详解
- 【C语言学习疑难杂症】Stack arround the variable was corrupted问题