您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

Python爬虫+数据分析实战–爬取并分析中国天气网的温度信息

时间:2020-08-05 11:17:38  来源:  作者:

一、使用的工具

单独使用完成 pycharms 完成实验,在分析的时候使用 Jupyter Notebook

在爬虫所需要lxml和bs4这两个库已经确认安装后,确保自己的已经安装了pandas和matplotlib这两个库

1.安装方式:

# 推荐使用清华镜像下载速度较快
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

2.简介

Pandas可以对数据进行导入、清洗、处理、统计和输出Matplotlib能够生成各种格式的图形(诸如折线图,散点图,直方图等等),界面可交互

二、基本思路

1.目的

爬取中国天气网的温度数据画出温度最高前10名的数据展示图画出温度最低前10名的数据展示图

2.步骤

2.1 爬取数据

分析网址

满足http://www.weather.com.cn/textFC/{}.shtml的格式

定位于东北的网址:http://www.weather.com.cn/textFC/db.shtml
定位于华北的网址:http://www.weather.com.cn/textFC/hb.shtml
定位于华中的网址:http://www.weather.com.cn/textFC/hz.shtml


zone = ['db', 'hb', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat'] for z in zone: url = "http://www.weather.com.cn/textFC/{}.shtml".format(z)

爬取数据

使用bs4库来爬取中国天气网的最高气温,存储到一个列表HIGH_DATA中

具体分析可以看小编之前的数据分析的三种方法,在文章后面附加链接

HIGH_DATA = []
response = requests.get(url, headers=headers)
text = response.content.decode("utf-8")
soup = BeautifulSoup(text,'html5lib')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
    trs = table.find_all('tr')[2:]
    for index,tr in enumerate(trs):   # ebumerate能够取出对应的下标和值
        tds = tr.find_all('td')
        if index == 0:
            city_td = tds[1]
        else:
            city_td = tds[0]
            city = list(city_td.stripped_strings)[0]
            temp_td = tds[-5]
            max_temp = list(temp_td.stripped_strings)[0]
            HIGH_DATA.Append({"city": city, 'high_temp': int(max_temp)})

使用lxml库来爬取中国天气网的最低气温数据,存储到一个列表LOW_DATA中

response = requests.get(url, headers=headers)
text = response.text.encode('ISO-8859-1')
trees = etree.HTML(text)
citys = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="83"][@height="23"]/a/text()')
lows = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="86"]/text()')
while True:
	if '最低气温' not in lows:
		break
	else:
		lows.remove('最低气温')
for i in zip(citys, lows):
	city, low = i
	LOW_DATA.append({"city": city, "low_temp": int(low)})

2.2 数据清洗

使用pandas的DataFrame对象来获取前十名的数据

# 将取出的数据转为DataFrame对象,相当于一个表格
i = pd.DataFrame(LOW_DATA)
j = pd.DataFrame(HIGH_DATA)
# 经过排序来取出前十名的数据,分别放在ten_low和ten_high中
ten_low = i.sort_values(by="low_temp", ascending=True)[0:10]
ten_high = j.sort_values(by="high_temp", ascending=True)[-10:]

2.3 绘制图形

使用Matplotlib来绘制图案,需要解决的问题为文本显示问题还有符号显示问题

具体的方法在代码都已经说明

# 分区域绘图subplot(行,列,第()个)
plt.subplot(2, 1, 1)
# 逆序排序取前面十个然后放在ten_low中
ten_low = i.sort_values(by="low_temp", ascending=True)[0:10]
# 设置x和y轴的字体为黑体(SimHei)/解决轴不能显示字体的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决不能显示负号的问题
plt.rcParams['axes.unicode_minus'] = False
# 取出ten_low中的城市和气温
x1 = list(ten_low['city'])
y1 = list(ten_low['low_temp'])
# 画出bar图
plt.bar(x1, y1)
# 定义x和y轴的名称
plt.xlabel('城市', fontproperties='SimHei')
plt.ylabel("温度", fontproperties='SimHei')
# 定义图表的名称
plt.title("中国各个城市的今日温度最低前十名", fontproperties='SimHei')
# 显示bar图上的数值
for x, y in zip(x1, y1):
	plt.text(x, y, '%s' % y, ha='center', va='bottom')

