关于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 csvfrom 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 requestsfrom 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的中国历年城市天气信息爬取 的全部内容, 来源链接: utcz.com/z/387040.html