中国天气网爬虫数据可视化

目录

  • 中国天气网爬虫数据可视化
    • 爬虫功能
    • 网页分析
      • 以华北地区为例分析网页源代码
        • 1.以谷歌浏览器为例分析
        • 2. 提取特征标签
        • 3.分析源代码
    • 利用requests库获取目标网页源代码
    • 利用BeautifulSoup库提取天气信息
    • 港澳台地区代码分析
    • 分析数据
    • 数据可视化
    • 结果展示
  • 总结
    • 最后附整个源代码!

中国天气网爬虫数据可视化

感谢阅读最爱小鱼果的博客。

本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!

爬虫功能

大家好,我来讲讲怎么用python对中国天气网进行爬取并且对爬取到的数据进行数据可视化的显示:

  1. 爬取全国各个城市的气温(最高气温,最低气温);
  2. 获取全国城市中气温最低最高的前十名城市(地区)进行可视化操作(以直方图的形式给出展示形式为 .html格式)

网页分析

首先打开中国天气网,找到全国各个区域(华北、东北、华东、华中、华南、西北、西南、港澳台)天气信息。

以华北地区为例分析网页源代码

1.以谷歌浏览器为例分析

打开谷歌浏览器,打开华北地区天气预报,鼠标右键点击 检查,找到Elements
如图所示:
中国天气网爬虫数据可视化_第1张图片

2. 提取特征标签

找到我们所需要的信息所在的网页源代码特征标签
中国天气网爬虫数据可视化_第2张图片
获取所有标签。
分析可知所有城市天气信息在标签下的标签
获取所有标签。

在对应的标签中找到城市所在代码区域:
中国天气网爬虫数据可视化_第3张图片

3.分析源代码

分析网页源代码可知,前两个标签为表头信息,第一个标签为省会(直辖市),为冗余信息。

利用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语法,标签并不成对出现。因此使用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]
	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
中国天气网爬虫数据可视化_第4张图片

打开文件:最高气温.html

2021.2.28
中国天气网爬虫数据可视化_第5张图片

总结

首先分析网页代码,找到所需信息对应的标签,然后对信息进行提取。再使用可视化工具库进行可视化操作。
中国天气网网站源代码简单,易于获取天气信息,非常适合新手来练习。最后附整个源代码!
重申:本篇博客在于记录本人学习爬虫过程中的一些项目案例,如有错误还请大家批评指正!
如需引用则请注明出处!感谢大家阅读!

最后附整个源代码!

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]
    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()

你可能感兴趣的:(Python爬虫,可视化,python,大数据,数据分析,爬虫)