精华内容
下载资源
问答
  • 项目:爬取电影信息+数据分析+可视化
    千次阅读
    2021-04-28 08:29:01

    需求分析

    输入一个电影的名字:

    1. 系统可以展示该电影+评分+评分权重分析
    2. 词云可视化展示评论信息
    3. 数据存储到mongodb

    技术分析

    开发语言:python3
    获取数据:requests + lxml +xpath + json
    数据存储:pymongo+mongodb
    可视化:jieba + wordcloud + matplotlib

    系统设计

    在这里插入图片描述

    详细设计

    系统整体代码

    链接:代码
    提取码:0nct

    更多相关内容
  • 通过python爬去豆瓣网的数据,用大数据基础对数据进行清洗,然后对清洗的数据可视化,更直观的展示出来
  • 数据爬取可视化分析

    千次阅读 2021-01-06 21:57:09
    数据分析3.1读取文件3.2对在01/22/2020 12:00:00的时间的中国境内有感染者和无感染者的省或者地区进行数据处理和可视化3.3对在01/22/2020 12:00:00的时间的中国境内有感染者的各个省或者地区进行数据处理和可视化3.4...

    一、数据爬取

    1.python简介

    1. Python的创始人为荷兰人吉多·范罗苏姆 (Guido van Rossum)。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为该编程语言的名字,是取自英国20世纪70年代首播的电视喜剧《蒙提.派森的飞行马戏团》(Monty Python’s Flying Circus)。

    2. Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。

    3. Python缺点,其一是速度慢:和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会- -行-行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。其二是无法加密:如果要发布你的 Python程序,实际上就是发布源代码,这-点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器码(也就是你在Windows.上常见的xx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解释型的语言,则必须把源码发布出去。

    4. Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护、开源、高层语言、可移植、面向对象、可扩展、可嵌入、丰富的库,并且被大量用户所欢迎的、用途广泛的语言。

    2.什么是网路爬虫

    网络爬虫,又称网页蜘蛛(webspider),是一个功能强大的能够自动提取网
    页信息的程序,它模仿浏览器访问网络资源,从而获取用户需要的信息,它可以为搜索引擎从万维网上下载网页信息,因此也是搜索引擎的重要组成部分。
    根据爬取的对象、使用的结构及技术,爬虫可分为:

    1. 通用型爬虫
      该爬虫又称为全网爬虫,主要用在搜索引擎,从初始的URL到全网页面,但需要的存储容量大,速度要求快,工作性能强大。.
    2. 聚焦型爬虫
      该爬虫专注某一方面,只搜索事先定义的关键信息。
    3. 增量型爬虫
      每隔一段时间更新,重新爬取,更新数据库。

    怎么来用python爬虫,这里可以用python强大的丰富的标准库及第三方库来完成。这是爬虫的核心部分。尤其是对网页的解析,可使用正则表达式、BeautifulSoup、 lxml 来解析网页,三种方法各有千秋,使用时可根据用户的熟练程度和需要选择-种适合的解析方法。

    3.网页解析

    1. BeautifulSoup
    Bs4数据解析的原理:
    1、实例化一个BeautifulSoup对象。并且将页面源码数据加载到该对象中
    	-1.将本地的html文档中的数据加载到该对象中
    		htmlPath = 'text.html .
    		fp=open( htmlPath, 'r' ,encoding='utf-8')
    		#将本地的html文档中的数据加载到该对象中
    		soup=BeautifulSoup(fp,'1xm1')
    	-2.将互联网上获取的页面源码加载到该对象中
    		page_ text=response. text
    		soup=BeautifulSoup(page_ text,' 1xm1')
    
    2、通过调用BeautifulSoup对象中相关的属性或者方法进行标签定位和数据提取
    	-1.find()方法
    		-soup.a返回a标签第-次出现的内容
    		-soup.find('div')返回div标签第一次出现的内容
    		# 属性定位返回到某一个标签
    		soup.find('div',class_='song' )
    		-soup.find_ all('a')返回符合要求的所有标签(列表)
    	
    	-2.select()方法
    		-soup.select('.某种选择器(id,class,标签,选择器) ') (列表)
    		-层级选择器:(列表)>”大于号表示一个标签
    		-soup.select('.tang > ul > li > a')[1]”
    		空格表示多个连接标签
    		-soup. select('.tanga')[1]
    		
    	-3.获取标签之间的文本数据:
    		-text/get_ text(): 只可以获取该标签下所有的文本内容
    		-string:只可以获取该标签下直系的文本内容
    		-soup.a.text/string/get_ text( )
    		
    	-4.获取标签中的属性值:
    		-soup.a['href']
    

    Beautiful Soup提供一些简单的、 python 式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式, 这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为妒灵活地提供不同的解析策略或强劲的速度。

    1. etree
    xpath解析原理:
    1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
    	-1.将本地的html文档中的源码数据加载到etree对象中:
    		htmlPath = 'text.html 
    		etree. parse(htmlPath)
    	-2.可以将从互联网上获取的源码数据加载到该对象中
    		page_ text=response.text
    		tree=etree.HTML('page_ text')
    		xpath(-xpath表达式)
    
    2、调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
    	-1.xpath()方法
    		-tree.xpath('/html/body/div') (列表)
    		-定位到某个类
    		-“div[@/class=”类名”]-2.层级选择器:(列表)//”双斜杠表示间接的子孙标签
    		-tree.xpath('//div[@class="song"]/p[3]')/”单斜杠表示表示直接的子标签
    		-tree .xpath('/html/body/div[@class="song"]/p[3]')
    	-3.获取标签之间的文本数据:
    		-text/text():只可以获取该标签下所有的文本内容
    		-tree.xpath( '//div[@class="tang"]//li[5]/a/text()')[0]
    		-string:只可以获取该标签下直系的文本内容
    		-tree.xpath( '//div[@class="tang"]//li[5]/a/string()')[0]
    	-4.获取标签中的属性值:
    		-/@”来声明属性后面在加属性名 (/@src或者/@href)
    		-tree . xpath(' / /div[@class="song"]/ img/@src')[0]
    

    etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_ Element对象。 作为_ Element对象,可以方便的使用getparent()、 remove()、 xpath()方法。如果想通过xpath获取html源码中的内容,就要先将html源码转换成_Element对象, 然后再使用xpath()方法进行解析

    4.数据爬取流程

    对任何一个网页进行数据爬取的流程基本上是一样。

    1. 开发环境安装
    (1)从win的cmd命令下载
    	pip install lxml
    	pip install bs4
    	pip install requests
    	pip csv
    (2)从开发工具PyCharm设置下载
    2.模块导入
    需要导入的模块如下:
    import requests
    from lxml import etree
    from bs4 import BeautifulSoup
    import re
    Import os
    import csv
    3.指定url
    	给出要获取的网页的网站地址url
    4.数据请求
    	对指定的url可以使用get()、post()方法进行请求。
    	Get()请求使用较多对于那些没有对输入数据发请求的;
    	post()请求用于对要隐蔽性的用户输入信息的。
    5.数据获取
    	对数据的获取有三种:分别是text、json、content.
    	text获取通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据);
    	json获取返回是0BI。
    	content获取对象一般都是图片类型的,返回的是响应对象中存储的二进制形式的响应数据。
    6.数据解析
    	使用lxml、bs4、正则表达式、来解析要获取信息的html
    	对获取的html进行分析,然后对直接需要获取的信息的html字段进行解析,一直解析到直接需要的信息文本或者链接属性值。然后在对获取的url进行发起请求、数据获取、数据解析、数据存储,循环这个操作就获取到信息
    7.数据存储
    	将获取的信息可以储存起来,可以是以列表、数组、字典、集合、txt、html、csv、数据库、img等等形式存放
    

    示例:我们对一个网站来实例化爬取一个,对搜狐体育新闻的NBA的所有新闻信息进行爬取,这里代码是自己写的(该网站是一个动态的需要懒加载的网站信息,毕竟是一个新闻网站,信息都是实时更新的)

    #导入模块
    import requests
    import os
    from lxml import etree
    from selenium import webdriver
    from lxml import etree
    from time import sleep
    import urllib3
    urllib3.disable_warnings()
    # from requests.packages.urllib3.exceptions import InsecureRequestWarning
    from bs4 import BeautifulSoup
    driver = webdriver.Chrome(executable_path='../pc/chromedriver.exe')
    #信息保存
    list_URL_1=[]
    #NBA的所有队的信息
    list_URL_2=[]
    list_NMAE_2=[]
    
    #数据爬取
    if __name__ == '__main__':
    	name_FILE='../搜狐体育新闻NBA/File/'
    	# 创建信息文件夹
    	if not os.path.exists(name_FILE):
    		os.mkdir(name_FILE)
    	url='https://sports.sohu.com/s/nba?spm=smpc.fb-sports-home.top-subnav.15.1606024293835fpr1dOb'
    	headers = {
    		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36'
    	}
    	page_text = requests.get(url=url, headers=headers).text
    	tree_1 = etree.HTML(page_text)
    
    	#首页主要信息
    	list1=tree_1.xpath('//div[@class="sports-head-line"]/ul/li')
    	for li in  list1:
    		url=li.xpath('./a/@href')[0]
    		name=li.xpath('./a/text()')[0]
    		print(url,name)
    
    		# 主要的url
    		list_URL_1.append(url)
    	#删除https://m.sohu.com/subject/321765 的信息
    	list_URL_1.pop(1)
    	print(list_URL_1)
    	print(len(list_URL_1))
    	#//*[@id="mp-editor"]
    	for url in list_URL_1:
    		#爬取文本信息
    		page_text = requests.get(url=url, headers=headers).text
    		tree = etree.HTML(page_text)
    		t=tree.xpath('//*[@id="mp-editor"]/p//text()')
    		print(t)
    		file_n=t[0]
    		#删除后两行的'返回搜狐,查看更多'和 '责任编辑:'的信息
    		t.pop(-1)
    		t.pop(-1)
    		t='\n'.join(t)+'\n'+'\n'
    		#print(t)
    		#创建首页主要信息文件夹
    		name_file = name_FILE + '首页主要信息/'
    		if not os.path.exists(name_file):
    			os.mkdir(name_file)
    		not_File_name = ['/', "*", '"', '?', '<', '>', ':', '|']
    		# 创建首页主要信息的详情页文件夹
    		for x in not_File_name:
    			file_n = "".join(file_n[4:].split(x))
    
    		name_file_1 = name_file + file_n
    		if not os.path.exists(name_file_1):
    			os.mkdir(name_file_1)
    		#存储文本信息
    		with open(name_file_1+'/'+file_n[4:]+'.txt', 'w', encoding='utf-8') as fp:
    			fp.write(t)
    		print("文件保存成功")
    		#解析要爬取图片
    		img_src= tree.xpath('//*[@id="mp-editor"]/p/img/@src')
    		print('图片的url',img_src)
    		# 创建图片存放的文件夹
    		name_img=name_file_1+'/img/'
    		if not os.path.exists(name_img):
    			os.mkdir(name_img)
    		i=0
    		for li_url_img in img_src:
    			i = i + 1
    			#解析图片内容
    			page_text = requests.get(url=li_url_img, headers=headers, verify=False).content
    			# 生成图片名称
    			img_name = str(i)+'.jpg'
    			imgPath = name_img + img_name
    			#将图片存储到文件夹
    			with open(imgPath, 'wb') as fp:
    				fp.write(page_text)
    				print(img_name, "下载完成!!!!")
    
    
    	#首页所有的队的信息
    	# 创建首页主要信息文件夹
    	name_file2 = name_FILE + 'NBA所有球队的信息/'
    	if not os.path.exists(name_file2):
    		os.mkdir(name_file2)
    
    	list2=tree_1.xpath('//div[@class="nav-list"]/ul/li')
    	for li in list2:
    		li_url2='https://sports.sohu.com'+ li.xpath('./a/@href')[0]
    		li_name2=li.xpath('./a/text()')[0]
    		#输出队名和url
    		print(li_url2,li_name2)
    		#列表存放所有队的url和name
    		list_URL_2.append(li_url2)
    		list_NMAE_2.append(li_name2)
    
    	print(list_URL_2)
    	"""
    	由于NBA的队有三十个队左右,
    	所有这里不爬取那么多信息,
    	只爬取部分队的信息
    	"""
    	#遍历爬取各个队的信息(1个队)
    	for i in range(1):
    		#要爬取的队的url和name
    		print(list_URL_2[i],list_NMAE_2[i])
    		#创建每个队的文件夹
    		name_file2_1 = name_file2 + list_NMAE_2[i]+'/'
    		if not os.path.exists(name_file2_1):
    			os.mkdir(name_file2_1)
    
    		# driver = webdriver.Chrome(executable_path='pc/chromedriver.exe')
    		driver.get(url=list_URL_2[i])
    		#爬取四个界面的信息 20* 4
    		for i in range(1):
    			sleep(3)
    			target = driver.find_element_by_xpath(f'//*[@id="feed-wrapper"]/div[2]')
    			driver.execute_script("arguments[0].scrollIntoView();", target)
    		sleep(3)
    		# 解析球队的每个队的详情页的信息
    		page_text = driver.page_source
    		# print(page_text)
    		tree = etree.HTML(page_text)
    		a2 = tree.xpath('//div[@class="nba-feed clear theme_nbablue_border-color"]/div[2]/div[2]/div[1]/div')
    		print(len(a2))
    		#队里面的所有信息的url和name
    		#1.文本+图片
    		list_URL_2_1 = []
    		list_NAME_2_1 = []
    		# 2.全是图片
    		list_URL_2_2= []
    		list_NAME_2_2= []
            #遍历爬取每条信息的数据
    		for li in a2:
    			li_url = li.xpath('./div[1]/h3/a/@href | ./div[2]/h3/a/@href ')[0]
    			li_name = li.xpath('./div[1]/h3/a/text()| ./div[2]/h3/a/text()')[0]
    			print(li_name, li_url)
    			"""
    			这里有一部分是文本+图片组成的新闻
    			还有一部分全是图片组成的信息
    			"""
    			#1.文本+图片组成的信息
    			if '组图'not in li_name:
    				# 所有队的详细信息的url
    				list_URL_2_1.append(li_url)
    				list_NAME_2_1.append(li_name)
    				page_text = requests.get(url=li_url, headers=headers).text
    				# 爬取文本信息
    				tree = etree.HTML(page_text)
    				#//*[@id="mp-editor"]
    				t2=tree.xpath('//*[@id="mp-editor"]/p//text()')
    				#输出文本的列表信息
    				print(t2)
    				#获取文本信息的标题,如何去除里面?
    				file_n=li_name
    				print(file_n)
    				if '?' in file_n:
    					file_n = ' '.join(file_n.split("?"))
    				print(file_n)
    				#删除后两行的'返回搜狐,查看更多'和 '责任编辑:'的信息
    				t2.pop(-1)
    				t2.pop(-1)
    				t2='\n'.join(t2)+'\n'+'\n'
    				print(t2)
    				# 创建一条信息的详情页文件夹
    				name_file2_1_1 = name_file2_1 + file_n[4:]+'/'
    				if not os.path.exists(name_file2_1_1):
    					os.mkdir(name_file2_1_1)
    				#存储文本信息
    				with open(name_file2_1_1+file_n[4:]+'.txt', 'w', encoding='utf-8') as fp:
    					fp.write(t2)
    				print(file_n[4:],"文件保存成功")
    
    				#解析要爬取图片
    				img_src= tree.xpath('//*[@id="mp-editor"]/p/img/@src')
    				print('图片的url',img_src)
    				# 创建图片存放的文件夹
    				name_img=name_file2_1_1+'/img/'
    				if not os.path.exists(name_img):
    					os.mkdir(name_img)
    				i=0
    				for li_url_img in img_src:
    					i = i + 1
    					#解析图片内容
    					page_text = requests.get(url=li_url_img, headers=headers, verify=False).content
    					# 生成图片名称
    					img_name = str(i)+'.jpg'
    					imgPath = name_img + img_name
    					#将图片存储到文件夹
    					with open(imgPath, 'wb') as fp:
    						fp.write(page_text)
    						print(img_name, "下载完成!!!!")
    						
    			# 2.全是图片组成的信息
    			else :
    				# 所有队的详细信息的url
    				list_URL_2_2.append(li_url)
    				list_NAME_2_2.append(li_name)
    				page_text = requests.get(url=li_url, headers=headers,verify=False).text
    				# 爬取文本信息
    				tree = etree.HTML(page_text)
    				img_src = tree.xpath('//div[@class="picture hid"]/img/@src')
    				# 获取文本信息的标题,如何去除里面?
    				file_n = li_name
    				print(file_n)
    				if '?' in file_n:
    					file_n = ' '.join(file_n.split("?"))
    				print(file_n)
    				# 创建一条信息的详情页文件夹
    				name_file2_1_2 = name_file2_1 + file_n[4:] + '/'
    				if not os.path.exists(name_file2_1_2):
    					os.mkdir(name_file2_1_2)
    				# 创建图片存放的文件夹
    				name_img = name_file2_1_2 + '/img/'
    				if not os.path.exists(name_img):
    					os.mkdir(name_img)
    				i = 0
    				for li_url_img in img_src:
    					#这里获取的图片url不完整,需要拼接一下
    					li_url_img='https:'+li_url_img
    					i = i + 1
    					# 解析图片内容
    					# requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    					page_text = requests.get(url=li_url_img, headers=headers, verify=False).content
    					# 生成图片名称
    					img_name = str(i) + '.jpg'
    					imgPath = name_img + img_name
    					# 将图片存储到文件夹
    					with open(imgPath, 'wb') as fp:
    						fp.write(page_text)
    						print(img_name, "下载完成!!!!")
    
    
    
    
    

    二、数据清洗

    将上面的搜狐体育新闻的NBA的所有新闻信息进行爬取的数据进行清洗处理,为之后的数据分析做铺垫准备,当然了,如果数据处理不干净,可能会对后面的胡数据分析造成一定的影响。下面将对获取的数据进行数据格式统一处理、信息标题特殊字符处理。数据存储之前将数据清洗,也可以在存储之后将数据清洗,这里在数据存储之前进行清洗。

    1.数据格式统一处理

    由于NBA的球队比较多,大概有二十多个,这里就每个球队的信息进行爬取信息处理放到同一个对的文件夹中,然后将所有队信息放在一起。然而每个队有多条信息,每条信息里面包含了文本信息还有图片信息,所以需要将一条信息里面的文本单独处理存放在txt里面,图片统一放在文件夹中,然后再将该条信息的文本信息和文件夹中图片信息放在对应的队标题的文件夹中。

    • 创建文件夹存放信息
    name_FILE='../搜狐体育新闻NBA/File/'
    # 创建信息文件夹
    	if not os.path.exists(name_FILE):
    		os.mkdir(name_FILE)
    #首页所有的队的信息
    	name_file2 = name_FILE + 'NBA所有球队的信息/'
    	if not os.path.exists(name_file2):
    		os.mkdir(name_file2)
    #创建首页主要信息文件夹
    		name_file = name_FILE + '首页主要信息/'
    		if not os.path.exists(name_file):
    			os.mkdir(name_file)
    
    • 将文本信息存放在txt中,将图片信息存放在文件夹中,以jpg格式处理
    #存储文本信息
    	with open(name_file_1+'/'+file_n[4:]+'.txt', 'w', encoding='utf-8') as fp:
    		fp.write(t)
    	print("文件保存成功")
    #存储图片信息
    	# 生成图片名称
    	img_name = str(i)+'.jpg'
    	imgPath = name_img + img_name
    	#将图片存储到文件夹
    	with open(imgPath, 'wb') as fp:
    		fp.write(page_text)
    		print(img_name, "下载完成!!!!")
    

    2.信息标题特殊字符处理

    在获取一条信息的标题时,需要将该条标题来作为存放信息的文件夹的名称。如果文件标题出现一些特殊字符,会造成错误,因为文件夹的名称中不能出现一些特殊字符,例如:'/', "*", '"', '?', '<', '>', ':', '|'。因而在创建文件夹的时候,需要提前将标题提取处理,将里面特殊字符切割处理掉。

    #文件夹创建不允许存在字符
    	not_File_name = ['/', "*", '"', '?', '<', '>', ':', '|']
    #将文件名字去掉文件夹名称不能存在的一些字符
    	for x in not_File_name:
    		file_n = "".join(file_n[4:].split(x))
    # 创建首页主要信息的详情页文件夹
    	name_file_1 = name_file + file_n
    	if not os.path.exists(name_file_1):
    				os.mkdir(name_file_1)
    

    三、数据分析以及可视化

    1.什么是pandas和可视化

    pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

    可视化就是让一些数据为了更好的展现出来,让人可以以简单的肉眼方式直接看到结果,更直观、简洁、丰富以图像的形式表达出。这里就需要第三方的库matplotlib,matplotlib是一款命令式、较底层、可定制性强、图表资源丰富、简单易用、出版质量级别的python 2D绘图库。matplotlib可用于python脚本、python shell、jupyter notebook、web等。

    柱状图、点线图、直方图、饼图、堆积柱状图、填充直方图、直方散点图、面积图、趋势图、箱型图、小提琴图、数据地图、雷达图、漏斗图、嵌套饼图、各类三维图等等,不胜枚举都可以用matplotlib绘画出。

    2.数据文件的读取和写入

    • 文件读取
      data=pd.read_文件类型(‘读取文件路径’)

    示例:读取csv文件
    python #导入模块 import pandas as pd #读取文件 data=pd.read_csv('新建文本文档.csv')

    • 文件写入
      data.to_文件类型(‘保存文件路径’)
      示例:写入csv文件
      #导入模块
      import pandas as pd
      #写入文件
      data.to_csv('新建文本文档a.csv')
      

    3.数据分析

    接下来我们对csv的数据进行数据分析以及可视化处理。将本地的csv()来做处理部分数据如下:
    在这里插入图片描述

    3.1读取文件

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    #读取文件
    data = pd.read_csv(r'2019_nCoV_data.csv',encoding='utf-8',engine='python')
    # print(data)
    

    3.2对在01/22/2020 12:00:00的时间的中国境内有感染者和无感染者的省或者地区进行数据处理和可视化

    • 数据处理
    #对数据进行简单处理
    a=data.loc[:,['Date','Province/State','Country','Confirmed','Deaths','Recovered']]
    #获取是在01/22/2020 12:00:00的时间的中国境内有感染者的省或者地区
    b1=a[(a.Country=='China') & (a.Date=='01/22/2020 12:00:00') & (a.Confirmed>0)]
    print(b1)
    #获取有感染的省或者地区的数据量
    n1=np.array(b1.iloc[:,0:1]).size
    print(n1)
    #获取是在01/22/2020 12:00:00的时间的中国境内没有感染者的省或者地区
    b2=a[(a.Country=='China') & (a.Date=='01/22/2020 12:00:00') & (a.Confirmed==0.0)]
    print(b2)
    #获取没有感染的省或者地区的数据量
    n2=np.array(b2.iloc[:,0:1]).size
    print(n2)
    
    #饼状图
    # laberl是标签名称
    labels = '有感染者的地区或者省', '没有感染者的地区或者省'
    # sizes表示每个标签的个数
    sizes = [n1,n2]
    fig1, ax1 = plt.subplots()
    # autopct显示比例
    ax1.pie(sizes, autopct='%1.1f%%', labels=labels)
    # 解决汉字乱码问题 ,使用指定的汉字字体类型(此处为黑体)
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    #绘制标题
    plt.title('01/22/2020 12:00:00中国地区的有无感染者的地区或者省的占比')
    # 将图形显示出来
    plt.show()
    
    • 饼状图可视化
      在这里插入图片描述

    说明:从这个饼状图可以看出在2020年一月二号12:00:00时间,中国有四分之三的省或者地区感染了病毒,仅仅只有四分之一的省或者地区情况较好,没有人感染。由此可以该病毒在中国境内传播之迅速,让让人防不胜防。

    3.3对在01/22/2020 12:00:00的时间的中国境内有感染者的各个省或者地区进行数据处理和可视化

    • 数据处理
    
    #获取省和地区
    Province=b1['Province/State']
    #获取感染者的数量
    Confirmed=b1['Confirmed']
    
    # 首先将pandas读取的数据转化为array在转list
    Province_list = np.array(Province).tolist()
    print(Province_list)
    Confirmed_list = np.array(Confirmed).tolist()
    print(Confirmed_list)
    
    #######01/22/2020 12:00:00中国的有感染者的各个省和地区的数量占比信息
    #饼状图
    # # laberl是标签名称
    labels =Province_list
    # # sizes表示每个标签的个数
    sizes =Confirmed_list
    fig1, ax1 = plt.subplots()
    explode=[]
    for i in range(n1):
    	explode.append(0.5)
    # autopct显示比例
    ax1.pie(sizes,explode=explode, autopct='%1.1f%%', labels=labels)
    plt.title('01/22/2020 12:00:00中国的有感染者的各个省和地区的数量占比信息')#绘制标题
    # 将图形显示出来
    plt.show()
    
    
    • 可视化
      在这里插入图片描述
      说明:从这个饼状图可以看出在2020年一月二号12:00:00时间,中国有感染了病毒的省或者地区中湖北省是全国的重灾区。仅仅是一个湖北省就占了全国的八成的感染者,其他的各个地区有少量的感染者。解决湖北地区的感染者是非常重要的,由此需要其他轻灾区大量支援湖北地区摆脱病魔。

    3.4对在01/22/2020 12:00:00到02/04/2020 12:00:00的14天时间的全部地区的感染者、死亡人数、治愈人数和sno的数量进行数据处理和可视化

    • 数据处理

      # 解决汉字乱码问题 ,使用指定的汉字字体类型(此处为黑体)
      matplotlib.rcParams['font.sans-serif'] = ['SimHei']
      #布局
      plt.rcParams['figure.figsize']=(8,5)
      a=data.groupby(['Date']).sum().plot(kind='bar')
      print(a)
      #将x轴的对应时间旋转60度
      plt.xticks(rotation=60)
      #x轴和y轴说明以及设置
      plt.ylabel('人数 ', fontsize=15)
      plt.xlabel('时间', fontsize=15)
      plt.show()
      
      
    • 可视化
      ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210106211442357.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xqZjE5MDQwOQ==,size_16,color_FFFFFF,t_70

    说明:从这个直方图可以看出在2020年一月二十二号到二月四号的时间里,感染者数量一直在增加。

    3.5对在14天时间的中国地区和非中国地区的感染者、死亡人数、治愈人数的数量进行数据处理和可视化

    • 数据处理
    # 解决汉字乱码问题 ,使用指定的汉字字体类型(此处为黑体)
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    #布局
    plt.rcParams['figure.figsize']=(10,10)
    a=data.groupby([data.Country=='Mainland China']).sum().plot(kind='bar')
    print(a)
    #让x轴旋转0度
    plt.xticks(rotation=0)
    plt.ylabel('人数 ', fontsize=15)
    plt.xlabel('地区', fontsize=15)
    #显示图像
    plt.show()
    
    • 可视化
      在这里插入图片描述

    说明:从这个直方图可以看出在2020年一月二十二号到二月四号的时间里,中国地区感染者数量远远比非中国地区的感染者数量多,中国地区灾区较为严重很多。

    基本上需要的数据都已经获取。数据分析可以分析多种情况下的信息表现,这里就简单分析几个数据信息,当然了你也可以继续分析其他情况下的数据情况,这里就不过多介绍。

    展开全文
  • Python爬取天气数据及可视化分析

    万次阅读 多人点赞 2020-07-29 10:48:23
    Python爬取天气数据及可视化分析 文章目录Python爬取天气数据及可视化分析说在前面1.数据获取请求网站链接提取有用信息保存csv文件2.可视化分析当天温度变化曲线图当天相对湿度变化曲线图温湿度相关性分析图空气质量...

    Python爬取天气数据及可视化分析

    说在前面

    • 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物、安排出行,每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。本次使用python中requestsBeautifulSoup库对中国天气网当天和未来14天的数据进行爬取,保存为csv文件,之后用matplotlib、numpy、pandas对数据进行可视化处理和分析,得到温湿度度变化曲线、空气质量图、风向雷达图等结果,为获得未来天气信息提供了有效方法。

    1.数据获取

    请求网站链接

    • 首先查看中国天气网的网址:http://www.weather.com.cn/weather/101280701.shtml这里就访问本地的天气网址,如果想爬取不同的地区只需修改最后的101280701地区编号即可,前面的weather代表是7天的网页,weather1d代表当天,weather15d代表未来14天。这里就主要访问7天和14天的中国天气网。采用requests.get()方法,请求网页,如果成功访问,则得到的是网页的所有字符串文本。这就是请求过程。

      def getHTMLtext(url):     
      	"""请求获得网页内容"""
      	try:         
      		r = requests.get(url, timeout = 30)         
      		r.raise_for_status()         
      		r.encoding = r.apparent_encoding         
      		print("成功访问")         
      		return r.text     
      	except:         
      		print("访问错误")         
      		return" " 
      

    提取有用信息

    • 这里采用BeautifulSoup库对刚刚获取的字符串进行数据提取,首先对网页进行检查,找到需要获取数据的标签:

    在这里插入图片描述

    • 可以发现7天的数据信息在div标签中并且id=“7d”,并且日期、天气、温度、风级等信息都在ul和li标签中,所以我们可以使用BeautifulSoup对获取的网页文本进行查找div标签id=“7d”,找出他包含的所有的ul和li标签,之后提取标签中相应的数据值,保存到对应列表中。这里要注意一个细节就是有时日期没有最高气温,对于没有数据的情况要进行判断和处理。另外对于一些数据保存的格式也要提前进行处理,比如温度后面的摄氏度符号,日期数字的提取,和风级文字的提取,这需要用到字符查找及字符串切片处理。

      def get_content(html):
      	"""处理得到有用信息保存数据文件"""
      	final = []  							 # 初始化一个列表保存数据
      	bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
      	body = bs.body
      	data = body.find('div', {'id': '7d'})    # 找到div标签且id = 7d
      	# 下面爬取当天的数据
      	data2 = body.find_all('div',{'class':'left-div'})
      	text = data2[2].find('script').string	 
      	text = text[text.index('=')+1 :-2]		 # 移除改var data=将其变为json数据
      	jd = json.loads(text)
      	dayone = jd['od']['od2']				 # 找到当天的数据
      	final_day = []						     # 存放当天的数据
      	count = 0
      	for i in dayone:
      		temp = []
      		if count <=23:
      			temp.append(i['od21'])				 # 添加时间
      			temp.append(i['od22'])				 # 添加当前时刻温度
      			temp.append(i['od24'])				 # 添加当前时刻风力方向
      			temp.append(i['od25'])				 # 添加当前时刻风级
      			temp.append(i['od26'])				 # 添加当前时刻降水量
      			temp.append(i['od27'])				 # 添加当前时刻相对湿度
      			temp.append(i['od28'])				 # 添加当前时刻控制质量
      			#print(temp)
      			final_day.append(temp)
      		count = count +1
      	# 下面爬取7天的数据	
      	ul = data.find('ul')					 # 找到所有的ul标签
      	li = ul.find_all('li')					 # 找到左右的li标签
      	i = 0  			# 控制爬取的天数
      	for day in li:  						 	# 遍历找到的每一个li
      	    if i < 7 and i > 0:
      	        temp = []  						 	# 临时存放每天的数据
      	        date = day.find('h1').string  	 	# 得到日期
      	        date = date[0:date.index('日')]  	# 取出日期号
      	        temp.append(date)				        
      	        inf = day.find_all('p')  		 	# 找出li下面的p标签,提取第一个p标签的值,即天气
      	        temp.append(inf[0].string)
      
      	        tem_low = inf[1].find('i').string  	# 找到最低气温
      
      	        if inf[1].find('span') is None:  	# 天气预报可能没有最高气温
      	            tem_high = None
      	        else:
      	            tem_high = inf[1].find('span').string  # 找到最高气温
      	        temp.append(tem_low[:-1])
      	        if tem_high[-1] == '℃':
      	        	temp.append(tem_high[:-1])
      	        else:
      	        	temp.append(tem_high)
      	        wind = inf[2].find_all('span')		# 找到风向
      	        for j in wind:
      	        	temp.append(j['title'])
      	        wind_scale = inf[2].find('i').string # 找到风级
      	        index1 = wind_scale.index('级')
      	       	temp.append(int(wind_scale[index1-1:index1]))
      	        final.append(temp)
      	    i = i + 1
      	return final_day,final
      
    • 同样对于/weather15d:15天的信息,也做同样的处理,这里经过查看后发现他的15天网页中只有8-14天,前面的1-7天在/weather中,这里就分别访问两个网页将爬取得到的数据进行合并得到最终14天的数据。

    • 前面是未来14天的数据爬取过程,对于当天24小时的天气信息数据,经过查找发现他是一个json数据,可以通过json.loads()方法获取当天的数据,进而对当天的天气信息进行提取。

    在这里插入图片描述

    保存csv文件

    • 前面将爬取的数据添加到列表中,这里引入csv库,利用f_csv.writerow(header)f_csv.writerows(data)方法,分别写入表头和每一行的数据,这里将1天和未来14天的数据分开存储,分别保存为weather1.csvweather14.csv,下面是他们保存的表格图:

    在这里插入图片描述
    在这里插入图片描述

    2.可视化分析

    当天温度变化曲线图

    • 采用matplotlib中plt.plot()方法绘制出一天24小时的温度变化曲线,并用plt.text()方法点出最高温和最低温,并画出平均温度线,下图为温度变化曲线图:(代码见附录)

    在这里插入图片描述

    分析可以发现这一天最高温度为33℃,最低温度为28℃,并且平均温度在20.4℃左右,通过对时间分析,发现昼夜温差5℃,低温分布在凌晨,高温分布在中午到下午的时间段。

    当天相对湿度变化曲线图

    • 采用matplotlib中plt.plot()方法绘制出一天24小时的湿度变化曲线,并画出平均相对湿度线,下图为湿度变化曲线图:(代码见附录)

    在这里插入图片描述

    分析可以发现这一天最高相对湿度为86%,最低相对湿度为58℃,并且平均相对湿度在75%左右,通过对时间分析,清晨的湿度比较大,而下午至黄昏湿度较小。

    温湿度相关性分析图

    • 经过前面两个图的分析我们可以感觉到温度和湿度之间是有关系的,为了更加清楚直观地感受这种关系,使用plt.scatter()方法将温度为横坐标、湿度为纵坐标,每个时刻的点在图中点出来,并且计算相关系数,下图为结果图:

      在这里插入图片描述

      分析可以发现一天的温度和湿度具有强烈的相关性,他们呈负相关,这就说明他们时间是负相关关系,并且进一步分析,当温度较低时,空气中水分含量较多,湿度自然较高,而温度较高时,水分蒸发,空气就比较干燥,湿度较低,符合平时气候现象。

    空气质量指数柱状图

    • 空气质量指数AQI是定量描述空气质量状况的指数,其数值越大说明空气污染状况越重,对人体健康的危害也就越大。一般将空气质量指数分为6个等级,等级越高说明污染越严重,下面使用plt.bar方法对一天24小时的空气质量进行了柱状图绘制,并且根据6个等级的不同,相应的柱状图的颜色也从浅到深,也表明污染逐步加重,更直观的显示污染情况,并且也将最高和最低的空气质量指数标出,用虚线画出平均的空气质量指数,下图是绘制结果图:

      在这里插入图片描述

      上面这张是南方珠海的控制质量图,可以看出空气质量指数最大也是在健康范围,说明珠海空气非常好,分析可以发现这一天最高空气质量指数达到了35,最低则只有14,并且平均在25左右,通过时间也可以发现,基本在清晨的时候是空气最好的时候(4-9点),在下午是空气污染最严重的时候,所以清晨一般可以去外面呼吸新鲜的空气,那时污染最小。

    • 而下面这个空气质量图是选取的北方的一个城市,可以看到这里的环境远远比不上珠海。

      在这里插入图片描述

    风向风级雷达图

    • 统计一天的风力和风向,由于风力风向使用极坐标的方式展现较好,所以这里采用的是极坐标的方式展现一天的风力风向图,将圆分为8份,每一份代表一个风向,半径代表平均风力,并且随着风级增高,蓝色加深,最后结果如下所示:

      在这里插入图片描述

      分析可以发现这一天西南风最多,平均风级达到了1.75级,东北风也有小部分1.0级,其余空白方向无来风。

    未来14天高低温变化曲线图

    • 统计未来14天的高低温度变化,并绘制出他们的变化曲线图,分别用虚线将他们的平均气温线绘制出来,最后结果如下所示:

      在这里插入图片描述

      分析可以发现未来14天高温平均气温为30.5℃,温度还是比较高,但是未来的第8天有降温,需要做好降温准备,低温前面处于平稳趋势,等到第8天开始下降,伴随着高温也下降,整体温度下降,低温平均在27℃左右。

    未来14天风向风级雷达图

    • 统计未来14天的风向和平均风力,并和前面一样采用极坐标形式,将圆周分为8个部分,代表8个方向,颜色越深代表风级越高,最后结果如下所示:

      在这里插入图片描述

      分析可以发现未来14天东南风、西南风所占主要风向,风级最高达到了5级,最低的西风平均风级也有3级。

    未来14天气候分布饼图

    • 统计未来14天的气候,并求每个气候的总天数,最后将各个气候的饼图绘制出来,结果如下所示:

      在这里插入图片描述

      分析可以发现未来14天气候基本是“雨”、“阴转雨”和“阵雨”,下雨的天数较多,结合前面的气温分布图可以看出在第8-9天气温高温下降,可以推测当天下雨,导致气温下降。

    3.结论

    • 1.首先根据爬取的温湿度数据进行的分析,温度从早上低到中午高再到晚上低,湿度和温度的趋势相反,通过相关系数发现温度和湿度有强烈的负相关关系,经查阅资料发现因为随着温度升高水蒸汽蒸发加剧,空气中水分降低湿度降低。当然,湿度同时受气压和雨水的影响,下雨湿度会明显增高。
    • 2.经查阅资料空气质量不仅跟工厂、汽车等排放的烟气、废气等有关,更为重要的是与气象因素有关。由于昼夜温差明显变化,当地面温度高于高空温度时,空气上升,污染物易被带到高空扩散;当地面温度低于一定高度的温度时,天空形成逆温层,它像一个大盖子一样压在地面上空,使地表空气中各种污染物不易扩散。一般在晚间和清晨影响较大,而当太阳出来后,地面迅速升温,逆温层就会逐渐消散,于是污染空气也就扩散了。
    • 3.风是由气压在水平方向分布的不均匀导致的。风受大气环流、地形、水域等不同因素的综合影响,表现形式多种多样,如季风、地方性的海陆风、山谷风等,一天的风向也有不同的变化,根据未来14天的风向雷达图可以发现未来所有风向基本都有涉及,并且没有特别的某个风向,原因可能是近期没有降水和气文变化不大,导致风向也没有太大的变化规律。
    • 4.天气是指某一个地区距离地表较近的大气层在短时间内的具体状态。跟某瞬时内大气中各种气象要素分布的综合表现。根据未来14天的天气和温度变化可以大致推断出某个时间的气候,天气和温度之间也是有联系的,

    4.代码框架

    • 代码主要分为weather.py:对中国天气网进行爬取天气数据并保存csv文件;data1_analysis.py:对当天的天气信息进行可视化处理;data14_analysis.py:对未来14天的天气信息进行可视化处理。下面是代码的结构图:

      在这里插入图片描述

    附源代码

    weather.py

    # weather.py
    import requests
    from bs4 import BeautifulSoup
    import csv
    import json
    def getHTMLtext(url):     
    	"""请求获得网页内容"""
    	try:         
    		r = requests.get(url, timeout = 30)         
    		r.raise_for_status()         
    		r.encoding = r.apparent_encoding         
    		print("成功访问")         
    		return r.text     
    	except:         
    		print("访问错误")         
    		return" " 
    
    def get_content(html):
    	"""处理得到有用信息保存数据文件"""
    	final = []  							 # 初始化一个列表保存数据
    	bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
    	body = bs.body
    	data = body.find('div', {'id': '7d'})    # 找到div标签且id = 7d
    	# 下面爬取当天的数据
    	data2 = body.find_all('div',{'class':'left-div'})
    	text = data2[2].find('script').string	 
    	text = text[text.index('=')+1 :-2]		 # 移除改var data=将其变为json数据
    	jd = json.loads(text)
    	dayone = jd['od']['od2']				 # 找到当天的数据
    	final_day = []						     # 存放当天的数据
    	count = 0
    	for i in dayone:
    		temp = []
    		if count <=23:
    			temp.append(i['od21'])				 # 添加时间
    			temp.append(i['od22'])				 # 添加当前时刻温度
    			temp.append(i['od24'])				 # 添加当前时刻风力方向
    			temp.append(i['od25'])				 # 添加当前时刻风级
    			temp.append(i['od26'])				 # 添加当前时刻降水量
    			temp.append(i['od27'])				 # 添加当前时刻相对湿度
    			temp.append(i['od28'])				 # 添加当前时刻控制质量
    			#print(temp)
    			final_day.append(temp)
    		count = count +1
    	# 下面爬取7天的数据	
    	ul = data.find('ul')					 # 找到所有的ul标签
    	li = ul.find_all('li')					 # 找到左右的li标签
    	i = 0  			# 控制爬取的天数
    	for day in li:  						 	# 遍历找到的每一个li
    	    if i < 7 and i > 0:
    	        temp = []  						 	# 临时存放每天的数据
    	        date = day.find('h1').string  	 	# 得到日期
    	        date = date[0:date.index('日')]  	# 取出日期号
    	        temp.append(date)				        
    	        inf = day.find_all('p')  		 	# 找出li下面的p标签,提取第一个p标签的值,即天气
    	        temp.append(inf[0].string)
    
    	        tem_low = inf[1].find('i').string  	# 找到最低气温
    
    	        if inf[1].find('span') is None:  	# 天气预报可能没有最高气温
    	            tem_high = None
    	        else:
    	            tem_high = inf[1].find('span').string  # 找到最高气温
    	        temp.append(tem_low[:-1])
    	        if tem_high[-1] == '℃':
    	        	temp.append(tem_high[:-1])
    	        else:
    	        	temp.append(tem_high)
    
    	        wind = inf[2].find_all('span')		# 找到风向
    	        for j in wind:
    	        	temp.append(j['title'])
    
    	        wind_scale = inf[2].find('i').string # 找到风级
    	        index1 = wind_scale.index('级')
    	       	temp.append(int(wind_scale[index1-1:index1]))
    	        final.append(temp)
    	    i = i + 1
    	return final_day,final
    	#print(final)    
    def get_content2(html):
    	"""处理得到有用信息保存数据文件"""
    	final = []  							 						# 初始化一个列表保存数据
    	bs = BeautifulSoup(html, "html.parser")  						# 创建BeautifulSoup对象
    	body = bs.body
    	data = body.find('div', {'id': '15d'})    						# 找到div标签且id = 15d
    	ul = data.find('ul')					 						# 找到所有的ul标签
    	li = ul.find_all('li')					 						# 找到左右的li标签
    	final = []
    	i = 0  															# 控制爬取的天数
    	for day in li:  						 						# 遍历找到的每一个li
    	    if i < 8:
    	        temp = []  						 						# 临时存放每天的数据
    	        date = day.find('span',{'class':'time'}).string  		# 得到日期
    	        date = date[date.index('(')+1:-2]  						# 取出日期号
    	        temp.append(date)		
    	       	weather = day.find('span',{'class':'wea'}).string  		# 找到天气
    	        temp.append(weather)
    	        tem = day.find('span',{'class':'tem'}).text		  		# 找到温度
    	        temp.append(tem[tem.index('/')+1:-1])					# 找到最低气温
    	        temp.append(tem[:tem.index('/')-1]) 					# 找到最高气温
    	        wind = day.find('span',{'class':'wind'}).string  		# 找到风向
    	        if '转' in wind:											# 如果有风向变化
    	        	temp.append(wind[:wind.index('转')])
    	        	temp.append(wind[wind.index('转')+1:])
    	        else:													# 如果没有风向变化,前后风向一致
    	        	temp.append(wind)
    	        	temp.append(wind)
    	        wind_scale = day.find('span',{'class':'wind1'}).string  		# 找到风级
    	        index1 = wind_scale.index('级')
    	       	temp.append(int(wind_scale[index1-1:index1]))
    	        	
    	        final.append(temp)
    	return final
    
    def write_to_csv(file_name, data, day=14):
    	"""保存为csv文件"""
    	with open(file_name, 'a', errors='ignore', newline='') as f:
    		if day == 14:
    			header = ['日期','天气','最低气温','最高气温','风向1','风向2','风级']
    		else:
    			header = ['小时','温度','风力方向','风级','降水量','相对湿度','空气质量']
    		f_csv = csv.writer(f)
    		f_csv.writerow(header)
    		f_csv.writerows(data)
    
    def main():
    	"""主函数"""
    	print("Weather test")
    	# 珠海
    	url1 = 'http://www.weather.com.cn/weather/101280701.shtml'    # 7天天气中国天气网
    	url2 = 'http://www.weather.com.cn/weather15d/101280701.shtml' # 8-15天天气中国天气网
    	
    	html1 = getHTMLtext(url1)
    	data1, data1_7 = get_content(html1)		# 获得1-7天和当天的数据
    
    	html2 = getHTMLtext(url2)
    	data8_14 = get_content2(html2)			# 获得8-14天数据
    	data14 = data1_7 + data8_14
    	#print(data)
    	write_to_csv('weather14.csv',data14,14)	# 保存为csv文件
    	write_to_csv('weather1.csv',data1,1)
    
    if __name__ == '__main__':
    	main()
    
    

    data1_analysis.py:

    # data1_analysis.py
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import math
    def tem_curve(data):
    	"""温度曲线绘制"""
    	hour = list(data['小时'])
    	tem = list(data['温度'])
    	for i in range(0,24):
    		if math.isnan(tem[i]) == True:
    			tem[i] = tem[i-1]
    	tem_ave = sum(tem)/24					# 求平均温度 
    	tem_max = max(tem)				
    	tem_max_hour = hour[tem.index(tem_max)]	# 求最高温度
    	tem_min = min(tem)
    	tem_min_hour = hour[tem.index(tem_min)]	# 求最低温度
    	x = []
    	y = []
    	for i in range(0, 24):
    		x.append(i)
    		y.append(tem[hour.index(i)])
    	plt.figure(1)
    	plt.plot(x,y,color='red',label='温度')							# 画出温度曲线
    	plt.scatter(x,y,color='red')			# 点出每个时刻的温度点
    	plt.plot([0, 24], [tem_ave, tem_ave], c='blue', linestyle='--',label='平均温度') 	# 画出平均温度虚线
    	plt.text(tem_max_hour+0.15, tem_max+0.15, str(tem_max), ha='center', va='bottom', fontsize=10.5)  # 标出最高温度
    	plt.text(tem_min_hour+0.15, tem_min+0.15, str(tem_min), ha='center', va='bottom', fontsize=10.5)  # 标出最低温度
    	plt.xticks(x)
    	plt.legend()
    	plt.title('一天温度变化曲线图')
    	plt.xlabel('时间/h')
    	plt.ylabel('摄氏度/℃')
    	plt.show()
    
    def hum_curve(data):
    	"""相对湿度曲线绘制"""
    	hour = list(data['小时'])
    	hum = list(data['相对湿度'])
    	for i in range(0,24):
    		if math.isnan(hum[i]) == True:
    			hum[i] = hum[i-1]
    	hum_ave = sum(hum)/24					# 求平均相对湿度 
    	hum_max = max(hum)				
    	hum_max_hour = hour[hum.index(hum_max)]	# 求最高相对湿度
    	hum_min = min(hum)
    	hum_min_hour = hour[hum.index(hum_min)]	# 求最低相对湿度
    	x = []
    	y = []
    	for i in range(0, 24):
    		x.append(i)
    		y.append(hum[hour.index(i)])
    	plt.figure(2)
    	plt.plot(x,y,color='blue',label='相对湿度')							# 画出相对湿度曲线
    	plt.scatter(x,y,color='blue')			# 点出每个时刻的相对湿度
    	plt.plot([0, 24], [hum_ave, hum_ave], c='red', linestyle='--',label='平均相对湿度') 	# 画出平均相对湿度虚线
    	plt.text(hum_max_hour+0.15, hum_max+0.15, str(hum_max), ha='center', va='bottom', fontsize=10.5)  # 标出最高相对湿度
    	plt.text(hum_min_hour+0.15, hum_min+0.15, str(hum_min), ha='center', va='bottom', fontsize=10.5)  # 标出最低相对湿度
    	plt.xticks(x)
    	plt.legend()
    	plt.title('一天相对湿度变化曲线图')
    	plt.xlabel('时间/h')
    	plt.ylabel('百分比/%')
    	plt.show()
    
    def air_curve(data):
    	"""空气质量曲线绘制"""
    	hour = list(data['小时'])
    	air = list(data['空气质量'])
    	print(type(air[0]))
    	for i in range(0,24):
    		if math.isnan(air[i]) == True:
    			air[i] = air[i-1]
    	air_ave = sum(air)/24					# 求平均空气质量 
    	air_max = max(air)				
    	air_max_hour = hour[air.index(air_max)]	# 求最高空气质量
    	air_min = min(air)
    	air_min_hour = hour[air.index(air_min)]	# 求最低空气质量
    	x = []
    	y = []
    	for i in range(0, 24):
    		x.append(i)
    		y.append(air[hour.index(i)])
    	plt.figure(3)
    	
    	for i in range(0,24):
    		if y[i] <= 50:
    			plt.bar(x[i],y[i],color='lightgreen',width=0.7)  # 1等级
    		elif y[i] <= 100:
    			plt.bar(x[i],y[i],color='wheat',width=0.7)		 # 2等级
    		elif y[i] <= 150:
    			plt.bar(x[i],y[i],color='orange',width=0.7)		 # 3等级
    		elif y[i] <= 200:
    			plt.bar(x[i],y[i],color='orangered',width=0.7)	 # 4等级
    		elif y[i] <= 300:
    			plt.bar(x[i],y[i],color='darkviolet',width=0.7)	 # 5等级
    		elif y[i] > 300:
    			plt.bar(x[i],y[i],color='maroon',width=0.7)		 # 6等级
    	plt.plot([0, 24], [air_ave, air_ave], c='black', linestyle='--') 	# 画出平均空气质量虚线
    	plt.text(air_max_hour+0.15, air_max+0.15, str(air_max), ha='center', va='bottom', fontsize=10.5)  # 标出最高空气质量
    	plt.text(air_min_hour+0.15, air_min+0.15, str(air_min), ha='center', va='bottom', fontsize=10.5)  # 标出最低空气质量
    	plt.xticks(x)
    	plt.title('一天空气质量变化曲线图')
    	plt.xlabel('时间/h')
    	plt.ylabel('空气质量指数AQI')
    	plt.show()
    
    def wind_radar(data):
    	"""风向雷达图"""
    	wind = list(data['风力方向'])
    	wind_speed = list(data['风级'])
    	for i in range(0,24):
    		if wind[i] == "北风":
    			wind[i] = 90
    		elif wind[i] == "南风":
    			wind[i] = 270
    		elif wind[i] == "西风":
    			wind[i] = 180
    		elif wind[i] == "东风":
    			wind[i] = 360
    		elif wind[i] == "东北风":
    			wind[i] = 45
    		elif wind[i] == "西北风":
    			wind[i] = 135
    		elif wind[i] == "西南风":
    			wind[i] = 225
    		elif wind[i] == "东南风":
    			wind[i] = 315
    	degs = np.arange(45,361,45)
    	temp = []
    	for deg in degs:
    		speed = []
    		# 获取 wind_deg 在指定范围的风速平均值数据
    		for i in range(0,24):
    			if wind[i] == deg:
    				speed.append(wind_speed[i])
    		if len(speed) == 0:
    			temp.append(0)
    		else:
    			temp.append(sum(speed)/len(speed))
    	print(temp)
    	N = 8
    	theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
    	# 数据极径
    	radii = np.array(temp)
    	# 绘制极区图坐标系
    	plt.axes(polar=True)
    	# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
    	colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
    	plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
    	plt.title('一天风级图',x=0.2,fontsize=20)
    	plt.show()
    
    def calc_corr(a, b):
    	"""计算相关系数"""
    	a_avg = sum(a)/len(a)
    	b_avg = sum(b)/len(b)
    	cov_ab = sum([(x - a_avg)*(y - b_avg) for x,y in zip(a, b)])
    	sq = math.sqrt(sum([(x - a_avg)**2 for x in a])*sum([(x - b_avg)**2 for x in b])) 
    	corr_factor = cov_ab/sq
    	return corr_factor
    
    
    def corr_tem_hum(data):
    	"""温湿度相关性分析"""
    	tem = data['温度']
    	hum = data['相对湿度']
    	plt.scatter(tem,hum,color='blue')
    	plt.title("温湿度相关性分析图")
    	plt.xlabel("温度/℃")
    	plt.ylabel("相对湿度/%")
    	plt.text(20,40,"相关系数为:"+str(calc_corr(tem,hum)),fontdict={'size':'10','color':'red'})
    	plt.show()
    	print("相关系数为:"+str(calc_corr(tem,hum)))
    
    def main():
    	plt.rcParams['font.sans-serif']=['SimHei']	# 解决中文显示问题
    	plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    	data1 = pd.read_csv('weather1.csv',encoding='gb2312')
    	print(data1)
    	tem_curve(data1)
    	hum_curve(data1)
    	air_curve(data1)
    	wind_radar(data1)
    	corr_tem_hum(data1)
    if __name__ == '__main__':
    	main()
    

    data14_analysis.py:

    # data14_analysis.py
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    import math
    
    def tem_curve(data):
    	"""温度曲线绘制"""
    	date = list(data['日期'])
    	tem_low = list(data['最低气温'])
    	tem_high = list(data['最高气温'])
    	for i in range(0,14):
    		if math.isnan(tem_low[i]) == True:
    			tem_low[i] = tem_low[i-1]
    		if math.isnan(tem_high[i]) == True:
    			tem_high[i] = tem_high[i-1]
    
    	tem_high_ave = sum(tem_high)/14					# 求平均高温 
    	tem_low_ave = sum(tem_low)/14					# 求平均低温 
    	
    	tem_max = max(tem_high)				
    	tem_max_date = tem_high.index(tem_max)			# 求最高温度
    	tem_min = min(tem_low)
    	tem_min_date = tem_low.index(tem_min)			# 求最低温度
    
    	x = range(1,15)
    	plt.figure(1)
    	plt.plot(x,tem_high,color='red',label='高温')				# 画出高温度曲线
    	plt.scatter(x,tem_high,color='red')					# 点出每个时刻的温度点
    	plt.plot(x,tem_low,color='blue',label='低温')				# 画出低温度曲线
    	plt.scatter(x,tem_low,color='blue')					# 点出每个时刻的温度点
    	
    	plt.plot([1, 15], [tem_high_ave, tem_high_ave], c='black', linestyle='--') 	# 画出平均温度虚线
    	plt.plot([1, 15], [tem_low_ave, tem_low_ave], c='black', linestyle='--') 	# 画出平均温度虚线
    	plt.legend()
    	plt.text(tem_max_date+0.15, tem_max+0.15, str(tem_max), ha='center', va='bottom', fontsize=10.5)  # 标出最高温度
    	plt.text(tem_min_date+0.15, tem_min+0.15, str(tem_min), ha='center', va='bottom', fontsize=10.5)  # 标出最低温度
    	plt.xticks(x)
    	plt.title('未来14天高温低温变化曲线图')
    	plt.xlabel('未来天数/天')
    	plt.ylabel('摄氏度/℃')
    	plt.show()
    def change_wind(wind):
    	"""改变风向"""
    	for i in range(0,14):
    		if wind[i] == "北风":
    			wind[i] = 90
    		elif wind[i] == "南风":
    			wind[i] = 270
    		elif wind[i] == "西风":
    			wind[i] = 180
    		elif wind[i] == "东风":
    			wind[i] = 360
    		elif wind[i] == "东北风":
    			wind[i] = 45
    		elif wind[i] == "西北风":
    			wind[i] = 135
    		elif wind[i] == "西南风":
    			wind[i] = 225
    		elif wind[i] == "东南风":
    			wind[i] = 315
    	return wind
    
    
    def wind_radar(data):
    	"""风向雷达图"""
    	wind1 = list(data['风向1'])
    	wind2 = list(data['风向2'])
    	wind_speed = list(data['风级'])
    	wind1 = change_wind(wind1)
    	wind2 = change_wind(wind2)
    	
    	degs = np.arange(45,361,45)
    	temp = []
    	for deg in degs:
    		speed = []
    		# 获取 wind_deg 在指定范围的风速平均值数据
    		for i in range(0,14):
    			if wind1[i] == deg:
    				speed.append(wind_speed[i])
    			if wind2[i] == deg:
    				speed.append(wind_speed[i])
    		if len(speed) == 0:
    			temp.append(0)
    		else:
    			temp.append(sum(speed)/len(speed))
    	print(temp)
    	N = 8
    	theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
    	# 数据极径
    	radii = np.array(temp)
    	# 绘制极区图坐标系
    	plt.axes(polar=True)
    	# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
    	colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
    	plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
    	plt.title('未来14天风级图',x=0.2,fontsize=20)
    	plt.show()
    
    def weather_pie(data):
    	"""绘制天气饼图"""
    	weather = list(data['天气'])
    	dic_wea = { }
    	for i in range(0,14):
    		if weather[i] in dic_wea.keys():
    			dic_wea[weather[i]] += 1
    		else:
    			dic_wea[weather[i]] = 1
    	print(dic_wea)
    	explode=[0.01]*len(dic_wea.keys())
    	color = ['lightskyblue','silver','yellow','salmon','grey','lime','gold','red','green','pink']
    	plt.pie(dic_wea.values(),explode=explode,labels=dic_wea.keys(),autopct='%1.1f%%',colors=color)
    	plt.title('未来14天气候分布饼图')
    	plt.show()
    
    def main():
    	plt.rcParams['font.sans-serif']=['SimHei']	# 解决中文显示问题
    	plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
    	data14 = pd.read_csv('weather14.csv',encoding='gb2312')
    	print(data14)
    	tem_curve(data14)
    	wind_radar(data14)
    	weather_pie(data14)
    
    if __name__ == '__main__':
    	main()
    
    展开全文
  • 本文是一个开发文档,主要通过对天气数据的抓取,讲述了数据爬虫的一个简单易用的方法,最后对爬取之后的数据用ExtJS进行可视化展示。该案例,很具用一般性,是课程设计和毕业设计不错的参考资料,对开发技术人员也...
  • 这次主要是爬了京东上一双鞋的相关评论:将数据保存到excel中并可视化展示相应的信息 主要的python代码如下: 文件1 #将excel中的数据进行读取分析 import openpyxl import matplotlib.pyplot as pit #数据统计用的...
  • 同时在对数据进行分析及可视化的时候由于也是特别针对武汉出租房的进行的,所以针对性也比较强。如果别的需求需要自己进行更改。 1. 访问[安居客网址](https://wuhan.anjuke.com/),获取cookie。 > tip:获取...
  • 基于Python的网络爬虫及数据可视化和预测分析.pdf
  • 离线数据通过Hadoop集群处理、存储,通过Hive完成离线数据处理和分析,并最终通过Hue实现对用户的可视化展示。实时流数据通过Kafka消息队列临时存储,并通过Spark流处理,最终将结果存放在 MySQL数据库中,通过Java...
  • Python疫情数据爬取可视化展示

    万次阅读 多人点赞 2021-03-19 22:16:26
    文章目录疫情数据爬取可视化展示疫情数据抓取初步分析数据处理国内各省疫情数据提取国际疫情数据提取数据整合可视化展示国内疫情态势可视化国际疫情态势可视化国内疫情方寸间国际疫情方寸间参考链接 导入相关模块 ...

    疫情数据爬取与可视化展示

    使用Python爬取腾讯新闻疫情数据,并使用pyecharts可视化,绘制国内、国际日增长人数地图,matplotlib绘制方寸图。

    随笔记录所的所学,此博客为我记录文章所用,发布到此,仅供网友阅读参考。作者:北山啦

    写在前面:这个已经不是什么新鲜的话题了,所以请大佬勿喷

    导入相关模块

    import time
    import json
    import requests
    from datetime import datetime
    import pandas as pd
    import numpy as np
    

    1. 疫情数据抓取

    通过腾讯新闻公布的数据进行爬取

    网址:https://news.qq.com/zt2020/page/feiyan.htm#/

    对于静态网页,我们只需要把网页地址栏中的url传到get请求中就可以轻松地获取到网页的数据。 对于动态网页抓取的关键是先分析网页数据获取和跳转的逻辑,再去写代码 。

    右击检查,选择Network,Ctrl+R即可
    在这里插入图片描述

    记得安装快速第三方库

    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
    

    快速下载模块

    # 定义抓取数据函数:https://beishan.blog.csdn.net/
    def Domestic():
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
        reponse = requests.get(url=url).json()
        data = json.loads(reponse['data'])
        return data
    
    
    def Oversea():
        url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_foreign'
        reponse = requests.get(url=url).json()
        data = json.loads(reponse['data'])
        return data
    
    
    domestic = Domestic()
    oversea = Oversea()
    
    print(domestic.keys())
    print(oversea.keys())
    
    dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree'])
    dict_keys(['foreignList', 'globalStatis', 'globalDailyHistory', 'importStatis', 'countryAddConfirmRankList', 'countryConfirmWeekCompareRankList', 'continentStatis'])
    

    2. 初步分析

    提取各地区数据明细

    # 提取各地区数据明细
    areaTree = domestic['areaTree']
    # 查看并分析具体数据
    areaTree
    

    提取国外地区数据明细

    # 提取国外地区数据明细
    foreignList = oversea['foreignList']
    # 查看并分析具体数据
    foreignList
    

    就可以看到在json数据存储的结构了

    3. 数据处理

    3.1 国内各省疫情数据提取

    # Adresss:https://beishan.blog.csdn.net/
    china_data = areaTree[0]['children'] 
    china_list = []
    for a in range(len(china_data)):
        province = china_data[a]['name']  
        confirm = china_data[a]['total']['confirm'] 
        heal = china_data[a]['total']['heal']  
        dead = china_data[a]['total']['dead']  
        nowConfirm = confirm - heal - dead 
        china_dict = {} 
        china_dict['province'] = province  
        china_dict['nowConfirm'] = nowConfirm 
        china_list.append(china_dict) 
    
    china_data = pd.DataFrame(china_list) 
    china_data.to_excel("国内疫情.xlsx", index=False) #存储为EXCEL文件
    china_data.head()
    
    provincenowConfirm
    0香港323
    1上海40
    2四川34
    3台湾30
    4广东29

    3.2 国际疫情数据提取

    world_data = foreignList  
    world_list = []  
    
    for a in range(len(world_data)):
        # 提取数据
        country = world_data[a]['name']
        nowConfirm = world_data[a]['nowConfirm']  
        confirm = world_data[a]['confirm']
        dead = world_data[a]['dead']  
        heal = world_data[a]['heal'] 
        # 存放数据
        world_dict = {}
        world_dict['country'] = country
        world_dict['nowConfirm'] = nowConfirm
        world_dict['confirm'] = confirm
        world_dict['dead'] = dead
        world_dict['heal'] = heal
        world_list.append(world_dict)
    
    world_data = pd.DataFrame(world_list)
    world_data.to_excel("国外疫情.xlsx", index=False)
    world_data.head()
    
    countrynowConfirmconfirmdeadheal
    0美国72826113035888055247022523799
    1西班牙1939763212332729102945446
    2法国2166003240525557671181581
    3秘鲁11194042218319408290835
    4英国9001110414513759375

    3.3 数据整合

    将国内数据和海外数据合并

    查询数据中是否含有中国疫情数据

    world_data.loc[world_data['country'] == "中国"]
    
    countrynowConfirmconfirmdeadheal

    从新增areaTree中提取中国数据,并添加至world_data

    confirm = areaTree[0]['total']['confirm']  # 提取中国累计确诊数据
    heal = areaTree[0]['total']['heal']  # 提取中国累计治愈数据
    dead = areaTree[0]['total']['dead']  # 提取中国累计死亡数据
    nowConfirm = confirm - heal - dead  # 计算中国现有确诊数量
    
    world_data = world_data.append(
        {
            'country': "中国",
            'nowConfirm': nowConfirm,
            'confirm': confirm,
            'heal': heal,
            'dead': dead
        },
        ignore_index=True)
    

    再次查询数据中是否含有中国疫情数据

    world_data.loc[world_data['country'] == "中国"]
    
    countrynowConfirmconfirmdeadheal
    161中国518102479484997112

    4. 可视化展示

    4.1 国内疫情态势可视化

    导入pyecharts相关库

    快速掌握数据可视化工具pyecharts

    import pyecharts.options as opts
    from pyecharts.charts import Map
    from pyecharts.globals import CurrentConfig, NotebookType
    CurrentConfig.NOTEBOOK_TYPE = NotebookType.JUPYTER_LAB
    

    国内各地区现有确诊人数地图

    m = Map()
    m.add("", [
        list(z)
        for z in zip(list(china_data["province"]), list(china_data["nowConfirm"]))
    ],
          maptype="china",
          is_map_symbol_show=False)
    m.set_global_opts(
        title_opts=opts.TitleOpts(title="COVID-19中国现有地区现有确诊人数地图"),
        visualmap_opts=opts.VisualMapOpts(
            is_piecewise=True,
            pieces=[
                {
                    "min": 5000,
                    "label": '>5000',
                    "color": "#893448"
                },  # 不指定 max,表示 max 为无限大
                {
                    "min": 1000,
                    "max": 4999,
                    "label": '1000-4999',
                    "color": "#ff585e"
                },
                {
                    "min": 500,
                    "max": 999,
                    "label": '500-1000',
                    "color": "#fb8146"
                },
                {
                    "min": 101,
                    "max": 499,
                    "label": '101-499',
                    "color": "#ffA500"
                },
                {
                    "min": 10,
                    "max": 100,
                    "label": '10-100',
                    "color": "#ffb248"
                },
                {
                    "min": 1,
                    "max": 9,
                    "label": '1-9',
                    "color": "#fff2d1"
                },
                {
                    "max": 1,
                    "label": '0',
                    "color": "#ffffff"
                }
            ]))
    m.render_notebook()
    

    在这里插入图片描述

    4.2 国际疫情态势可视化

    将各国的中文名称转换成英文名称,使用pandas中的merge方法

    pd.merge( left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None,)

    how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集

    这里需要使用到,国家中英文对照表.xlsx。提取码: u1mc
    百度网盘自取提取码: u1mc

    world_name = pd.read_excel("国家中英文对照表.xlsx")
    world_data_t = pd.merge(world_data,
                            world_name,
                            left_on="country",
                            right_on="中文",
                            how="inner")
    
    world_data_t
    
    countrynowConfirmconfirmdeadheal英文中文
    0美国72826113035888055247022523799United States美国
    1西班牙1939763212332729102945446Spain西班牙
    2法国2166003240525557671181581France法国
    3秘鲁11194042218319408290835Peru秘鲁
    4英国9001110414513759375United Kingdom英国
    ........................
    164伯利兹2200Belize伯利兹
    165东帝汶1100Timor-Leste东帝汶
    166东帝汶1100East Timor东帝汶
    167巴布亚新几内亚1100Papua New Guinea巴布亚新几内亚
    168中国518102479484997112China中国

    169 rows × 7 columns

    世界各国现有确诊人数地图

    m2 = Map()
    m2.add("", [
        list(z)
        for z in zip(list(world_data_t["英文"]), list(world_data_t["nowConfirm"]))
    ],
           maptype="world",
           is_map_symbol_show=False)
    m2.set_global_opts(title_opts=opts.TitleOpts(title="COVID-19世界各国现有确诊人数地图"),
                       visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
                                                         pieces=[{
                                                             "min": 5000,
                                                             "label": '>5000',
                                                             "color": "#893448"
                                                         }, {
                                                             "min": 1000,
                                                             "max": 4999,
                                                             "label": '1000-4999',
                                                             "color": "#ff585e"
                                                         }, {
                                                             "min": 500,
                                                             "max": 999,
                                                             "label": '500-1000',
                                                             "color": "#fb8146"
                                                         }, {
                                                             "min": 101,
                                                             "max": 499,
                                                             "label": '101-499',
                                                             "color": "#ffA500"
                                                         }, {
                                                             "min": 10,
                                                             "max": 100,
                                                             "label": '10-100',
                                                             "color": "#ffb248"
                                                         }, {
                                                             "min": 0,
                                                             "max": 9,
                                                             "label": '0-9',
                                                             "color": "#fff2d1"
                                                         }]))
    """取消显示国家名称"""
    m2.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    m2.render_notebook()
    

    在这里插入图片描述

    4.3 国内疫情方寸间

    单独取出中国疫情数据

    # 单独取出中国疫情数据
    China_data = world_data.loc[world_data['country'] == "中国"]
    
    # 使索引从0开始递增
    China_data.reset_index(drop=True, inplace=True)
    
    China_data
    
    countrynowConfirmconfirmdeadheal
    0中国518102479484997112

    提取China_data的累计确诊、累计治愈与累计死亡数据

    # 提取China_data的累计确诊、累计治愈与累计死亡数据
    # data.at[n,'name']代表根据行索引和列名,获取对应元素的值
    w_confirm = China_data.at[0, 'confirm']
    w_heal = China_data.at[0, 'heal']
    w_dead = China_data.at[0, 'dead']
    

    导入matplotlib相关库

    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    

    构建国内疫情方寸间图示

    # -*- coding: utf-8 -*-
    %matplotlib inline
    
    fig1 = plt.figure()
    
    ax1 = fig1.add_subplot(111, aspect='equal', facecolor='#fafaf0')
    ax1.set_xlim(-w_confirm / 2, w_confirm / 2)
    ax1.set_ylim(-w_confirm / 2, w_confirm / 2)
    ax1.spines['top'].set_color('none')
    ax1.spines['right'].set_color('none')
    ax1.spines['bottom'].set_position(('data', 0))
    ax1.spines['left'].set_position(('data', 0))
    ax1.set_xticks([])
    ax1.set_yticks([])
    
    p0 = patches.Rectangle((-w_confirm / 2, -w_confirm / 2),
                           width=w_confirm,
                           height=w_confirm,
                           facecolor='#29648c',
                           label='confirm')
    p1 = patches.Rectangle((-w_heal / 2, -w_heal / 2),
                           width=w_heal,
                           height=w_heal,
                           facecolor='#69c864',
                           label='heal')
    p2 = patches.Rectangle((-w_dead / 2, -w_dead / 2),
                           width=w_dead,
                           height=w_dead,
                           facecolor='#000000',
                           label='dead')
    
    plt.gca().add_patch(p0)
    plt.gca().add_patch(p1)
    plt.gca().add_patch(p2)
    plt.title('COVID-19 Square - China', fontdict={'size': 20})
    plt.legend(loc='best')
    plt.show()
    

    在这里插入图片描述

    4.4 国际疫情方寸间

    重新排序数据

    world_data.sort_values("confirm", ascending=False, inplace=True)
    world_data.reset_index(drop=True, inplace=True)
    world_data
    
    countrynowConfirmconfirmdeadheal
    0美国72826113035888055247022523799
    1西班牙1939763212332729102945446
    2法国2166003240525557671181581
    3秘鲁11194042218319408290835
    4英国9001110414513759375
    ..................
    157利比里亚3300
    158几内亚比绍2200
    159伯利兹2200
    160东帝汶1100
    161巴布亚新几内亚1100

    162 rows × 5 columns

    构建国际疫情方寸间图示

    # -*- coding: utf-8 -*-
    plt.rcParams['font.sans-serif'] = [u'SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    fig1 = plt.figure(figsize=(25, 25))
    for a in range(20):
    
        w_confirm = world_data.at[a, 'confirm']
        w_heal = world_data.at[a, 'heal']
        w_dead = world_data.at[a, 'dead']
        ax1 = fig1.add_subplot(20 / 4,
                               4,
                               a + 1,
                               aspect='equal',
                               facecolor='#fafaf0')
        ax1.set_xlim(-w_confirm / 2, w_confirm / 2)
        ax1.set_ylim(-w_confirm / 2, w_confirm / 2)
    
        ax1.spines['top'].set_color('none')
        ax1.spines['right'].set_color('none')
        ax1.spines['bottom'].set_position(('data', 0))
        ax1.spines['left'].set_position(('data', 0))
        ax1.set_xticks([])
        ax1.set_yticks([])
        p0 = patches.Rectangle((-w_confirm / 2, -w_confirm / 2),
                               width=w_confirm,
                               height=w_confirm,
                               alpha=w_confirm / 90000,
                               facecolor='#29648c',
                               label='confirm')
        p1 = patches.Rectangle((-w_heal / 2, -w_heal / 2),
                               width=w_heal,
                               height=w_heal,
                               alpha=1,
                               facecolor='#69c864',
                               label='heal')
        p2 = patches.Rectangle((-w_dead / 2, -w_dead / 2),
                               width=w_dead,
                               height=w_dead,
                               alpha=1,
                               facecolor='black',
                               label='dead')
        plt.gca().add_patch(p0)
        plt.gca().add_patch(p1)
        plt.gca().add_patch(p2)
    
    
        plt.title(world_data.at[a, 'country'], fontdict={'size': 20})
    
    
        plt.legend(loc='best')
    
    plt.show()
    

    在这里插入图片描述
    这样就可以清楚的看到各个国家新冠确诊人数、治愈和死亡人数的关系了

    推荐阅读

    1. 冰冰B站视频弹幕爬取原理解析
    2. Python建立时间序列ARIMA模型实战案例
    3. 使用xpath爬取数据
    4. jupyter notebook使用
    5. BeautifulSoup爬取豆瓣电影Top250
    6. 一篇文章带你掌握requests模块
    7. Python网络爬虫基础–BeautifulSoup

    参考链接

    1. 腾讯疫情动态
    2. Python 制作全国疫情地图
    3. 利用Python实现新冠疫情数据可视化
    4. 欢迎关注

    在这里插入图片描述

    到这里就结束了,如果对你有帮助,欢迎点赞关注评论,你的点赞对我很重要。

    在这里插入图片描述

    展开全文
  • 思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警AI和NLP应用等。...
  • 将获取的数据进行可视化,通过对抓取的数据分析得到结论,每月博客发布数量与阅读量成正比。并将博客名称词云可视化,发现图形界面,Java,Python等关键词使用较多。 关键词:Python;网络爬虫;博客;可视化
  • 另:如果有同学只想做数据分析可视化展示,这也没问题。以下百度网盘链接也提供了已经使用爬虫获取的数据。  环境:python(anaconda)  源码:百度网盘链接:https://pan.baidu.com/s/101ck
  • 基于Python的网络爬虫与数据可视化分析

    万次阅读 多人点赞 2020-07-26 10:43:12
    在互联网技术迅速发展的背景下,网络数据呈现出爆炸式增长,对数据的应用需要在大量数据中记性挖掘搜索,搜索引擎结合这一需求就应运而生,不只是搜索数据信息,还要帮助人们找到需要的结果被人们所应用。...
  • python爬虫,并将数据进行可视化分析数据可视化包含饼图、柱状图、漏斗图、词云、另附源代码和报告书。
  • 这是一套以实例为主、使用Python语言讲解网络数据爬虫及分析的实战指南。本套书通俗易懂,涵盖了... 本套书包括两本:《Python网络数据爬取及分析从入门到精通(爬取篇)》和《Python网络数据爬取及分析从入门到精通(分...
  • 借助高德地图API,爬取指定公交线路(国内绝大多数线路,给定城市名和路线名即可)的始发站、终点站、行驶路径(行车轨迹)、站点名称和坐标、行驶距离等与公交车有关的基本信息,并将其保存到Execl表格中!...
  • 通过requests抓包方式爬取拉勾网深圳市的数据分析岗位信息,并利用pandas、pyecharts、jieba、WordCloud等工具,从多维度进行岗位数据可视化分析
  • 关于对51job招聘网站信息的爬取以及可视化分析(1一数据爬取)前言一、爬虫常用库需要哪些?二、使用步骤数据爬取总结 前言 为了了解目前中国目前各职位的数量、薪资、招聘公司、岗位职责要求,实现对某一地区...
  • 基于Python的网络爬虫与数据可视化分析——代码

    千次阅读 多人点赞 2020-12-27 15:59:42
    原理技术报告请点击此处查看 一、爬虫部分 # -*- coding:utf-8 -*- from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver....
  • 豆瓣电影Top250数据爬取、数据分析及数据可视化

    千次阅读 多人点赞 2021-02-12 19:15:38
    引言 在爬虫学习中,一套完整的项目实战...在该项目实战中主要应用了:python语法基础、数据爬取、数据解析、数据分析及数据可视化数据爬取与解析 数据存储 数据可视化 Flask Echarts WordCloud 新手问题总结 ...
  • 基于Python爬虫的电影数据可视化分析.pdf
  • 平台部分主要是hadoop分布式系统,基于该系统融合了组件Spark,Hbase,Hive,Sqoop,Mahout等。继而进行相关的数据分析 ...4:可视化 代码封装完好, 适用于对作影视感情分析,影评分析,电影类型分析,推荐系统的建立
  • 一、小说数据的获取获取的数据为起点中文网的小说推荐周榜的所有小说信息。源代码对所有想要获取的数据都有注释。http://dxb.myzx.cn/grandmal/#-*-coding:utf-8-*-"""CreatedonMonJan422:59:112021""...
  • 利用python爬虫技术爬取中国气象网的天气数据,并对数据进行分析处理可视化,绘制图线,内涵源码说明文档,完美应付课设大作业
  • 数据处理与可视化之Altair 后言-python爬虫相关库 网络爬虫简介 网络爬虫(webcrawler,又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种用来自动浏览万维网的程序或者脚本。爬虫...
  • 该资源是针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警AI和NLP应用等。希望该系列线上远程教学对您...
  • 爬取链接:隐藏的角落豆瓣影评 本文源码:百度云 提取码 影评爬取 豆瓣网有限制,各种类型的评论只可以爬取220条,所以我爬取了好评、一般、差评各220条,过滤解析错误的影评后,累计爬取630条。爬取维度为评论类型、...
  • 基于Python爬虫的职位信息数据分析可视化系统实现.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,561
精华内容 3,024
关键字:

网络数据爬取及可视化分析

友情链接: EasyCam_Source.zip