python3爬取各类天气信息

本来是想从网上找找有没有现成的爬取空气质量状况和天气情况的爬虫程序,结果找了一会儿感觉还是自己写一个吧。

主要是爬取北京包括北京周边省会城市的空气质量数据和天气数据。

过程中出现了一个错误: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爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
  • Python使用Selenium+BeautifulSoup爬取淘宝搜索页
  • 使用Python爬取最好大学网大学排名
  • python爬取淘宝商品详情页数据
  • python3爬取淘宝信息代码分析
  • python爬虫爬取某站上海租房图片
  • python爬取拉勾网职位数据的方法
  • Python爬虫爬取一个网页上的图片地址实例代码
  • python正则表达式爬取猫眼电影top100
  • python爬虫爬取淘宝商品信息(selenum+phontomjs)
(0)

相关推荐

  • Python使用Selenium+BeautifulSoup爬取淘宝搜索页

    使用Selenium驱动chrome页面,获得淘宝信息并用BeautifulSoup分析得到结果. 使用Selenium时注意页面的加载判断,以及加载超时的异常处理. import json import re from bs4 import BeautifulSoup from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.com

  • python3爬取淘宝信息代码分析

    # encoding:utf-8 import re # 使用正则 匹配想要的数据 import requests # 使用requests得到网页源码 这个函数是用来得到源码 # 得到主函数传入的链接 def getHtmlText(url): try: # 异常处理 # 得到你传入的URL链接 设置超时时间3秒 r = requests.get(url, timeout=3) # 判断它的http状态码 r.raise_for_status() # 设置它的编码 encoding是设置它的头

  • python正则表达式爬取猫眼电影top100

    用正则表达式爬取猫眼电影top100,具体内容如下 #!/usr/bin/python # -*- coding: utf-8 -*- import json # 快速导入此模块:鼠标先点到要导入的函数处,再Alt + Enter进行选择 from multiprocessing.pool import Pool #引入进程池 import requests import re import csv from requests.exceptions import RequestException

  • python爬虫爬取某站上海租房图片

    对于一个net开发这爬虫真真的以前没有写过.这段时间开始学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup.python 版本:python3.6 ,IDE :pycharm.其实就几行代码,但希望没有开发基础的人也能一下子看明白,所以大神请绕行. 第三方库首先安装 我是用的pycharm所以另为的脚本安装我这就不介绍了. 如上图打开默认设置选择Project Interprecter,双击pip或者点击加

  • python爬取拉勾网职位数据的方法

    今天写的这篇文章是关于python爬虫简单的一个使用,选取的爬取对象是著名的招聘网站--拉钩网,由于和大家的职业息息相关,所以爬取拉钩的数据进行分析,对于职业规划和求职时的信息提供有很大的帮助. 完成的效果 爬取数据只是第一步,怎样使用和分析数据也是一大重点,当然这不是本次博客的目的,由于本次只是一个上手的爬虫程序,所以我们的最终目的只是爬取到拉钩网的职位信息,然后保存到Mysql数据库中.最后中的效果示意图如下: 控制台输入 数据库显示 准备工作 首先需要安装python,这个网上已经有很多的

  • python爬虫爬取淘宝商品信息(selenum+phontomjs)

    本文实例为大家分享了python爬虫爬取淘宝商品的具体代码,供大家参考,具体内容如下 1.需求目标 : 进去淘宝页面,搜索耐克关键词,抓取 商品的标题,链接,价格,城市,旺旺号,付款人数,进去第二层,抓取商品的销售量,款号等. 2.结果展示 3.源代码 # encoding: utf-8 import sys reload(sys) sys.setdefaultencoding('utf-8') import time import pandas as pd time1=time.time()

  • python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解

    这篇博客是自己<数据挖掘与分析>课程讲到正则表达式爬虫的相关内容,主要简单介绍Python正则表达式爬虫,同时讲述常见的正则表达式分析方法,最后通过实例爬取作者的个人博客网站.希望这篇基础文章对您有所帮助,如果文章中存在错误或不足之处,还请海涵.真的太忙了,太长时间没有写博客了,抱歉~ 一.正则表达式 正则表达式(Regular Expression,简称Regex或RE)又称为正规表示法或常规表示法,常常用来检索.替换那些符合某个模式的文本,它首先设定好了一些特殊的字及字符组合,通过组合的&

  • python爬取淘宝商品详情页数据

    在讲爬取淘宝详情页数据之前,先来介绍一款 Chrome 插件:Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容),如下图所示: 当这个插件处于关闭状态时,待爬取的页面显示的数据如下: 当这个插件处于打开状态时,待爬取的页面显示的数据如下:   可以看到,页面上很多数据都不显示了,比如商品价格变成了划线价格,而且累计评论也变成了0,说明这些数据都是动态加载的,以下演示真实价格的找法(评论内容找法类似),首先检查页面元素,然后点击Network选项卡,刷新页面,可

  • 使用Python爬取最好大学网大学排名

    本文实例为大家分享了Python爬取最好大学网大学排名的具体代码,供大家参考,具体内容如下 源代码: #-*-coding:utf-8-*- ''''' Created on 2017年3月17日 @author: lavi ''' import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url) r.raise_for_status r.encodi

  • Python爬虫爬取一个网页上的图片地址实例代码

    本文实例主要是实现爬取一个网页上的图片地址,具体如下. 读取一个网页的源代码: import urllib.request def getHtml(url): html=urllib.request.urlopen(url).read() return html print(getHtml(http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%A3%81%E7%BA%B8&ct=201326592&am

随机推荐