首席数据官

Hi, 请登录

爬虫实例八:爬取天气预报数据,并实现数据可视化

一、前言

在爬取数据时,有些数据,如图片、视频等等,爬到就是赚到;而有时候,我们爬到的可能只是一些数字,表面上,看上去没什么意义,但当我们换一种角度来看待问题的话,可能又是一个崭新的世界。于是,我今天学习了一下数据的可视化。

二、爬取目标及结果展示

由于是我第一次尝试可视化,我选了一个简单的方向----爬取天气预报

然后我就在百度上温度数据分析,随便搜了一下,直接准备爬取第一个。

网址链接:

结果如下:

三、页面分析

进入页面之后,我分别看了“7天”、“8-15天”、“40天”,发现,上方链接是一直变化的。但是当我去检测页面的时候,发现了了不得的东西。

哎哟温度数据分析,我去,这不就是上方的链接变化嘛。

于是我们就可以通过手段直接拿到“详情页的传送链接”了。

假设这时候,我们已经拿到了“7天”和“8-15天”的链接了。对比一下,两个页面的内容。

7天:

8-15天:

哎哟,我去,两个页面的排版居然不一样,那网页源代码也肯定不一样咯。

仔细看之后,发现还好,只有两个地方,稍微需要处理一下。

①:“7天”里的风向

(你可以说东风转东南风,但你不能说是东南风转东南风吧)

②:“7天”和“8-15天”的气温你会发现它是这个样子:

甚至这个样子:

但是不用害怕,我已经解决啦,哈哈哈哈哈。

详情见代码部分,基本上每行都有注释

四、完整代码

# -*- coding: UTF-8 -*-
"""
@Author  :远方的星
@Time   : 2021/2/28 10:20
@CSDN    :https://blog.csdn.net/qq_44921056
@腾讯云   : https://cloud.tencent.com/developer/column/91164
"""
import requests
from lxml import etree
from fake_useragent import UserAgent
import pandas as pd
from matplotlib import pyplot as plt
# 随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')
# 获取七天和八到十五天的页面链接
def get_url(url):
    response = requests.get(url=url).text
    html = etree.HTML(response)
    url_7 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[2]/a/@href')[0]
    url_8 = 'http://www.weather.com.cn/' + html.xpath('//*[@id="someDayNav"]/li[3]/a/@href')[0]
    return url_7, url_8
# 获取未来七天天起预报数据
def get_data_1(url):
    response = requests.get(url=url)
    response.encoding = "utf-8"  # 防止乱码,进行编码
    response = response.text
    html = etree.HTML(response)
    list_s = html.xpath('//*[@id="7d"]/ul/li')
    # 提前定义五个空列表用于存放信息
    data, weather, x, y, wind_scale = [], [], [], [], []
    temperature = []  # 定义一个空列表,用于处理最低气温和最高气温的合并
    wind = []  # 定义一个空列表,用于存放风向
    high, low = [], []  # 定义两个空列表,用于存放未处理的最高、最低气温,为绘图做铺垫
    for i in range(len(list_s)):
        a = list_s[i].xpath('./h1/text()')  # 获取日期
        b = list_s[i].xpath('./p[1]/text()')  # 获取天气情况
        c = list_s[i].xpath('./p[2]/span/text()')  # 获取最高气温
        d = list_s[i].xpath('./p[2]/i/text()')  # 获取最低气温
        g = list_s[i].xpath('./p[3]/i/text()')  # 获取风级
        data.append(''.join(a))  # 集中日期
        weather.append(''.join(b))  # 集中天气情况
        high.append(''.join(c))  # 集中最高气温
        low.append(''.join(d))  # 集中最低气温
        x.append(''.join(c))  # 集中最高气温
        x.append('/')  # 加入一个分隔符
        x.append(''.join(d))  # 集中最低气温
        temperature.append(''.join(x[0:3]))  # 把最高气温和最低气温合并
        wind_scale.append(''.join(g))  # 集中风级
        f = list_s[i].xpath('./p[3]/em/span/@title')  # 获取风向
        if f[0] == f[1]:  # 条件语句,用于判断两个风向是否一致,进而做出一定反应
            wind.append(''.join(f[0]))
        else:
            y.append(''.join(f[0]))
            y.append('转')
            y.append(''.join(f[1]))
            wind.append(''.join(y[0:3]))
    excel = pd.DataFrame()  # 定义一个二维表
    excel['日期'] = data
    excel['天气'] = weather
    excel['气温'] = temperature
    excel['风向'] = wind
    excel['风级'] = wind_scale
    excel['最高气温'] = high
    excel['最低气温'] = low
    return excel
# 获取8-15天天气预报数据
def get_data_2(url):
    response = requests.get(url=url)
    response.encoding = "utf-8"  # 防止乱码,进行编码
    response = response.text
    html = etree.HTML(response)
    list_s = html.xpath('//*[@id="15d"]/ul/li')
    # 提前定义五个空列表用于存放信息
    data, weather, a, wind, wind_scale = [], [], [], [], []
    temperature = []  # 定义一个空列表,用于处理最低气温和最高气温的合并
    high, low = [], []  # 定义两个空列表,用于存放未处理的最高、最低气温,为绘图做铺垫
    for i in range(len(list_s)):
        data_s = list_s[i].xpath('./span/text()')  # data_s[0]是日期,data_s[1]是天气,data_s[2]是最低气温,data_s[3]是风向,data_s[4]是风级
        b = list_s[i].xpath('./span/em/text()')  # 获得最高气温
        data.append(''.join(data_s[0]))  # 集中日期
        weather.append(''.join(data_s[1]))  # 集中天气
        wind.append(''.join(data_s[3]))  # 集中风向
        wind_scale.append(''.join(data_s[4]))  # 集中风级
        high.append(''.join(b))  # 集中最高气温
        low.append(''.join(data_s[2]))  # 集中最低气温
        a.append(''.join(b))  # 集中最高气温
        a.append(''.join(data_s[2]))  # 集中最低气温(这时最高气温已经在a列表里了)
        temperature.append(''.join(a[0:2]))  # 集中最低+最高气温
    excel = pd.DataFrame()  # 定义一个二维表
    excel['日期'] = data
    excel['天气'] = weather
    excel['气温'] = temperature
    excel['风向'] = wind
    excel['风级'] = wind_scale
    excel['最高气温'] = high
    excel['最低气温'] = low
    return excel
# 实现数据可视化
def get_image(data, high, low):
    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    # 根据数据绘制图形
    fig = plt.figure(dpi=128, figsize=(10, 6))
    plt.plot(data, high, c='red', alpha=0.5)
    plt.plot(data, low, c='blue', alp
试看结束,如继续查看请付费↓↓↓↓
打赏0.5元才能查看本内容,立即打赏

来源【首席数据官】,更多内容/合作请关注「辉声辉语」公众号,送10G营销资料!

版权声明:本文内容来源互联网整理,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 jkhui22@126.com举报,一经查实,本站将立刻删除。

相关推荐

二维码
评论