`
wangdei
  • 浏览: 372982 次
社区版块
存档分类
最新评论

用Python写的抓取天气预报程序

阅读更多

最近用java写网站有点累了,发发一些写于一年前的python代码,一直没有用在实际系统中。不知道针对现在的天气预报网站是不是有效,不过对各位应该又很大的参考价值.

使用BeautifulSoup做HTML分析。

抓取最近的5天数据,并保存到mysql数据库中。

如果出现处理失败,会向指定的邮件地址,发送报警。这是一个比较完善的天气预报抓取程序

  •   
  • #! /usr/bin/env python   
  • # -*- coding: utf-8 -*-   
  •   
  • """  
  • todo :设置一个字段表示,是否成功更新,一旦成功则记录ID,系统运行结束,进行update。否则发送短信。保证只发送一次  
  • """   
  • import  os,urllib2,re,MySQLdb,datetime,time,smtplib   
  • from  BeautifulSoup  import  BeautifulSoup   
  • from  StringIO  import  StringIO   
  • from  email.mime.text  import  MIMEText   
  •   
  • USER_AGENT =  '  Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1'   
  • BASE_URL_BEGIN=  'http://www.weather.com.cn/html/weather/'   
  • BASE_URL_END =  '.shtml'   
  • conn = MySQLdb.connect(host= "localhost" , user= "fun" , passwd= "fun" , db= "fun" ,use_unicode= 1 , charset= 'utf8' )   
  •   
  • #Mail 接收方邮件   
  • mailto_list=[ "ealpha.shi@mobimtech.com" ]   
  • #SMTP 服务器,用户名、口令以及邮箱的后缀   
  • mail_host= "imichat.com"   
  • mail_user= "imichat"   
  • mail_pass= "imichat"   
  • mail_postfix= "imichat.com"     
  •   
  • #失败的WID,记录用来判断,是否发送邮件   
  • faultwid = []   
  • #失败重试次数   
  • dotime =  0      
  •   
  • def  send_mail(to_list,sub,content):   
  •      '' '''  
  •     to_list:发给谁  
  •     sub:主题  
  •     content:内容  
  •     send_mail("aaa@126.com","sub","content")  
  •     '''   
  •     me=mail_user+ "<" +mail_user+ "@" +mail_postfix+ ">"   
  •     msg = MIMEText(content)   
  •     msg[ 'Subject' ] = sub   
  •     msg[ 'From' ] = me   
  •     msg[ 'To' ] =  ";" .join(to_list)   
  •      try :   
  •         s = smtplib.SMTP()   
  •         s.connect(mail_host)   
  •         s.login(mail_user,mail_pass)   
  •         s.sendmail(me, to_list, msg.as_string())   
  •         s.close()   
  •          return   True   
  •      except  Exception, e:   
  •          print  str(e)   
  •          return   False   
  •   
  • def  getFiveDayWeather(wid,pageid,agent=USER_AGENT):   
  •      """  
  •     将需要的数据表格从整个网页取出来  
  •     """   
  •     url = BASE_URL_BEGIN + pageid + BASE_URL_END   
  •   
  •      #print '*************************'   
  •      #print url   
  •   
  •     request = urllib2.Request(url)   
  •     request.add_header( 'User-Agent' , agent)   
  •     opener = urllib2.build_opener()   
  •     allhtml = StringIO(str((opener.open(request)).read()))   
  •     soup = BeautifulSoup(allhtml, fromEncoding= "utf-8" )   
  •   
  •     html = soup.find( 'div' , id= 'dd_0' ).parent.contents    
  •   
  •     getWeatherList(wid,html)   
  •   
  •      return  html   
  •   
  • def  getWeatherList(wid,html):   
  •      """  
  •     取得最后发布时间,已经5天数据  
  •     """   
  •     soup1 = BeautifulSoup(str(html))   
  •     time = soup1.find( 'h2' )   
  •     update_time =  ''   
  •      for  t  in  time:   
  •         update_time = t   
  •      #print '\r'   
  •      #print update_time   
  •      #print '\r'   
  •     html2 = soup1.findAll( 'div' , {  "class"  :  "fut_weatherbox"  })   
  •     dayid =  0   
  •      for  dayweather  in  html2:   
  •         dayid +=  1   
  •         getOneDayWeather(wid,dayid,update_time,dayweather)   
  •      pass   
  •   
  • def  getOneDayWeather(wid,dayid,update_time,html):   
  •      """  
  •     分析一天的天气预报信息  
  •     """   
  •     soup = BeautifulSoup(StringIO(str(html)), fromEncoding= "UTF-8" )   
  •     day  = soup.findAll( 'h3' )   
  •     imgs = soup.findAll( 'img' )   
  •     t00  = soup.findAll( 'h4' , {  "class"  :  "temp00_dn"  })   
  •     t01  = soup.findAll( 'h4' , {  "class"  :  "temp01_dn"  })   
  •     t02  = soup.findAll( 'h4' , {  "class"  :  "temp02_dn"  })   
  •     t03  = soup.findAll( 'h4' , {  "class"  :  "temp03_dn"  })   
  •      #print '----------------------'   
  •     soup_h3 = BeautifulSoup(StringIO(str(day)), fromEncoding= "UTF-8" )   
  •     day_value = soup_h3.h3.renderContents()   
  •   
  •      #for img in imgs:  为了确定值,不使用循环   
  •     soup_img = BeautifulSoup(StringIO(str(imgs[ 0 ])), fromEncoding= "UTF-8" )   
  •     imgsrc = soup_img.first( 'img' )[ 'src' ]   
  •     d_pic_value =  imgsrc.split( '/' )[- 1 ].split( '.' )[- 2 ]   
  •   
  •     soup_img = BeautifulSoup(StringIO(str(imgs[ 1 ])), fromEncoding= "UTF-8" )   
  •     imgsrc = soup_img.first( 'img' )[ 'src' ]   
  •     n_pic_value = imgsrc.split( '/' )[- 1 ].split( '.' )[- 2 ]   
  •   
  •     soup_t00 = BeautifulSoup(StringIO(str(t00)), fromEncoding= "UTF-8" )   
  •     weather_value =  soup_t00.h4.renderContents()   
  •   
  •     soup_t01 = BeautifulSoup(StringIO(str(t01)), fromEncoding= "UTF-8" )   
  •     max_temp = soup_t01.h4.renderContents()   
  •   
  •     soup_t02 = BeautifulSoup(StringIO(str(t02)), fromEncoding= "UTF-8" )   
  •     min_temp = soup_t02.h4.renderContents()   
  •   
  •     soup_t03 = BeautifulSoup(StringIO(str(t03)), fromEncoding= "UTF-8" )   
  •     wind =  soup_t03.h4.renderContents()   
  •   
  •     insertDB(wid,dayid,update_time,day_value,d_pic_value,n_pic_value,weather_value,max_temp,min_temp,wind )   
  •   
  • def  insertDB(wid,dayid,update_time,day_value,d_pic_value,n_pic_value,weather_value,max_temp,min_temp,wind ):   
  •      """  
  •     插入数据库,此处要修改,5天数据一次commit(),异常rollback()  
  •     """   
  •     cursor_uodate=conn.cursor()   
  •     sql= "INSERT INTO weatherdetail( wid, dayid, lastupdate, currdate, dpic, npic,weather, maxtemp, mintemp, wind) VALUES( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"   
  •     param = (wid,dayid,update_time ,day_value,d_pic_value,n_pic_value,weather_value,max_temp,min_temp,wind)   
  •      #print param   
  •     n=cursor_uodate.execute(sql,param)   
  •     conn.commit()   
  •      #print n   
  •   
  • def  sendMonitor():   
  •      """  
  •     处理失败,发送报警邮件或短信  
  •     """   
  •      if  len(faultwid) <>  0  :   
  •   
  •          if  send_mail(mailto_list, "Error: Get Weather Error " +str(datetime.datetime.now()),str(faultwid)):   
  •              print   "监控邮件发送成功."   
  •          else :   
  •              print   "监控邮件发送失败."   
  •      pass   
  •   
  • def  doworking(dotime,wid,pageid):   
  •      """  
  •     业务处理入口  
  •     """   
  •      try :   
  •         getFiveDayWeather(wid,pageid)   
  •      except  (NameError,Exception),e:   
  •          print   "has one error on %s %s , then do it again , waiting five secs."  % (wid,pageid)   
  •         time.sleep( 5 )   
  •          if  dotime <  3  :   
  •             doworking(dotime +  1 ,wid,pageid)   
  •          else :   
  •             faultwid.append(wid)   
  •          pass     
  •   
  • if  __name__ ==  "__main__" :   
  •      """  
  •     入口函数  
  •     """     
  •   
  •     starttime = datetime.datetime.now()   
  •   
  •      print   "Start." +str(starttime)   
  •     cursor = conn.cursor()   
  •     cursor.execute( "SELECT id,weather_com_cn_pageid FROM weather" )   
  •     result = cursor.fetchall()   
  •      for  record  in  result:   
  •          # 将 dotime 恢复到 0 ,代表本次请求首次执行   
  •         doworking( 0 ,str(record[ 0 ]),record[ 1 ])   
  •          #time.sleep(2)   
  •   
  •      print   '\r'   
  •     endtime = datetime.datetime.now()   
  •      print   "End." +str(endtime)   
  •      print   "-------------------------------------------------"   
  •     sendMonitor()   
  •      print  (endtime - starttime).seconde   
  • 3
    1
    分享到:
    评论

    相关推荐

      python抓取天气并分析 实例源码

      这是一个用Python编写抓取天气预报的代码示例,用python写天气查询软件程序很简单。这段代码可以获取当地的天气和、任意城市的天气预报,原理是根据url找到网站截取相应的数据展现。 python抓取广州天气并分析 实例...

      Python爬取图片 天气预报

      在这个主题中,“Python爬取图片 天气预报”涉及到利用Python编写爬虫程序来抓取网络上的天气预报图片。这样的任务通常用于自动收集天气信息,构建个人化的天气预报系统,或者进行数据分析。以下是一些关于这个话题...

      抓取腾讯首页天气预报.rar

      标题中的“抓取腾讯首页天气预报.rar”表明这个压缩包包含的是关于如何抓取腾讯网站首页面天气预报信息的相关资源。这通常涉及到网络爬虫技术,网页解析以及可能的JavaScript处理,因为天气预报数据可能在动态加载的...

      天气预报的release程序以及天气代码

      同时,“我写的一个获取天气的类”说明程序中包含了一个自定义的类,该类负责从网络或者其他数据源抓取天气数据。在编程中,类是一种数据结构,它封装了相关数据和操作这些数据的方法,这里用于获取天气信息,可能是...

      Python3爬虫教程之利用Python实现发送天气预报邮件

      具体步骤包括:选择合适的网站作为数据源、编写爬虫程序抓取天气预报数据、配置SMTP服务器以及编写邮件发送脚本。 #### 二、爬虫技术基础 1. **爬虫原理**:爬虫是一种自动抓取网页数据的程序,通常通过HTTP请求与...

      Python3抓取并分析天气数据-,学习代码.pdf

      通过以上知识点的学习,不仅可以掌握如何使用Python抓取并分析天气数据,还能进一步了解如何进行数据分析与可视化,以及如何将这些技能应用于实际项目中。这不仅有助于提升个人的技术水平,也为日后从事相关领域的...

      Python网络爬虫程序技术--项目2爬取天气预报数据.zip

      本项目聚焦于使用Python语言来编写网络爬虫,旨在教会读者如何有效地从网上抓取天气预报数据。在这个过程中,我们将探讨Python的几个核心库,如BeautifulSoup、Requests和Scrapy,它们是构建网络爬虫的基础。 首先...

      天气预报抓取

      在中国天气预报网站上抓取天气数据是一项常见的任务,这涉及到网络爬虫技术、数据分析以及可能的API接口利用。以下是一些相关的IT知识点: 1. **网络爬虫**:网络爬虫是自动抓取网页信息的程序,对于天气预报数据的...

      Python天气预报应用的实战指南

      内容概要:本篇内容详述了一个简单的Python天气预报应用程序的设计与搭建步骤,它涵盖了通过网络请求获取气象信息以及用Tkinter制作应用程序界面。本文主要介绍了从请求外部API以提取指定城市的实时天气情况到把相关...

      全国天气实时获取程序

      全国天气实时获取程序是一款能够帮助用户获取中国各地最新天气信息的应用。这个程序通过与权威气象数据接口对接,实现了对全国范围内的气象数据进行实时更新和展示。用户可以通过它查询到不同城市的气温、湿度、风向...

      基于Python获取城市近7天天气预报

      标签“Python 获取 城市 天气预报”表明这个任务的核心技术是使用Python进行网络数据抓取,特别是针对特定城市(黄石市)的天气预报信息。 以下是这个Python程序的主要步骤和涉及的知识点: 1. **发送HTTP请求**:...

      实用python天气查询软件

      在本文中,我们将深入探讨如何利用Python来抓取并解析天气预报信息,以及实现一个简单的天气查询应用。 首先,我们要了解获取天气预报的基本原理。通常,天气信息由气象部门或专业服务提供商通过API(应用程序接口...

      Pyqt5(Eric6)抓取天气用PPT结合四川地图演播

      总的来说,这个项目综合了Python GUI编程、网络编程、文件操作、VBA宏编程以及可能的GIS基础知识,提供了一个完整的解决方案来展示和更新四川地区的天气预报。这样的设计既具有实用性,也展示了多种技术的融合应用。

      Python爬取国外天气预报网站的方法

      本文将探讨如何使用Python来爬取国外天气预报网站的信息,以获取全球各地的气象数据。 首先,我们需要导入一些必要的Python库,如`httplib`用于HTTP连接,`urllib2`用于打开和读取网页,`time`用于控制程序运行节奏...

      Python-新版中国天气爬虫获取最新天气以及天气日历数据ConkyLinux

      结合标签“Python开发-Web爬虫”,我们可以推断这个项目是用Python进行Web开发的一个实例,特别是使用了网络爬虫技术来抓取互联网上的天气数据。Python因其简洁的语法和丰富的库(如requests用于HTTP请求,...

      【python网络爬虫】-爬取天气数据

      Python爬虫抓取天气信息问题:获取苏州8-15天的天气信息,包含: 日期、天气、温度、风力等信息,然后将数据存入一个文档中,网址为:http://www.weather.com.cn/weather/101190401.shtml。1. 问题分析首先我们进入...

      默飞天气预报采集程序

      【标题】"默飞天气预报采集程序"是一个用于获取天气预报数据的应用程序,可能是通过编程方式从各种天气预报API或网站抓取数据。这个程序可能适用于个人或企业,帮助他们集成到自己的网页或其他应用程序中,提供实时...

      weather-app:一个用python编写的天气应用程序,用于从网站检索天气数据

      这个应用可能包含了用户界面,允许用户输入城市名或地理位置来获取相关的天气预报。Python是一种广泛使用的高级编程语言,尤其适合进行网络数据抓取和处理,因为它有丰富的库支持,如BeautifulSoup、Requests等。 ...

      python新手级项目爬虫+PyQt5简易天气预报系统源码.zip

      该项目是一个适合Python初学者的实践教程,主要涵盖了爬虫技术和PyQt5 GUI应用的开发,构建了一个简单的天气预报系统。让我们深入探讨一下其中涉及的知识点。 首先,我们要了解Python爬虫的基本概念。爬虫是一种...

    Global site tag (gtag.js) - Google Analytics