关于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.'抓取失 ...
随机推荐
- 使用aop切面编写日志模块
我们先自定义一个注解(一个有关自定义注解的LJ文章 https://www.cnblogs.com/guomie/p/10824973.html) /** * * 自定义日志注解 * Retentio ...
- 2019年Spring核心知识点整理,看看你掌握了多少?
前言 如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,在这里总结一下,理顺头绪. Spring 概述 Spr ...
- Unity中文API参考手册
转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6835582.html Unity5中文脚本手册 网页版 Unity API 执行顺序: Unity5中 ...
- NodeJS2-6环境&调试----debug
13_debug.js //测试的脚本 function test1() { const a = parseInt(Math.random() * 10); const b = parseInt(Ma ...
- 2016/10/13 Oracle COALESCE()
语法:COALESCE(s1,s2,...,sn),n>=2,此表达式的功能为返回第一个不为空的表达式,如果都为空则返回空值. 现有表tb_a: 实例1:在tb_a表中给sname列为空的人员设 ...
- Logstash组件详解(input、codec、filter、output)
logstash组件详解 logstash的概念及特点. 概念:logstash是一个数据采集.加工处理以及传输(输出)的工具. 特点: - 所有类型的数据集中处理 - 不同模式和格式数据的正常化 - ...
- TP5中find_in_set的用法
TP5.1.22版本 $id=4; Db::name('menu')->where('FIND_IN_SET(:id,pid_all)',['id' => $id])->update ...
- [追热点]了解 Cloud Native 云原生
起源和发展 Pivotal 是云原生应用的提出者,并推出了 Pivotal Cloud Foundry 云原生应用平台和 Spring 开源 Java 开发框架,成为云原生应用架构中先驱者和探路者. ...
- HTTP_header安全选项(浅谈)
HTTP报文头-安全问题 Mirror王宇阳 2019-10-01 参考:MDN技术文档:<http头安全相关的选项_by`myh0st> 认识HTTP协议 https://www.cnb ...
- IT兄弟连 HTML5教程 DIV+CSS网页标准化布局的优势
标准的网页都需要对内容进行布局,以前都是采用表格的定位技术,从2005年开始逐步转向DIV+CSS的布局方式,目前绝大多数的网站都是采用这种布局方式.使用DIV+CSS对网站进行布局符合W3C标准,采 ...