获取广州历史天气情况

获取广州历史天气状况

唠叨一下……

我发现,最近一段时间没有更新文章,也没有出视频了。

**“坚持”**这个词对任何人来说都很重要但却很难做到,就像“学习”一样。

犹记得高三时,每天奋笔疾书,充满热情,那是对青春最好的诠释。也是为了不负青春,朝着梦想努力拼搏。

但对于很多身在职场,或是大学校园的朋友来说,工作、学业的繁忙可能让你无暇顾及其他。

也许大家觉得,文章有空就写,没空可以不写。

可我认为,写文章不仅是给自己看的,也是给别人看的,除了用心创作,坚持更新最重要!

我相信每一位做技术的人,都是通过写文章来加深自己对知识的理解,巩固知识点;记录学习过程,也分享自己的学习方法和经验。

上下班乘坐地铁时,深夜躺床上时,总会拿出手机刷一下大佬们的博客,许多作者在他们的领域都是非常出色的人才。

每天通过阅读这些优秀的文章,不断为自己充电。文章大多是纯技术的输出,适合学习。

在融合各方优点后,我比较喜欢呈现技术与生活结合的文章风格,阅读起来更有乐趣。

毕竟阅读不能像记linux命令一样枯燥无味吧……

作为在互联网公司求生的程序员,工作占据了大量的时间,文章持续更新需要努力,也需要动力,各位朋友如果觉得我写得还可以,就留个言鼓励一下吧!

第一步:导入使用的包

import pandas # 用于操作csv文件
import request # 获取请求对象
from bs4 import BeautifulSoup # 解析HTML
import random
import time

第二步:获得请求头

我在网上找了一大堆的请求头,将请求头放入列表中,然后将请求头信息在请求网页的时候,随机抽取一个模拟浏览器的行为。

user_agent = [
    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
    "UCWEB7.0.2.37/28/999",
    "NOKIA5700/ UCWEB7.0.2.37/28/999",
    "Openwave/ UCWEB7.0.2.37/28/999",
    "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
    # iPhone 6:
    "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25"
]

headers = {'User-Agent':random.choice(user-agent)}

第三步:分析网页

本次获取历史天气的网站的URL地址是:http://www.tianqihoubao.com/lishi/guangzhou/month/201901.html

JKDWrR.png

从图中你会发现,有价值的信息保存在tbody标签下的tr标签内,网页结构非常的清晰。从这里我们就可以使用BeautifulSoup库进行解析这个HTML代码。

第四步:创建获取data数据的方法

def get_data(url):
    html = requests.get(url, headers=headers).text
    soup = BeautifulSoup(html, 'html.parser')
    tr_list = soup.find_all('tr')
    dates, conditions, temperatures, wind_power = [], [], [], []
    for data in tr_list[1:]:
        sub_data = data.text.split()
        dates.append(sub_data[0])
        conditions.append(''.join(sub_data[1:3]))
        temperatures.append(''.join(sub_data[3:6]))
        wind_power.append(''.join(sub_data[6:]))

    _data = pd.DataFrame()
    _data['日期'] = dates
    _data['天气状况'] = conditions
    _data['温度'] = temperatures
    _data['风力'] = wind_power
    return _data

在这里,我对上面的代码进行说明:首先获取HTML请求对象来获取HTML代码,然后获取BeautifulSoup对象,方便解析HTML代码,接下来通过soup对象的find_all()方法来寻找该页面所有的tr标签。在tr标签中有几个是我们需要的数据,第一个是日期,第二个是天气状况,第三个是气温,第四个是风力方向。我将这四个数据都用列表保存起来。数据有很多每一个页面就是一个月的天气状况,但是要注意的是真正的数据在第二个tr标签内,所以循环的时候从1作为起始位置。

接下来就是要创建DataFrame对象了。DataFrame是矩阵的数据表,它包含已经排序的列集合,每一列可以是不同的值类型。然后将日期、天气状况、气温和风力方向都保存至DataFrame对象中。

第五步:保存数据至csv文件

def save_data(data):
    history_data = pd.concat([data])
    history_data.reset_index(drop=True)
    history_data.to_csv('guangzhou_history_weather.csv', mode='a', index=False, encoding='ANSI')

pd.concat()方法是将DataFrame对象连接在一起,reset_index()方法是为了避免index的错误,我之后会写到相关内容。

上述五个步骤所讲述的都是单页爬取网页的内容,接下来要做的是多页爬取。例如:一年有12个月,那么我们可以爬取12个月内的信息。当超出12个月则会报错。

具体代码如下:

def main():
    nums = int(input('请输入你要爬取的月数'))
    if nums > 12:
        print('最多只能爬取12个月的天气')
    else:
        for num in range(1, nums+1):
            time.sleep(5)
            print('正在下载第{}个月的天气'.format(num))
            url = 'http://www.tianqihoubao.com/lishi/guangzhou/month/20190{}.html'.format(num)
            data = get_data(url)
            save_data(data)

最后得到的结果:如下图所示:

JKDRM9.png

致谢

好了,到这里又要跟大家说再见的时候了。希望我的文章能带给您知识,带给您欢笑!同时也谢谢您能抽出宝贵的时间阅读,创作不易,如果您喜欢的话,点个关注再走吧。您的支持是我创作的动力,希望今后能带给大家更多优质的文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值