# 画出第二个子图
plt.subplot(2, 1, 2)
# 取出最低气温的后面十个数值
ten_high = j.sort_values(by="high_temp", ascending=True)[-10:]
x2 = list(ten_high['city'])
y2 = list(ten_high['high_temp'])
# plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.rcParams['axes.unicode_minus'] = False
plt.bar(x2, y2)
plt.xlabel('城市', fontproperties='SimHei')
plt.ylabel("温度", fontproperties='SimHei')
plt.title("中国各个城市的今日温度最高前十名", fontproperties='SimHei')
for x, y in zip(x2, y2):
	plt.text(x, y, '%s' % y, ha='center', va='bottom')
# 调整每隔子图之间的距离(默认)
plt.tight_layout()
plt.show()

2.3 实验结果

Python爬虫+数据分析实战–爬取并分析中国天气网的温度信息

 

注:5月25日的数据(以实战当天为准)

三、源代码

用函数进行封装

import requests
import pandas as pd
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from lxml import etree
import matplotlib.pyplot as plt
'''
爬取中国天气网的温度数据并汇总
画出温度最高前10名的数据展示图
画出温度最低前10名的数据展示图
'''
headers = {
    "user-agent": UserAgent().random
}
HIGH_DATA = []
LOW_DATA = []

# 使用bs4库的BeautifSoup对象来获取最高温度的数据,使用HIGH_DATA来存放数据
def get_high_temperature(url):
    response = requests.get(url, headers=headers)
    text = response.content.decode("utf-8")
    soup = BeautifulSoup(text,'html5lib')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]
        for index,tr in enumerate(trs):   # ebumerate能够取出对应的下标和值
            tds = tr.find_all('td')
            if index == 0:
                city_td = tds[1]
            else:
                city_td = tds[0]
            city = list(city_td.stripped_strings)[0]
            temp_td = tds[-5]
            max_temp = list(temp_td.stripped_strings)[0]
            HIGH_DATA.append({"city": city, 'high_temp': int(max_temp)})

# 使用lxml库的xpath方法来获取最低温度的数据,使用LOW_DATA来存储数据
def get_low_temperature(url):
    response = requests.get(url, headers=headers)
    text = response.text.encode('ISO-8859-1')
    trees = etree.HTML(text)
    citys = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="83"][@height="23"]/a/text()')
    lows = trees.xpath('//div[@class="hanml"]/div[1]//td[@width="86"]/text()')
    while True:
        if '最低气温' not in lows:
            break
        else:
            lows.remove('最低气温')
    for i in zip(citys, lows):
        city, low = i
        LOW_DATA.append({"city": city, "low_temp": int(low)})

# 使用pandas来格式化数据,使用matplotlib.pyplot 画图
def draw_picture(LOW,HIGH):
    i = pd.DataFrame(LOW)
    j = pd.DataFrame(HIGH)
    # 分区域绘图subplot(行,列,第()个)
    plt.subplot(2, 1, 1)
    # 逆序排序取前面十个然后放在ten_low中
    ten_low = i.sort_values(by="low_temp", ascending=True)[0:10]
    # 设置x和y轴的字体为黑体(SimHei)/解决轴不能显示字体的问题
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 解决不能显示负号的问题
    plt.rcParams['axes.unicode_minus'] = False
    # 取出ten_low中的城市和气温
    x1 = list(ten_low['city'])
    y1 = list(ten_low['low_temp'])
    # 画出bar图
    plt.bar(x1, y1)
    # 定义x和y轴的名称
    plt.xlabel('城市', fontproperties='SimHei')
    plt.ylabel("温度", fontproperties='SimHei')
    # 定义图表的名称
    plt.title("中国各个城市的今日温度最低前十名", fontproperties='SimHei')
    # 显示bar图上的数值
    for x, y in zip(x1, y1):
        plt.text(x, y, '%s' % y, ha='center', va='bottom')

    # 画出第二个子图
    plt.subplot(2, 1, 2)
    # 取出最低气温的后面十个数值
    ten_high = j.sort_values(by="high_temp", ascending=True)[-10:]
    x2 = list(ten_high['city'])
    y2 = list(ten_high['high_temp'])
    # plt.rcParams['font.sans-serif'] = ['SimHei']
    # plt.rcParams['axes.unicode_minus'] = False
    plt.bar(x2, y2)
    plt.xlabel('城市', fontproperties='SimHei')
    plt.ylabel("温度", fontproperties='SimHei')
    plt.title("中国各个城市的今日温度最高前十名", fontproperties='SimHei')
    for x, y in zip(x2, y2):
        plt.text(x, y, '%s' % y, ha='center', va='bottom')
    # 调整每隔子图之间的距离(默认)
    plt.tight_layout()
    plt.show()


