一、主题式网络爬虫设计方案(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的中国历年城市天气信息爬取的更多相关文章

  1. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  2. Python 爬虫练手项目—酒店信息爬取

    from bs4 import BeautifulSoup import requests import time import re url = 'http://search.qyer.com/ho ...

  3. 爬虫-通过本地IP地址从中国天气网爬取当前城市天气情况

    1.问题描述 ​ 最近在做一个pyqt登录校园网的小项目,想在窗口的状态栏加上当天的天气情况,用爬虫可以很好的解决我的问题. 2.解决思路 ​ 考虑到所处位置的不同,需要先获取本地城市地址,然后作为中 ...

  4. [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息

    [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫   版权声明: ...

  5. 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码

    接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ...

  6. 豆瓣电影信息爬取(json)

    豆瓣电影信息爬取(json) # a = "hello world" # 字符串数据类型# b = {"name":"python"} # ...

  7. Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)

    Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...

  8. Python网页解析库:用requests-html爬取网页

    Python网页解析库:用requests-html爬取网页 1. 开始 Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等.在网上玩爬虫的文章通常都是 ...

  9. Python使用urllib,urllib3,requests库+beautifulsoup爬取网页

    Python使用urllib/urllib3/requests库+beautifulsoup爬取网页 urllib urllib3 requests 笔者在爬取时遇到的问题 1.结果不全 2.'抓取失 ...

随机推荐

  1. 云服务器+域名+hexo 搭建博客

    1 阿里云服务器安全组规则中启用80,4000,22端口, 记得出方向也要设置,否则... 2 域名指向服务器ip 3 安装git yum install git 4 安装node.js 下载地址为: ...

  2. 基于 .NET Core 的简单文件服务器

    Netnr.FileServer 基于 .NET Core 的简单文件服务器,数据库为SQLite 源码 https://github.com/netnr/blog https://gitee.com ...

  3. Python利用PyExecJS库执行JS函数

      在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的.针对这个问题,现在有 ...

  4. 分享一个mysql服务启动与关闭的bat文件

    有时候打开数据库可视化工具(sqlyog.navicat)连接数据库时,会出现以下报错信息. 大家都知道是数据库的服务没有启动. 所以我想给大家分享一个bat文件可供快速启动mysql的数据库的服务, ...

  5. Unity学习路线

    转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/7068615.html 1.Unity下载安装和破解方法: http://blog.sina.com.cn ...

  6. 学习python这么久,有没有考虑发布一个属于自己的模块?

    ​ 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而这个过程就是 打包. 打包,就是 ...

  7. 对JDK动态代理的模拟实现

    对JDK动态代理的模拟 动态代理在JDK中的实现: IProducer proxyProduec = (IProducer)Proxy.newProxyInstance(producer.getCla ...

  8. 「STM32 」IIC通讯原理及其实验

    I2C两线式串行总线通讯协议,它是由飞利浦开发的,主要用于连接微控制器及其外围设备之间,它是由数据线SDA和信号线SCL构成的,可发送和接收数据即在MUC和I2C设备之间,I2C和I2C之间进行全双工 ...

  9. WebAPI接口测试数据库操作

    通常我们是不建议直接查看数据库内容来检查功能的,但是在没有外部接口或者图形界面验证的情况下,只能通过查询数据库来验证. 比如我们手工需要从界面上添加一万条数据,估计要花好几天时间,显然不能手工去操作. ...

  10. 看懂 游戏《Minecraft》的崩溃报告 服务端/客户端

    如何看懂Minecraft报错的关键信息. 让你如何看懂Minecraft报错 前言 一些俏皮话 寻找崩溃日志 打开崩溃日志 重要的事说三遍 下载文本编辑器 开始分析 深度分析 得出结论 修复报错 解 ...