查看原文
其他

爬虫实战 | 爬取中国天气网

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张孟晗,中南财经政法大学统计与数学学院

本文编辑:赵一帆

技术总编:王子一

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~



俗话说“天有不测风云”,但随着现代科技的发展,让我们感觉到“天有可测风云”,如今天气预报能够准确预测未来一段时间的天气状况,为我们的生活出行带来了巨大的便利。那么今天就带大家爬取中国天气网的天气数据,存储到excel中,并演示一些简单的数据可视化。
1、获取各地区天气网址
首先,我们进入中国天气网(http://www.weather.com.cn/textFC/hb.shtml),可以看到其将全国划分为了华北,东北,华东,华中,华南,西北,西南和港澳台一共八个地区。所以,我们先获取这八个地区的网址,按F12调出开发人员工具,使用检查工具依次定位到华北,华东等地区,发现这8个地区网址存在a标签的href属性中,我们对这部分内容进行提取。
import requestsfrom lxml import etree
url = "http://www.weather.com.cn/textFC/hb.shtml"#UA伪装以及防止referere检测headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.78", "Referer": "http://www.weather.com.cn/forecast/"}
all_url = requests.get(url=url,headers=headers).content.decode("utf-8") #获取页面源代码tree = etree.HTML(all_url) #实例化一个etree对象all_url = tree.xpath("//div[@class='contentboxTab2']//li/span/a/@href") #定位到href属性值提取网址all_url = ["http://www.weather.com.cn"+i for i in all_url]  #补全网址
我们爬取到的网址结果显示如下:


2、解析数据

2.1数据定位


使用检查工具可知,一个地区下各城市的天气情况分别存在table标签中,table标签下各子标签中包含具体的天气情况,所以我们定位到table标签,对各个城市天气情况进行解析。

url = "http://www.weather.com.cn/textFC/hb.shtml"data = requests.get(url=url,headers=headers).content.decode("utf-8")tree = etree.HTML(data)all_data = tree.xpath("//div[@class='hanml']/div[@class='conMidtab'][1]//table") #定位到table标签,所有tag标签被存放在列表中

2.2对拿到的table标签进行解析


我们要获取城市的最高气温,最低气温。通过对拿到的table标签进行分析可知,table下前两个tr标签放的是两个列标题,我们不需要,从第三个tr标签开始存放的是具体的城市及其天气情况的数据,而在tr标签下,第一个td标签下放有城市名,第二个td标签下放有天气情况,第四个和第七个td标签下放的是最高气温和最低气温。(每个省第一个城市内第一个td标签放的是省名,所以需单独处理,具体做法是将上述td标签的位置都向后推一个)。
list = []
for i in all_data: detail_data = i.xpath(".//tr")[2:] for index,j in enumerate(detail_data): if index == 0: #第一个城市单独处理 dic = {} #所有属性先存入一个字典中,再统一存入一个列表中 city = j.xpath(".//td[2]/a/text()")[0] dic["city"] = city hitemp = int(j.xpath(".//td[5]//text()")[0]) dic["hitemp"] = hitemp lotemp = int(j.xpath(".//td[8]//text()")[0]) dic["lotemp"] = lotemp list.append(dic) else: #其他城市正常处理 dic = {} city = j.xpath(".//td[1]/a/text()")[0] dic["city"] = city hitemp = int(j.xpath(".//td[4]//text()")[0]) dic["hitemp"] = hitemp lotemp = int(j.xpath(".//td[7]//text()")[0]) dic["lotemp"] = lotemp            list.append(dic)
解析结果展示如下:


3、持久化存储
我们希望将爬取到的数据存储到execl中,这里便可以借助pandas模块,将我们爬到的数据变成DataFrame格式,再利用to_excel方法写入到excel中。
import pandas as pd
df = pd.DataFrame(list)df.to_excel("./tianqi.xlsx",index=None)
存储效果如下所示:


4、数据可视化
例如我们希望展示最低气温排名前十一的城市并将其展示出来,首先我们需要将这些城市按照最低气温进行升序排序,然后获得排名前十一的城市及其最低温度,借助matplotlib做出条形图将其展示出来。
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["STsong"] #设置图像上可以显示中文df = df.sort_values(by="lotemp",ascending=True)[:11] #按照最低气温排序,并按照升序排序,取排名前11个城市city_name = df["city"]lotemp = df["lotemp"]
plt.figure(figsize=(20,8),dpi=80) #设置图像相关参数plt.bar(city_name, lotemp)plt.show()
绘图效果展示如下:


最后,附上完整的爬取代码:
import pandas as pdimport requestsfrom lxml import etreeimport re
url = "http://www.weather.com.cn/textFC/hb.shtml"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.78", "Referer": "http://www.weather.com.cn/forecast/"}
all_url = requests.get(url=url,headers=headers).content.decode("utf-8") #获取页面源代码tree = etree.HTML(all_url) #实例化一个etree对象all_url = tree.xpath("//div[@class='contentboxTab2']//li/span/a/@href") #定位到href属性值提取网址all_url = ["http://www.weather.com.cn"+i for i in all_url] #补全网址for url in all_url[:7]: data = requests.get(url=url, headers=headers).content.decode("utf-8") tree = etree.HTML(data) all_data = tree.xpath("//div[@class='hanml']/div[@class='conMidtab'][1]//table") # 定位到table标签,所有tag标签被存放在列表中 list = [] for i in all_data: detail_data = i.xpath(".//tr")[2:] for index, j in enumerate(detail_data): if index == 0: # 第一个城市单独处理 dic = {} # 所有属性先存入一个字典中,再统一存入一个列表中 city = j.xpath(".//td[2]/a/text()")[0] dic["city"] = city hitemp = int(j.xpath(".//td[5]//text()")[0]) dic["hitemp"] = hitemp lotemp = int(j.xpath(".//td[8]//text()")[0]) dic["lotemp"] = lotemp list.append(dic) else: # 其他城市正常处理 dic = {} city = j.xpath(".//td[1]/a/text()")[0] dic["city"] = city hitemp = int(j.xpath(".//td[4]//text()")[0]) dic["hitemp"] = hitemp lotemp = int(j.xpath(".//td[7]//text()")[0]) dic["lotemp"] = lotemp list.append(dic) name = re.findall("textFC/(.*).shtml",url) df = pd.DataFrame(list)            df.to_excel(f"./{name}.xlsx", index=None)

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



腾讯课堂课程二维码








            


 对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐

        爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

         Seminar|媒体关联董事对融资和外部治理的影响        神奇的组内交叉合并          PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

在Stata中轻松运用program编写命令

Meta Analysis in Stata17      

芒果TV视频弹幕爬取之《我在他乡挺好的》

Stata中的判断神器——confirm命令

cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

随机森林-Random Forest 

复原之神--preserve&restore

合并,“纵”享新丝滑:frameappend & xframeappend
什么是全局配置项?|从零开始的Pyecharts(二)帮你拿下数据可视化|从零开始的Pyecharts 

Stata助力疫情打卡管理——是谁没有接龙呢?

这十年,《金融研究》的编委和读者偏爱哪些研究话题和文章?

【案例展示】Python与数据库交互

学好这一手,英语词典常在手 

玩转Stata中的数学函数

用spmap看中国空气质量

戳穿围城面具:安利&劝退一个专业

走进图文并茂的攻略世界 

玩转word文档“大变身”——wordconvert

数据读入|一文读懂用Stata读入不同类型的数据

关于我们 


   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存