您有一份天气预报待签收
本文作者:钱梦璇
文字编辑:宁刘莹
技术总编:张 邯
爬虫俱乐部将于2020年1月5日至11日在湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~
另外,2019年11月29日-12月1日在湖北武汉举办的《2019年Python第四期培训招生》,招生工作已经结束,请大家继续关注我们后续的培训公告哦~
武汉的天气真的是说冷就冷,换衣服的速度都跟不上它变脸的速度!前几天大太阳还刺的眼睛痛,这几天小编都想裹上羽绒服冬眠了。
为了防止自己在大太阳下套秋裤,冷风中穿破洞,小编专门查询了武汉未来长期天气预报。借此机会,给大家分享一下如何利用xpath爬取武汉天气预报(网站地址为:http://pc.weathercn.com/)以及数据可视化的实现。
1.获取天气预报信息
进入中国天气官网中,搜索武汉天气预报,之后点击“长期天气”选项,会显示未来很长时间内的天气情况,如下所示:
进入开发者模式,url=” http://pc.weathercn.com/weather/long/101200101/?partner=2000001010_hfaw&areatype=smartid&p_source=search&p_type=landing”的response返回的是一个 HTML文件:
import requests
from lxml import etree
import re
url="http://pc.weathercn.com/weather/long/101200101/?partner=2000001010_hfaw&areatype=smartid&p_source=search&p_type=landing"
headers={
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.9",
"Cache-Control":"max-age=0",
"Connection":"keep-alive",
"Cookie":"UM_distinctid=16e0103e57d2d1-05ec33daa28888-3c604504-100200-16e0103e57e27f; TQ__guid=221994521.970822533698675700.1571975063115.4133; Hm_lvt_7ede4c9f7c5109519083543b0f766992=1571975066; CNZZDATA1271283645=2078186835-1571970429-%7C1571975829; _cnzz_CV1271283645=%E5%90%88%E4%BD%9C%E4%BC%99%E4%BC%B4%E6%9D%A5%E6%BA%901%7C2000001010_hfaw%7Cp; Hm_lpvt_7ede4c9f7c5109519083543b0f766992=1571976621",
"Host":"pc.weathercn.com",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
html=requests.get(url,headers=headers)
html.encoding='UTF-8'
print(html.text)
我们需要利用get方法获取数据,将html编码为UTF-8以防止乱码。利用text方法获取文本内容。
接下来,利用xpath方法获取日期和温度信息,可以在开发者模式里的Elements直接copy xpath,也可以利用谷歌浏览器中的xpath helper插件搜寻数据,具体操作见之前的推文。
tree=etree.HTML(html.text)
#print(tree)
date="//a[@class='longcsshref']/div[@class='cal-body-item']/div[@class='cal-date']/text()"
date_list=tree.xpath(date)
print(date_list)
由于每个月份的第一天的xpath路径比较特殊,所以少了三个月份第一天的日期。
通过定位30和31日,在此后利用列表的insert方法插入'11月01日','12月01日'和'1月01日'3个元素:
for i in range(len(date_list)):
if date_list[i]=='30' or date_list[i]=='31':
print(i)
date_list.insert(6,'11月01日')
date_list.insert(36,'12月01日')
date_list.insert(67,'1月01日')
date_list[0]='10月26日'
print(date_list)
返回的日期列表如下所示:
接下来,利用同样的方法获取温度数据:
weather="//a[@class='longcsshref']/div[@class='cal-body-item']/p[2]/text()"
weather_list=tree.xpath(weather)
weather_list.insert(6,'27/16℃') #直接加入每月第一天的日期数据
weather_list.insert(36,'17/5℃')
weather_list.insert(67,'8/3℃')
print(weather_list)
显然,为了画图时读入数据,我们需要把最高温度和最低温度的数字提取出来,并分别放入两个列表中。
mintemp=[]
maxtemp=[]
for each in weather_list:
numbers = re.compile('[0-9]+/\-?[0-9]+').findall(each) #正则表达式 \d表示数字 +表示两个或多个
for number in numbers:
number=number.split("/")
number_int = [int(x) for x in number] #将字符串形式转化为数字
#print(number_int)
mintemp.append(number_int[0])
maxtemp.append(number_int[1])
print(maxtemp)
print(mintemp)
如上,利用re库中的compile函数和正则表达式,得到的每个number形如['17/11']。故之后利用字符串的split方法将最高温度和最低温度分开,并用int函数将字符串形式转化为数字。最高温度和最低温度列表如下:
2.绘制折线图
折线图可以较好的反应日期数据的波动情况等信息,得到日期和温度信息后,我们开始绘制折线图(为了更好地展示,仅选取未来10天的数据)。
py_date=date_list[:10] #未来10天的日期
py_mintemp=mintemp[:10] #未来10天的最低温度
py_maxtemp=maxtemp[:10] #未来10天的最高温度
import pyecharts.options as opts
from pyecharts.charts import Line #导入Line线图
def line_base(): #定义绘制线图的函数
c = (
Line()
.add_xaxis(py_date) #py_date
.add_yaxis("最高温度",py_maxtemp)
.add_yaxis("最低温度",py_mintemp)
.set_global_opts(title_opts=opts.TitleOpts(title="武汉未来10天天气预报",subtitle="2019.10.26-2019.11.4")
,legend_opts=opts.LegendOpts(pos_top="10%"))
)
return c
line_base().render(r'E:\武汉未来十天天气预报.html') # render生成本地 HTML文件
设定坐标轴和全局项,绘制方法类似柱状图,得到的图形如下所示:
作为北方人的小编也是惊了,11月初武汉的温度还在20度徘徊,武汉降温计划再次失败~
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。