关于python的中国历年城市天气信息爬取
一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称
关于python的中国城市天气网爬取
2.主题式网络爬虫爬取的内容与数据特征分析
爬取中国天气网各个城市每年各个月份的天气数据,
包括最高城市名,最低气温,天气状况等。
3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)
实现思路:通过正则表达式以及通过读取爬取数据的csv文件数据,并且变成可视化图。
技术难点:代码有问题,初期爬取的值不是城市,而只有省份,后来也不对,从城市开始后就是天气了,不行。
二、主题页面的结构特征分析(15分)
1.主题页面的结构特征
爬取页面的天气信息,该页面是由table,tr,conmidtab,display和none,div来组成的中国天气网html页面程序代码。
2.Htmls页面解析
以下是中国天气网部分地区的HTML页面分析,可以发现,一个省份就是用一个table来进行装,选择各个table,就可以将里面的各个城市都选中,
又在各个table中用tr来装载各个城市的天气信息,前两个tr标签是表头,后面的tr标签才是信息,
q
以及以下的’conMidtab包裹了该页面地区所有城市的信息段,将其展开,
会在里面再找到一个table,里面也有一个conmidtab,但并没有在页面所显示出来,因为,里面有一个display和none将它隐藏了起来。可运用于想查询哪一天的天气信息,那就会把上一条的天气信息隐藏起来。

3.节点(标签)查找方法与遍历方法
(必要时画出节点树结构)
使用正则表达式,以及tr标签,div,table分装,来进行查找各个城市的天气信息。
三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
3.文本分析(可选):jieba分词、wordcloud可视化
5.数据持久化
6.附完整程序代码
1.数据爬取与采集
我们通过获取网页url来进行爬取
def get_one_page(url): #获取网页url 进行爬取
print('进行爬取'+url)
headers={'User-Agent':'User-Agent:Mozilla/5.0'} #头文件的user-agent
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.content
return None
except RequestException:
return None
2.对数据进行清洗和处理
def parse_one_page(html):#解析清理网页
soup = BeautifulSoup(html, "lxml")
info = soup.find('div', class_='wdetail')
rows=[]
tr_list = info.find_all('tr')[1:] # 使用从第二个tr开始取
for index, tr in enumerate(tr_list): # enumerate可以返回元素的位置及内容
td_list = tr.find_all('td')
date = td_list[0].text.strip().replace("\n", "") # 取每个标签的text信息,并使用replace()函数将换行符删除
weather = td_list[1].text.strip().replace("\n", "").split("/")[0].strip()
temperature_high = td_list[2].text.strip().replace("\n", "").split("/")[0].strip()
temperature_low = td_list[2].text.strip().replace("\n", "").split("/")[1].strip()
rows.append((date,weather,temperature_high,temperature_low))
return rows
3.文本分析(可选):jieba分词、wordcloud可视化
然后我们再选取我们想要的城市,所需年份,及月份,以及相关部分代码
cities = ['quanzhou',beijing','shanghai','tianjin','chongqing','akesu','anning','anqing',
'anshan','anshun','anyang','baicheng','baishan','baiyiin','bengbu','baoding',
'baoji','baoshan','bazhong','beihai','benxi','binzhou','bole','bozhou',
'cangzhou','changde','changji','changshu','changzhou','chaohu','chaoyang',
'chaozhou','chengde','chengdu','chenggu','chengzhou','chibi','chifeng','chishui',
'chizhou','chongzuo','chuxiong','chuzhou','cixi','conghua'] #获取城市名称来爬取选定城市天气
years = ['2011','2012','2013','2014','2015','2016','2017','2018']#爬取的年份
months = ['01','02','03','04','05','06', '07', '08','09','10','11','12']#爬取的月份
def get_one_page(url): #获取网页url 进行爬取
def parse_one_page(html):#解析清晰和处理网页
if __name__ == '__main__':#主函数
# os.chdir() # 设置工作路径
#读取CSV文件数据 filename='quanzhou_weather.csv'
current_date=datetime.strptime(row[0],'%Y-%m-%d') #将日期数据转换为datetime对象
soup = BeautifulSoup(html, "lxml") #使用lxml的方式进行解析
info = soup.find('div', class_='wdetail') #寻找到第一个div,以及它的class= wdetail
ate = td_list[0].text.strip().replace("\n", "") # 取每个标签的text信息,并使用replace()函数将换行符删除
4.数据分析与可视化
(例如:数据柱形图、直方图、散点图、盒图、分布图、数据回归分析等)
下图为爬取代表性城市泉州天气成功的效果图。

