python3爬取各类天气信息
作者:京局京段DF11G0025 发布时间:2022-01-18 06:09:35
标签:python,爬取
本来是想从网上找找有没有现成的爬取空气质量状况和天气情况的爬虫程序,结果找了一会儿感觉还是自己写一个吧。
主要是爬取北京包括北京周边省会城市的空气质量数据和天气数据。
过程中出现了一个错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 250。
原来发现是页面的编码是gbk,把语句改成data=urllib.request.urlopen(url).read().decode("gbk")就可以了。
然后我把爬到的数据写到文本文档里了,往后可以导入到excel表中使用。
实验室的电脑不经常开,然后就放到服务器上了,让它自己慢慢一小时爬一次吧~哈哈哈~
后面有一次晚上出现了异常,因为没加入异常处理,所以从零点到早上五点的数据都没爬到。。。
(⊙﹏⊙)然后这次修改就加入了异常处理。如果出现URLError,就一分钟后重试。
代码:
#coding=utf-8
#北京及周边省会城市污染数据、天气数据每小时监测值爬虫程序
import urllib.request
import re
import urllib.error
import time
#模拟成浏览器
headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders=[headers]
#将opener安装为全局
urllib.request.install_opener(opener)
def get_pm25_and_weather(city):
#首先执行获取空气质量数据,返回数据更新时间
data_time=getpm25(city)
#然后将获取到的数据更新时间赋值给获取天气数据函数使用
getweather(city,data_time)
def getpm25(city):
try:
#设置url地址
url="http://pm25.in/"+city
data=urllib.request.urlopen(url).read().decode("utf-8")
print("城市:"+city)
#构建数据更新时间的表达式
data_time='<div class="live_data_time">\s{1,}<p>数据更新时间:(.*?)</p>'
#寻找出数据更新时间
datatime=re.compile(data_time, re.S).findall(data)
print("数据更新时间:"+datatime[0])
#构建数据收集的表达式
data_pm25 = '<div class="span1">\s{1,}<div class="value">\n\s{1,}(.*?)\s{1,}</div>'
data_o3='<div class="span1">\s{1,}<div class ="value">\n\s{1,}(.*?)\s{1,}</div>'
#寻找出所有的监测值
pm25list = re.compile(data_pm25, re.S).findall(data)
o3list=re.compile(data_o3, re.S).findall(data)
#将臭氧每小时的值插入到原列表中
pm25list.append(o3list[0])
print("AQI指数,PM2.5,PM10,CO,NO2,SO2,O3:(单位:μg/m3,CO为mg/m3)")
print(pm25list)
#将获取到的值写入文件中
writefiles_pm25(city,datatime,pm25list)
#返回数据更新时间值
return datatime
except urllib.error.URLError as e:
print("出现URLERROR!一分钟后重试……")
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
time.sleep(60)
#出现异常则过一段时间重新执行此部分
getpm25(city)
except Exception as e:
print("出现EXCEPTION!十秒钟后重试……")
print("Exception:"+str(e))
time.sleep(10)
# 出现异常则过一段时间重新执行此部分
getpm25(city)
def writefiles_pm25(filename,datatime,pm25list):
#将获取的数据写入文件中,数据分别为时间,AQI指数,PM2.5,PM10,CO,NO2,SO2,O3。(单位:μg/m3,CO为mg/m3)
f = open("D:\Python\Python35\myweb\data_pm25\data_pm25_"+filename+".txt", "a")
f.write(datatime[0])
f.write(",")
for pm25 in pm25list:
f.write(str(pm25))
f.write(",")
f.write("\n")
print("该条空气质量数据已添加到文件中!")
f.close()
def getweather(city,datatime):
try:
#构建url
url="http://"+city+".tianqi.com/"
data=urllib.request.urlopen(url).read().decode("gbk")
#构建数据收集的表达式
data_weather = '<li class="cDRed">(.*?)</li>'
data_wind='<li style="height:18px;overflow:hidden">(.*?)</li>'
data_temperature='<div id="rettemp"><strong>(.*?)°'
data_humidity='</strong><span>相对湿度:(.*?)</span>'
#寻找出所有的监测值
weatherlist = re.compile(data_weather, re.S).findall(data)
windlist=re.compile(data_wind, re.S).findall(data)
temperaturelist = re.compile(data_temperature, re.S).findall(data)
humiditylist = re.compile(data_humidity, re.S).findall(data)
#将其他值插入到天气列表中
weatherlist.append(windlist[0])
weatherlist.append(temperaturelist[0])
weatherlist.append(humiditylist[0])
print("天气状况,风向风速,实时温度,相对湿度:")
print(weatherlist)
#将获取到的值写入文件中
writefiles_weather(city,datatime,weatherlist)
except urllib.error.URLError as e:
print("出现URLERROR!一分钟后重试……")
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
time.sleep(60)
# 出现异常则过一段时间重新执行此部分
getweather(city,datatime)
except Exception as e:
print("出现EXCEPTION!十秒钟后重试……")
print("Exception:"+str(e))
time.sleep(10)
# 出现异常则过一段时间重新执行此部分
getweather(city, datatime)
def writefiles_weather(filename,datatime,weatherlist):
#将获取的数据写入文件中,数据分别为时间,天气状况,风向风速,实时温度,相对湿度。
f = open("D:\Python\Python35\myweb\data_weather\data_weather_"+filename+".txt", "a")
f.write(datatime[0])
f.write(",")
for weather in weatherlist:
f.write(str(weather))
f.write(",")
f.write("\n")
print("该条天气数据已添加到文件中!")
f.close()
#退出循环可用Ctrl+C键
while True:
print("开始工作!")
get_pm25_and_weather("beijing")
get_pm25_and_weather("tianjin")
get_pm25_and_weather("shijiazhuang")
get_pm25_and_weather("taiyuan")
get_pm25_and_weather("jinan")
get_pm25_and_weather("shenyang")
get_pm25_and_weather("huhehaote")
get_pm25_and_weather("zhengzhou")
#每一小时执行一次
print("休息中……")
print("\n")
time.sleep(3600)
运行状态图:
更多内容请参考专题《python爬取功能汇总》进行学习。
来源:http://blog.csdn.net/u013063099/article/details/72845099
0
投稿
猜你喜欢
- uni-simple-router专为uniapp打造的路由器,和uniapp深度集成通配小程序、App和H5端H5能完全使用vue-rou
- Function Moneynm(n,m) &
- asp按关键字查询XML的问题 '-------------------------------------------------
- 平常我们使用js代码获取的时间都是客户端的时间,那么有什么办法在浏览器中显示的是服务器断的时间吗?请看下面代码:<span id=&q
- 前言编写条件分支代码是编码过程中不可或缺的一部分。如果用道路来做比喻,现实世界中的代码从来都不是一条笔直的高速公路,而更像是由无数个岔路口组
- 之前有写过一篇浏览器的tab设计,这回说说网站的tab设计。一说到tab很自然地就想到了导航、信息架构。随着网站信息结构的复杂化,选择tab
- 如何让用户也能修改密码? 好了,照下面添加到你要添加的地方去:<%id = Request(&qu
- 前言matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包。在使用Python matplotlib库绘
- 刚开始时,这个表的字段很少(10个以内),前开发者把这个表的所有存储过程与触发器以及表函数全是写死了。用户每添加一些字段,都需要手动去更改这
- 关于本文:本着互联网共享主义精神,特写此文献给建站新手,授人以鱼,不如授人以渔,本文所讲的只是方法和原理,希望大家看完此文,能够从中得到些帮
- CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理技
- 前言最近因为工作需要要使用PHP 7,所以从网上找教程进行安装, 结果编译没问题, 安装的时候报了错误。错误如下cp -pR -f phar
- 一.概念简介 脚本:script是使用一种特定的描述性语言,依据一定的格式编写的可执行文件,又称作宏或批处理文件。 二.背景 近来在Wind
- 1.新建四个层,放入相应图片,模特层的z-index值设为0。2.把第一个层移到模特身上,找出衣服刚好穿上时层的top和left值,记下来,
- 本文介绍了一些JavaScript常用到得表单验证函数,方便大家使用。 判断是否为整数,是则返回true,否则返回falsefun
- 本文实例讲述了python循环监控远程端口的方法。分享给大家供大家参考。具体如下:在ip.txt中每行一个ip地址和端口号,代码可循环监控这
- 在日常的前端开发工作中,我们会经常的与HTML、javascript、css等语言打交道,和一门真正的语言一样,计算机语言也有它的字母表、语
- 类:在HTML中当表现class属性的时候,人们可以用点(.)号来作为~=号的一个替代选择,所以div.value等同于div[class~
- 首先要解释一下:“极致之美”不是说月儿的这篇文章,因为本人还没有自大到这种程度:P,它形容的是Lisp和javascript结合的优美形态。
- 使用 NetBox 可以方便的将 asp 应用编译成为独立运行的执行程序,完全摆脱 iis 的束缚,在几乎所有的 Windows