def main():
    zone = ['db', 'hb', 'hd', 'hz', 'hn', 'xb', 'xn', 'gat']
    for z in zone:
        url = "http://www.weather.com.cn/textFC/{}.shtml".format(z)
        get_high_temperature(url)
        get_low_temperature(url)
    draw_picture(LOW_DATA,HIGH_DATA)


if __name__ == '__main__':
    main()

写在最后

在实战出现l什么问题可以随时留言告诉小编,另外附加一个bug,在每天晚上中国天气网当天的最高气温可能会发生变化,数据会被清除变成‘-’,导致实验失败,注意自己的实战时间

Python爬虫+数据分析实战–爬取并分析中国天气网的温度信息

 

我发现湖南长沙这边才是最热的 一个南方城市 居然能达到39 40 ° 太可怕了呀 对了 源码获取记得加后台私信小编 源码 获取



Tags:Python爬虫   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
利用Python实现中国地铁数据可视化。废话不多说。让我们愉快地开始吧~开发工具Python版本:3.6.4相关模块:requests模块;wordcloud模块;pandas模块;numpy模块;jieba模块;pyecharts模...【详细内容】
2021-12-08  Tags: Python爬虫  点击:(34)  评论:(0)  加入收藏
这个开源项目程序可以持续爬取一个或多个新浪微博用户(如李文di、无疫烦)的数据,并将结果信息写入文件或数据库。写入信息几乎包括用户微博的所有数据,包括用户信息和微博信息两大类。...【详细内容】
2021-10-27  Tags: Python爬虫  点击:(43)  评论:(0)  加入收藏
回顾python学习历程,感慨良多,这门语言实在是太强了,当然,分支也很多,有的在做安全,有的在做数据,有的在做爬虫,本文就笔者本身的爬虫入门的小经验分享给读者,期待各位在学习python的...【详细内容】
2021-08-11  Tags: Python爬虫  点击:(81)  评论:(0)  加入收藏
来源:Python数据之道作者:Peter整理:阳哥大家好,我是阳哥。今天来跟大家分享用 BeautifulSoup 获取信息的一些知识点,文章内容由公众号读者 Peter 创作。欢迎各位童鞋向公众号投...【详细内容】
2021-06-23  Tags: Python爬虫  点击:(134)  评论:(0)  加入收藏
前言国内大学最新排名,北大反超,浙大仅第四,中科大跌至第八时隔五年,“双一流”大学即将迎来首次大考,这也是继改变高校评断标准之后,第一次即将以官方对外发布,自然是引来了许多人...【详细内容】
2021-04-08  Tags: Python爬虫  点击:(351)  评论:(0)  加入收藏
实施步骤(1) 数据爬取:使用requests请求为基础获取数据源。(2) UA伪装:模拟浏览器访问网址。(3) 数据解析:使用xpath语法处理数据。(4) 数据存储:获取需求数据后使用Excrl进行存...【详细内容】
2021-03-16  Tags: Python爬虫  点击:(245)  评论:(0)  加入收藏
在使用Python本爬虫采集数据时,一个很重要的操作就是如何从请求到的网页中提取数据,而正确定位想要的数据又是第一步操作。...【详细内容】
2021-03-04  Tags: Python爬虫  点击:(228)  评论:(0)  加入收藏
专注Python、AI、大数据,请关注公众号七步编程!在不同公司的许多人可能出于各种原因需要从Internet收集外部数据:分析竞争,汇总新闻摘要、跟踪特定市场的趋势,或者收集每日股票价...【详细内容】
2020-12-10  Tags: Python爬虫  点击:(90)  评论:(0)  加入收藏
我们在写爬虫代码时,常常需要各种分析调试,而且每次直接用代码调试都很麻烦所以今天给大家分享一个工具,不仅能方便模拟发送各种http请求,还能轻松调试,最重要的是,可以将调试最终...【详细内容】
2020-12-07  Tags: Python爬虫  点击:(197)  评论:(0)  加入收藏
本篇文章介绍了爬虫中验证码的处理方式, 并把这些功能封装起来,供我们使用, 涉及到百度AIP的调用方式, 以及一个最新的开源库muggle识别库的使用,欢迎阅读,点赞,收藏! 目录: 学会调用...【详细内容】
2020-10-29  Tags: Python爬虫  点击:(102)  评论:(0)  加入收藏
▌简易百科推荐
Python 是一个很棒的语言。它是世界上发展最快的编程语言之一。它一次又一次地证明了在开发人员职位中和跨行业的数据科学职位中的实用性。整个 Python 及其库的生态系统使...【详细内容】
2021-12-27  IT资料库    Tags:Python 库   点击:(1)  评论:(0)  加入收藏
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  子冉爱python    Tags:Python   点击:(4)  评论:(0)  加入收藏
有不少同学学完Python后仍然很难将其灵活运用。我整理15个Python入门的小程序。在实践中应用Python会有事半功倍的效果。01 实现二元二次函数实现数学里的二元二次函数:f(x,...【详细内容】
2021-12-22  程序汪小成    Tags:Python入门   点击:(32)  评论:(0)  加入收藏
Verilog是由一个个module组成的,下面是其中一个module在网表中的样子,我只需要提取module名字、实例化关系。module rst_filter ( ...); 端口声明... wire定义......【详细内容】
2021-12-22  编程啊青    Tags:Verilog   点击:(7)  评论:(0)  加入收藏
运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI ...【详细内容】
2021-12-22  修道猿    Tags:Python   点击:(5)  评论:(0)  加入收藏
面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计。类(Class)和对象(Object)类是用来描述具有相同属性和方法对象的集合。对象是类的具体实例。比如,学生都有...【详细内容】
2021-12-22  我头秃了    Tags:python   点击:(9)  评论:(0)  加入收藏
所谓内置函数,就是Python提供的, 可以直接拿来直接用的函数,比如大家熟悉的print,range、input等,也有不是很熟,但是很重要的,如enumerate、zip、join等,Python内置的这些函数非常...【详细内容】
2021-12-21  程序员小新ds    Tags:python初   点击:(5)  评论:(0)  加入收藏
Hi,大家好。我们在接口自动化测试项目中,有时候需要一些加密。今天给大伙介绍Python实现各种 加密 ,接口加解密再也不愁。目录一、项目加解密需求分析六、Python加密库PyCrypto...【详细内容】
2021-12-21  Python可乐    Tags:Python   点击:(7)  评论:(0)  加入收藏
借助pyautogui库,我们可以轻松地控制鼠标、键盘以及进行图像识别,实现自动抢课的功能1.准备工作我们在仓库里提供了2个必须的文件,包括: auto_get_lesson_pic_recognize.py:脚本...【详细内容】
2021-12-17  程序员道道    Tags:python   点击:(13)  评论:(0)  加入收藏
前言越来越多开发者表示,自从用了Python/Pandas,Excel都没有打开过了,用Python来处理与可视化表格就是四个字——非常快速!下面我来举几个明显的例子1.删除重复行和空...【详细内容】
2021-12-16  查理不是猹    Tags:Python   点击:(20)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条