下图为代表城市泉州历年来各个月份每天的天气数据


下图为爬取的代表性城市天气的可视化图,以及相关的代码分析。

import csv
from matplotlib import pyplot as plt
from datetime import datetime
#读取CSV文件数据
filename='quanzhou_weather.csv'
with open(filename) as f: #打开这个文件,并将结果文件对象存储在f中
reader=csv.reader(f) #创建一个阅读器reader
header_row=next(reader) #返回文件中的下一行
dates,highs,lows=[],[],[] #声明存储日期,最值的列表
for row in reader:
current_date=datetime.strptime(row[0],'%Y-%m-%d') #将日期数据转换为datetime对象
dates.append(current_date) #存储日期
high=int(row[1]) #将字符串转换为数字
highs.append(high) #存储温度最大值
low=int(row[3])
lows.append(low) #存储温度最小值
#根据数据绘制图形
fig=plt.figure(dpi=128,figsize=(10,6))
plt.plot(dates,highs,c='red',alpha=0.5)#实参alpha指定颜色的透明度,0表示完全透明,1(默认值)完全不透明
plt.plot(dates,lows,c='blue',alpha=0.5)
plt.fill_between(dates,highs,lows,facecolor='blue',alpha=0.1) #给图表区域填充颜色
plt.title('quanzhou high and low temperature-2011',fontsize=24)
plt.xlabel('',fontsize=16)
plt.ylabel('Temperature(F)',fontsize=16)
plt.tick_params(axis='both',which='major',labelsize=16)
fig.autofmt_xdate() #绘制斜的日期标签
plt.show()
5.数据持久化
6.附完整程序代码
爬取中国天气网各城市天气数据完整程序代码:
import requests
from requests.exceptions import RequestException #爬取异常函数
from bs4 import BeautifulSoup
import os #操作系统接口模块 用来写入爬出数据
import csv #爬出数据存为csv文件
import time def get_one_page(url): #获取网页url 进行爬取 print('进行爬取'+url)
headers={'User-Agent':'User-Agent:Mozilla/5.0'} #头文件的User-Agent
try:
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.content
return None
except RequestException:
return None def parse_one_page(html):#解析清晰和处理网页 soup = BeautifulSoup(html, "lxml") #使用lxml的方式进行解析
info = soup.find('div', class_='wdetail') #寻找到第一个div,以及它的class= wdetail
rows=[]
tr_list = info.find_all('tr')[1:]
for index, tr in enumerate(tr_list): # enumerate可以返回元素的位置及内容
td_list = tr.find_all('td')
date = td_list[0].text.strip().replace("\n", "") # 取每个标签的text信息,并使用replace()函数将换行符删除
weather = td_list[1].text.strip().replace("\n", "").split("/")[0].strip()
temperature_high = td_list[2].text.strip().replace("\n", "").split("/")[0].strip()
temperature_low = td_list[2].text.strip().replace("\n", "").split("/")[1].strip() rows.append((date,weather,temperature_high,temperature_low))
return rows cities = ['quanzhou',beijing','shanghai','tianjin','chongqing','akesu','anning','anqing',
'anshan','anshun','anyang','baicheng','baishan','baiyiin','bengbu','baoding',
'baoji','baoshan','bazhong','beihai','benxi','binzhou','bole','bozhou',
'cangzhou','changde','changji','changshu','changzhou','chaohu','chaoyang',
'chaozhou','chengde','chengdu','chenggu','chengzhou','chibi','chifeng','chishui',
'chizhou','chongzuo','chuxiong','chuzhou','cixi','conghua',
'dali','dalian','dandong','danyang','daqing','datong','dazhou',
'deyang','dezhou','dongguan','dongyang','dongying','douyun','dunhua',
'eerduosi','enshi','fangchenggang','feicheng','fenghua','fushun','fuxin',
'fuyang','fuyang1','fuzhou','fuzhou1','ganyu','ganzhou','gaoming','gaoyou',
'geermu','gejiu','gongyi','guangan','guangyuan','guangzhou','gubaotou',
'guigang','guilin','guiyang','guyuan','haerbin','haicheng','haikou',
'haimen','haining','hami','handan','hangzhou','hebi','hefei','hengshui',
'hengyang','hetian','heyuan','heze','huadou','huaian','huainan','huanggang',
'huangshan','huangshi','huhehaote','huizhou','huludao','huzhou','jiamusi',
'jian','jiangdou','jiangmen','jiangyin','jiaonan','jiaozhou','jiaozou',
'jiashan','jiaxing','jiexiu','jilin','jimo','jinan','jincheng','jingdezhen',
'jinghong','jingjiang','jingmen','jingzhou','jinhua','jining1','jining',
'jinjiang','jintan','jinzhong','jinzhou','jishou','jiujiang','jiuquan','jixi',
'jiyuan','jurong','kaifeng','kaili','kaiping','kaiyuan','kashen','kelamayi',
'kuerle','kuitun','kunming','kunshan','laibin','laiwu','laixi','laizhou',
'langfang','lanzhou','lasa','leshan','lianyungang','liaocheng','liaoyang',
'liaoyuan','lijiang','linan','lincang','linfen','lingbao','linhe','linxia',
'linyi','lishui','liuan','liupanshui','liuzhou','liyang','longhai','longyan',
'loudi','luohe','luoyang','luxi','luzhou','lvliang','maanshan','maoming',
'meihekou','meishan','meizhou','mianxian','mianyang','mudanjiang','nanan',
'nanchang','nanchong','nanjing','nanning','nanping','nantong','nanyang',
'neijiang','ningbo','ningde','panjin','panzhihua','penglai','pingdingshan',
'pingdu','pinghu','pingliang','pingxiang','pulandian','puning','putian','puyang',
'qiannan','qidong','qingdao','qingyang','qingyuan','qingzhou','qinhuangdao',
'qinzhou','qionghai','qiqihaer','quanzhou','qujing','quzhou','rikaze','rizhao',
'rongcheng','rugao','ruian','rushan','sanmenxia','sanming','sanya','xiamen',
'foushan','shangluo','shangqiu','shangrao','shangyu','shantou','ankang','shaoguan',
'shaoxing','shaoyang','shenyang','shenzhen','shihezi','shijiazhuang','shilin',
'shishi','shiyan','shouguang','shuangyashan','shuozhou','shuyang','simao',
'siping','songyuan','suining','suizhou','suzhou','tacheng','taian','taicang',
'taixing','taiyuan','taizhou','taizhou1','tangshan','tengchong','tengzhou',
'tianmen','tianshui','tieling','tongchuan','tongliao','tongling','tonglu','tongren',
'tongxiang','tongzhou','tonghua','tulufan','weifang','weihai','weinan','wendeng',
'wenling','wenzhou','wuhai','wuhan','wuhu','wujiang','wulanhaote','wuwei','wuxi','wuzhou',
'xian','xiangcheng','xiangfan','xianggelila','xiangshan','xiangtan','xiangxiang',
'xianning','xiantao','xianyang','xichang','xingtai','xingyi','xining','xinxiang','xinyang',
'xinyu','xinzhou','suqian','suyu','suzhou1','xuancheng','xuchang','xuzhou','yaan','yanan',
'yanbian','yancheng','yangjiang','yangquan','yangzhou','yanji','tantai','yanzhou','yibin',
'yichang','yichun','yichun1','yili','yinchuan','yingkou','yulin1','yulin','yueyang','yongkang',
'yongzhou','yuxi','changchun','zaozhuang','zhangjiajie','zhangjiakou','changsha','changle',
'zhangzhou','zhuhai','zhengzhou','zunyi','fuqing','foshan'] #获取城市名称来爬取选定城市天气
years = ['2011','2012','2013','2014','2015','2016','2017','2018']#爬取的年份
months = ['01','02','03','04','05','06', '07', '08','09','10','11','12']#爬取的月份 if __name__ == '__main__':#主函数
# os.chdir() # 设置工作路径
for city in cities:
with open(city + '_weather.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow(['date','weather','temperature_high','temperature_low'])
for year in years:
for month in months:
url = 'http://www.tianqihoubao.com/lishi/'+city+'/month/'+year+month+'.html'
html = get_one_page(url)
content=parse_one_page(html)
writer.writerows(content)
print(city+year+'年'+month+'月'+'数据爬取完毕!')
time.sleep(2)
四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?
爬取的代表性城市的数据很详细,精确到每一天的天气变化,以及通过可视化图可以知道,最高气温与最低气温相差大,昼夜温差大。
2.对本次程序设计任务完成的情况做一个简单的小结。
这段时间通过对爬取中国天气网数据的项目,得到了不少的收获,就比如说懂得了要先将爬出的数据存为CSV格式不然的话运行不出来,再然后获取该页面的url再进行爬取(其中还必须有头文件),先用tr进行爬取,以及enumerate可以返回元素的位置及内容,
关于python的中国历年城市天气信息爬取的更多相关文章
- 中国大学MOOC课程信息爬取与数据存储
版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...
- Python 爬虫练手项目—酒店信息爬取
from bs4 import BeautifulSoup import requests import time import re url = 'http://search.qyer.com/ho ...
- 爬虫-通过本地IP地址从中国天气网爬取当前城市天气情况
1.问题描述 最近在做一个pyqt登录校园网的小项目,想在窗口的状态栏加上当天的天气情况,用爬虫可以很好的解决我的问题. 2.解决思路 考虑到所处位置的不同,需要先获取本地城市地址,然后作为中 ...
- [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息
[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫 版权声明: ...
- 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码
接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ...
- 豆瓣电影信息爬取(json)
豆瓣电影信息爬取(json) # a = "hello world" # 字符串数据类型# b = {"name":"python"} # ...
- Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)
Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...
- Python网页解析库:用requests-html爬取网页
Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...
- Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...
随机推荐
- Selenium之单选框操作
单选框操作: 何为单选框?就是永远只能选中一个选项的意思.一般单选框的图标都是呈圆形的.我们通过selenium可直接定位到被选中的选项上,然后用click方法实现点击. 下面附上一段rb.html代 ...
- 利用Bootstrap搭建网站页面
先来看下页面效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- tensorflow学习笔记——VGGNet
2014年,牛津大学计算机视觉组(Visual Geometry Group)和 Google DeepMind 公司的研究员一起研发了新的深度卷积神经网络:VGGNet ,并取得了ILSVRC201 ...
- 大数据学习笔记——Hadoop高可用完全分布式模式完整部署教程(包含zookeeper)
高可用模式下的Hadoop集群搭建 本篇博客将会在之前写过的Linux的完整部署的基础上进行,暂时不会涉及到伪分布式或者完全分布式模式搭建,由于HA模式涉及到的配置文件较多,维护起来也较为复杂,相信学 ...
- 为什么要使用Unix时间戳
概念: UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始 ...
- python中几种自动微分库
简单介绍下python的几个自动求导工具,tangent.autograd.sympy: 在各种机器学习.深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法.数值微分法.符号微分法.自动微 ...
- Dubbo环境搭建-ZooKeeper注册中心
场景 Dubbo简介与基本概念: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103555224 注: 博客: https:// ...
- ORA-07217 environment variable cannot be evaluated
问题描述:还是rman的问题,一个很沙雕的问题,改了半天,准备是要做数据库的全备,和归档的备份 1.连接rman进行备份,这里要保持数据库为mount状态,因为要对数据库全备 [oracle@orcl ...
- Elasticsearch7.5.0源码编译
环境及工具 JDK12 Gradle5.6.2 GIT 源码及预处理 到github将代码clone下来,可以根据自己的需求来获取版本,例如 git checkout v7.5.0 提前下载gradl ...
- Aery的UE4 C++游戏开发之旅(2)编码规范
目录 C++基础类型规范 命名规范 头文件规范 字符串规范 字符集规范 参考 C++基础类型规范 由于PC.XBOX.PS4等各平台的C++基础类型大小可能不同(实际上绝大部分都是整型类型的大小不同) ...