目录
中国天气网爬虫数据可视化
感谢阅读最爱小鱼果的博客。
本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!
爬虫功能
大家好,我来讲讲怎么用python对中国天气网进行爬取并且对爬取到的数据进行数据可视化的显示:
- 爬取全国各个城市的气温(最高气温,最低气温);
- 获取全国城市中气温最低和最高的前十名城市(地区)进行可视化操作(以直方图的形式给出展示形式为 .html格式)
网页分析
首先打开中国天气网,找到全国各个区域(华北、东北、华东、华中、华南、西北、西南、港澳台)天气信息。
以华北地区为例分析网页源代码
1.以谷歌浏览器为例分析
打开谷歌浏览器,打开华北地区天气预报,鼠标右键点击 检查,找到Elements
如图所示:
2. 提取特征标签
找到我们所需要的信息所在的网页源代码特征标签
获取所有<tably>标签。
分析可知所有城市天气信息在<tably>标签下的<tr>标签
获取所有<tr>标签。
在对应的<tr>标签中找到城市所在代码区域:
3.分析源代码
分析网页源代码可知,前两个<tr>标签为表头信息,第一个<td>标签为省会(直辖市),为冗余信息。
利用requests库获取目标网页源代码
若没有安装则运行cmd命令,输入pip install requests
# utf-8
import requests
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
# 'Referer': 'http://www.weather.com.cn/textFC/hb.shtml'
} # 模拟浏览器
response = requests.get(url=url, headers=header) # 发送get命令
text = response.content.decode('utf-8') # 解码方式为utf-8
利用BeautifulSoup库提取天气信息
上面我们分析了目标网页源代码,知道了我们所需要的信息所在的区域,利用BeautifulSoup库获取。
若没有安装则运行cmd命令,输入pip install bs4进行安装
# utf-8
from bs4 import BeautifulSoup
ALL_DATA = []
# text用requests库获取
soup = BeautifulSoup(text,'lxml') # 以lxml方式解析
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for tr in trs:
tds = tr.find_all('td')
chengs = list(tds[-8].stripped_strings)[0] # 倒数第8个为城市信息
maxtemp = list(tds[-5].stripped_strings)[0] # 倒数第5个位最高气温
mintemp = list(tds[-2].stripped_strings)[0] # 倒数第2个为最低气温
ALL_DATA.append({"城市":chengs,"最高气温":int(maxtemp),"最低气温":int(mintemp)})
ALL_DATA就是我们所需要的全部信息。
港澳台地区代码分析
因为在港澳台地区天气数据的网页代码,并不知道严格的标准html语法,<tably>标签并不成对出现。因此使用lxml解析就会出错。这里应该使用容错能力强的html5lib进行解析。但是html5lib进行解析的话会比使用lxml解析慢不少,因此除港澳台以为我们依然采用lxml进行解析。
若没有安装则运行cmd命令,输入pip install html5lib进行安装
urls = {
'http://www.weather.com.cn/textFC/hb.shtml',
'http://www.weather.com.cn/textFC/db.shtml',
'http://www.weather.com.cn/textFC/hd.shtml',
'http://www.weather.com.cn/textFC/hz.shtml',
'http://www.weather.com.cn/textFC/hn.shtml',
'http://www.weather.com.cn/textFC/xb.shtml',
'http://www.weather.com.cn/textFC/xn.shtml'
}
for url in urls:
parse_page(url,'lxml')
url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'
parse_page(url_gat,'html5lib')
分析数据
将ALL_DATA进行排序,获取前十位数据(最低气温)和后十位数据(最高气温)。
ALL_DATA.sort(key=lambda data:data["最低气温"])
min_data = ALL_DATA[:10]
ALL_DATA.sort(key=lambda data:data["最高气温"])
max_data = ALL_DATA[-10:-1]
数据可视化
这里要用到pyecharts库
安装方法:运行cmd命令,输入pip install bs4
cities_min = list(map(lambda x:x["城市"], min_data))
cities_max = list(map(lambda x:x["城市"], max_data))
min_temp = list(map(lambda x:x["最低气温"], min_data))
max_temp = list(map(lambda x: x["最高气温"], max_data))
bar1 = Bar()
bar1.add_xaxis(cities_min)
bar1.add_yaxis("气温/℃", min_temp)
bar1.set_global_opts(title_opts={"text": "中国城市气温排行榜", "subtext": "最低气温"})
bar1.render("最低气温.html")
bar2 = Bar()
bar2.add_xaxis(cities_max)
bar2.add_yaxis("气温/℃", max_temp)
bar2.set_global_opts(title_opts={"text": "中国城市气温排行榜", "subtext": "最高气温"})
bar2.render("最高气温.html")
结果展示
在代码所在目录自动生成 最低气温.html文件和最高气温.html文件。
打开文件:最低气温.html
2021.2.28
打开文件:最高气温.html
2021.2.28
总结
首先分析网页代码,找到所需信息对应的标签,然后对信息进行提取。再使用可视化工具库进行可视化操作。
中国天气网网站源代码简单,易于获取天气信息,非常适合新手来练习。最后附整个源代码!
重申:本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!
如需引用则请注明出处!感谢大家阅读!
最后附整个源代码!
import requests
from bs4 import BeautifulSoup
from pyecharts.charts import Bar
ALL_DATA = []
def parse_page(url,jiex):
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
# 'Referer': 'http://www.weather.com.cn/textFC/hb.shtml'
}
response = requests.get(url=url, headers=header)
text = response.content.decode('utf-8')
soup = BeautifulSoup(text,jiex)
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for tr in trs:
tds = tr.find_all('td')
chengs = list(tds[-8].stripped_strings)[0]
maxtemp = list(tds[-5].stripped_strings)[0]
mintemp = list(tds[-2].stripped_strings)[0]
ALL_DATA.append({"城市":chengs,"最高气温":int(maxtemp),"最低气温":int(mintemp)})
def main():
urls = {
'http://www.weather.com.cn/textFC/hb.shtml',
'http://www.weather.com.cn/textFC/db.shtml',
'http://www.weather.com.cn/textFC/hd.shtml',
'http://www.weather.com.cn/textFC/hz.shtml',
'http://www.weather.com.cn/textFC/hn.shtml',
'http://www.weather.com.cn/textFC/xb.shtml',
'http://www.weather.com.cn/textFC/xn.shtml'
}
for url in urls:
parse_page(url,'lxml')
url_gat = 'http://www.weather.com.cn/textFC/gat.shtml'
parse_page(url_gat,'html5lib')
# 分析数据
ALL_DATA.sort(key=lambda data:data["最低气温"])
min_data = ALL_DATA[:10]
ALL_DATA.sort(key=lambda data:data["最高气温"])
max_data = ALL_DATA[-10:-1]
# 数据可视化
cities_min = list(map(lambda x:x["城市"], min_data))
cities_max = list(map(lambda x:x["城市"], max_data))
min_temp = list(map(lambda x:x["最低气温"], min_data))
max_temp = list(map(lambda x: x["最高气温"], max_data))
bar1 = Bar()
bar1.add_xaxis(cities_min)
bar1.add_yaxis("气温/℃", min_temp)
bar1.set_global_opts(title_opts={"text": "中国城市气温排行榜", "subtext": "最低气温"})
bar1.render("最低气温.html")
bar2 = Bar()
bar2.add_xaxis(cities_max)
bar2.add_yaxis("气温/℃", max_temp)
bar2.set_global_opts(title_opts={"text": "中国城市气温排行榜", "subtext": "最高气温"})
bar2.render("最高气温.html")
if __name__ == '__main__':
main()