获取广州历史天气状况
唠叨一下……
我发现,最近一段时间没有更新文章,也没有出视频了。
**“坚持”**这个词对任何人来说都很重要但却很难做到,就像“学习”一样。
犹记得高三时,每天奋笔疾书,充满热情,那是对青春最好的诠释。也是为了不负青春,朝着梦想努力拼搏。
但对于很多身在职场,或是大学校园的朋友来说,工作、学业的繁忙可能让你无暇顾及其他。
也许大家觉得,文章有空就写,没空可以不写。
可我认为,写文章不仅是给自己看的,也是给别人看的,除了用心创作,坚持更新最重要!
我相信每一位做技术的人,都是通过写文章来加深自己对知识的理解,巩固知识点;记录学习过程,也分享自己的学习方法和经验。
上下班乘坐地铁时,深夜躺床上时,总会拿出手机刷一下大佬们的博客,许多作者在他们的领域都是非常出色的人才。
每天通过阅读这些优秀的文章,不断为自己充电。文章大多是纯技术的输出,适合学习。
在融合各方优点后,我比较喜欢呈现技术与生活结合的文章风格,阅读起来更有乐趣。
毕竟阅读不能像记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
从图中你会发现,有价值的信息保存在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)
最后得到的结果:如下图所示:
致谢
好了,到这里又要跟大家说再见的时候了。希望我的文章能带给您知识,带给您欢笑!同时也谢谢您能抽出宝贵的时间阅读,创作不易,如果您喜欢的话,点个关注再走吧。您的支持是我创作的动力,希望今后能带给大家更多优质的文章