利用Python实现天气预报实践报告_第1页
利用Python实现天气预报实践报告_第2页
利用Python实现天气预报实践报告_第3页
利用Python实现天气预报实践报告_第4页
利用Python实现天气预报实践报告_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成果形式:利用Python实现天气预报实践报告成果名称:利用Python实现天气预报实践内容随着人工智能和大数据的火热,Python成为了大家学习的一门语言,今年我所在的统院的短学期实践就把Python作为了我们的学习目标。第一次听说Python的时候,感觉这是个非常高大上的计算机语言,应该会难掌握。第一节的时候,实践老师并没有按部就班的开始讲Python知识,而是向我们介绍了Python是一门什么样的语言,并且详细说明了未来学习的这几个礼拜的计划和内容,以及学习Python前需要掌握的数学知识。老师说作为数学类的学生,学习Python会相对简单,因为我们有一定的数学基础,所以当这节课结束之后,我对Python没有之前的忐忑。通过老师对Python的解释,这是一个和C语言有一定相似的计算机语言。正式的第一节课起,每个同学都要带着电脑上课,安装了Python运行软件,但当软件安装完毕,老师给了一个非常简单的程序,在我的电脑上无法运行的时候,我又开始对Python这门语言产生了质疑。带着疑惑,听着老师的讲解,我开始真正走进Python。第一次课下后,实践老师布置了五道课后题,那五道课后题简直和我在学c语言时候老师布置的题一模一样啊,我觉得太简单了,就直接按照c语言写程序那样,写完后直接运行,但结果却不如我意。我拿c语言书上的答案程序与之对照,一点差异也没有,此时我觉得还是Python没有安装好的缘故,我就去请教了Python实践老师,原来虽然c语言的程序语言可以实现题目,但如果在Python软件上实现的话,语句有点繁琐,需要修改。这次的作业做完后,我对Python有了全新的认识。在我看来,Python的设计理念是“简单”、“明确”、“优雅”。相对于其他编程语言来说,Python易于学习,它的着重点放在如何解决问题上,而不是语法和结构。作为一种解释型语言,Python更强调代码的可读性和简洁的语法。采用空格缩进标识代码块,减少毫无用处的大括号,去除句末的分号等,显著提高代码的可读性。不知道这样的认识是否正确,带着疑惑,我们又开始了新的学习。这次的内容就和c语言依旧有很多的相似点。是通过Python进行判断和筛选的项目,老师出了好些题,类似下面这道题。l1=[11,22,33,55,99],l2=[23,22,33,44]判断l1里面存在,l2里面不存在的元素,打印输出.然后判断l2里面存在,l1里面不存在的元素,打印输出.l1=[11,22,33,55,99]

l2=[23,22,33,44]

s=[]

v=[]

foriinl1:

ifinotinl2:

s.append(i)

print(s)

foriinl2:

ifinotinl1:

v.append(i)

print(v)运行结果C:\ProgramData\Anaconda3\python.exeC:/Users/Administrator/PycharmProjects/day1/28.1.py[11,55,99][23,44]这是让我觉得很神奇的地方,里面运用的for语言,if语言在c语言里面的用法不同,产生的效果和目的也不同,但我觉得Python的程序更加简单易懂。除此之外还有一道题也很典型。9*9乘法表foriinrange(1,10):

string=""

forjinrange(1,i+1):

string+=str(j)+"*"+str(i)+"="+str(i*j)+""

print(string)运行结果C:\ProgramData\Anaconda3\python.exeC:/Users/Administrator/PycharmProjects/day1/28.5.py1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81在c语言里面也有这样的一道题,程序如下#include<stdio.h>intmain(){intsum;inti,j;for(i=0;i<10;i++){for(j=0;j<10;j++){if(j<=i)//防止输出两遍{sum=i*j;printf("%d*%d=%d\t",i,j,sum);}}printf("\n");}return0;}同样的题目,得到的内容一样,程序的书写方式可以说大相径庭,显然Python用更加简便的程序语言实现了我们要达到的目的。这让我对Python充满了兴趣。接下来学习的利用Python制作网页才是最有意思的,这是我在c语言这门学科里从来没有接触过的。可以说是非常简单非常易操作,只要在Python软件里新建网页类型的文件,按照模板和自己的网页需求,就可以轻松做出来。焱焱焱如下面这个程序,这是当时自己做的一个页面:<!DOCTYPEhtml>

<htmllang="en">

<head>

<metacharset="UTF-8">

<title>西安财经大学登录界面</title>

</head>

<body>

<formname="user"action="#"

method="get">

<tablealign="center">

<tr>

<td>姓名</td>

<td>

<inputtype="text"

name="username"/>

</td>

</tr>

<tr>

<td>学号</td>

<td>

<inputtype="password"/>

</td>

</tr>

<tr>

<td>性别</td>

<td>

<inputtype="radio"name="name"/>男

<inputtype="radio"name="name"checked="checked"/>女

</td>

</tr>

<tr>

<td>学院</td>

<td>

<select>

<option>西安财经大学</option>

<option>西安交通大学</option>

<option>西安工业大学</option>

</select>

<select>

<option>数学</option>

<option>统计</option>

<option>会计</option>

</select>

</td>

</tr>

<tr>

<td>爱好</td>

<td>

<inputtype="checkbox"

name="sport"checked="singsongs"/>唱歌

<inputtype="checkbox"

name="dancing"/>跳舞

<inputtype="checkbox"

name="reading"/>看书

</td>

</tr>

<tr>

<td>邮箱</td>

<td>

<inputtype="text"name="email"/></td>

</tr>

<tr>

<td>上传头像</td>

<td>

<inputtype="file"name="file"/>

</td>

</tr>

<tr>

<td>个人简历</td>

<td>

<textarearows="15"cols="50"></textarea>

</td>

</tr>

<tr>

<td></td>

<td>

<inputtype="button"value="登录"/>

<inputtype="submit"name="tijiao"value="提交"/>

<inputtype="reset"name="quxiao"value="取消"/>

</td>

</tr>

</table>

</form>

</body>

</html>短短几十行简短的文字,并且网页的内容清晰明了,Python的功能真的很强大了。焱焱焱焱焱焱焱焱焱焱焱焱焱焱焱焱焱焱接下来我们又学习了,网页的爬取。也可以说是抓取网页,主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份。有以下基本工作流程:首先选取一部分的种子URL,将这些URL放入待抓取URL队列;取出待抓取URL,解析DNS得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中,并且将这些URL放进已抓取URL队列。分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环…除此之外,还有数据存储以及预处理获得网络排名。搜索引擎通过爬虫爬取到的网页,将数据存入原始页面数据库。其中的页面数据与用户浏览器得到的HTML是完全一样的。搜索引擎蜘蛛在抓取页面时,也做一定的重复内容检测,一旦遇到访问权重很低的网站上有大量抄袭、采集或者复制的内容,很可能就不再爬行。第三步:预处理搜索引擎将爬虫抓取回来的页面,进行各种步骤的预处理。提取文字中文分词消除噪音(比如版权声明文字、导航条、广告等……)索引处理链接关系计算特殊文件处理除了HTML文件外,搜索引擎通常还能抓取和索引以文字为基础的多种文件类型,如PDF、Word、WPS、XLS、PPT、TXT文件等。我们在搜索结果中也经常会看到这些文件类型。但搜索引擎还不能处理图片、视频、Flash这类非文字内容,也不能执行脚本和程序。第四步:提供检索服务,网站排名搜索引擎在对信息进行组织和处理后,为用户提供关键字检索服务,将用户检索相关的信息展示给用户。同时会根据页面的PageRank值(链接的访问量排名)来进行网站排名,这样Rank值高的网站在搜索结果中会排名较前,当然也可以直接使用Money购买搜索引擎网站排名,简单粗暴。从这里开始,我和我的小伙伴就有了通过Python来实现天气预报的可能。但是我们只是初步的想法还有一个大的规划在通过后面几天的学习过程中,我们有了一些更多的了解。获取网页的详细过程,老师都是以程序代码的形式给我们做参考,我们得到了深度的学习,通过几天的作业,第二天的解答,对于获取网页已经熟能生巧了。下面是老师的详细讲解://获取网址defmain(offset):url='/board/4?offset='+str(offset)html=get_one_page(url)foriteminpaser_one_page(html):print(item)write_to_file(item)//把网址变成网页defget_one_page(url):try:response=requests.get(url,headers=headers)ifresponse.status_code==200:returnresponse.textreturnNoneexceptRequestException:returnNone//提取网页的值(爬取网页的值/爬虫)defpaser_one_page(html):pattern=pile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)items=re.findall(pattern,html)foriteminitems:yield{'index':item[0],'image':item[1],'title':item[2],'actor':item[3].strip()[3:],'time':item[4].strip()[5:],'score':item[5]+item[6],}//把你的爬取下来的值放到桌面defwrite_to_file(content):withopen('result.json','a',encoding='utf-8')asf:f.write(json.dumps(content,ensure_ascii=False)+'\n')f.close()这是让我们在接下来很多年的工作中,还有写论文的过程中有优势的,爬取网页信息,在你写论文或者工作中做PPT或者其他用数据来对比时候,如果你没有正确的、官网的数据的话,是很难建立自己的观点的,但当我们学会用爬虫爬取网页,就可以得到他们的数据,得到数据之后,我们就可以用数据进行对比进行解释进行分析,就可以得到比较可靠的数据来支撑你的观点或者结论。所以我和小伙伴在天气预报这个课题中,我们就想好用这个获取网页爬取数据这个镜像的方法,然后对天气预报的这个天气情况以及温度湿度等其他有关天气的信息进行获取。所以,目前为止网络的爬取这一部分,我们已经没有什么问题,但是对于天气的爬虫程序代码来直观的去提醒我们天气预报这个代码还没能实现。首先来到目标数据的网页/weather40d/101280701.shtml我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化。这是因为网页前端使用了JS异步加载的技术,更新时不用加载整个页面,从而提升了网页的加载速度。对于这种非静态页面,我们在请求数据时,就不能简单的通过替换URL来请求不同的页面。着眼点要放在Network,观察整个请求的过程,从中寻找突破口。老规矩按下F12>network,切换下页面,发现多了一些东西,这就是切换月份,浏览器发出的请求,可以很清楚的看到请求头和请求参数。再来看看Response是怎样的吧真是没想到,返回的居然是json格式的天气数据!直接做json反序化就能变成字典的形式,省掉了我们解析html的麻烦呀。既然找到了数据所在的地方,就可以开始尝试构建请求了。构建请求先直接copy上面的RequestURL,试下请求。/calendar_new/2017/101280701_201706.html?_=1495720234075然后发现报错了,先把请求头全部满上怼进去,发现可以正常的响应。但是我们还要分析下到底哪个参数不对出了问题。经过尝试,发现请求头里的Referer的原因,去掉就会报错。这是因为这是浏览器发出请求时,会通过Referer告诉服务器我是从哪个页面链接过来的,有些网站会对这个做验证,主要时为了防止别人盗链的问题。这个中国天气网,就是验证了Referer里的域名是不是自己的,不是的话就会403禁止访问服务器。接下来就要考虑怎么请求不同月份的数据。通过观察URL,发现其实很简单,直接替换年月,就可以循环抓取,得到整年的数据。那中间的101280701是什么意思呢,经过请求不同的城市对比URL,我发现这是表示地理位置的一个数据。前3位表示国家中国,后6位依次表示,省份,城市和区县。修改这里,就能实现对不同城市进行查询了。最后一个参数1495720234075,开始以为是随机数,后来有朋友提醒这是unix时间戳,实际上就算去掉这个,也能正常访问数据,没什么影响。解析数据拿到数据以后,就可以开始解析了。不过这里根本用不上xpath,直接用Json.load(),就能反序列化成json对象,从中取出字典,节省很多麻烦。需要注意的是,返回的40天的天气数据fc40字符串是这样varfc40=[{"blue":"","c1":"","c2":"","cla":"history","date":"20151227","des":"历史均值","fe":"","hgl":"17%","hmax":"17","hmin":"13","hol":"","jq":""

]}前面的字符串需要去掉,才能反序列化,注意这里的json对象实际是个存储字典的list[]。开始想用正则,不过不熟没弄好。后来发现python字符串也能使用这样的语法[a:b]来取出位置a到位置b的字符串,所以就直接用[11:],就能取出fc40后面的字符串,也很方便。保存数据因为数据的量比较大,就采用mongodb来做数据持久化。mongodb我也是才学习,参考了别人的教程,才做好了环境配置,过程打算总结到另一篇,这里就打算不多说了。因为原本的放了天气数据的字典里面有太多没用的数据,我只想提取出我想要的部分,就用了一个小技巧。将想要的数据的key,保存成subkey这个字典,用forin取出subkey中的key,再回到原本的dict中取出对应的值,最后将这些键值对,都存储在一个subdict字典里,就完成了提取出子字典的功能。说起来很麻烦,但是代码却很简单,这可能就是python的魅力吧。subkey={'date','hmax','hmin','hgl','fe','wk','time'}subdict={key:dict[key]forkeyinsubkey}然后我还做了个用中文替换的原来key的功能,只需要稍作修改,forin取出来的是键值对,然后用中文的value,替换英文的key,就ok了。subkey={'date':'日期','hmax':'最高温度','hmin':'最低温度','hgl':'降水概率','fe':'节日','wk':'星期'}subdict={value:dict[key]forkey,valueinsubkey.items()}最后的结果如下图,这是用pycharm上的mongodb可视化插件MongoPlugin看到的,在pycharm>settings>plugins里面可以搜索安装。需要注意的是,默认只显示300条数据。想要看到更多,就在Rowlimit上输入总数就行。Python的代码非常短才30多行,就完成了爬虫的整个流程,请求,解析,保存,一气呵成,可谓是爬虫界的豪杰。#encoding=utf-8importrequestsimportjsonimportpymongoimporttimedefrequest(year,month):url="/calendar_new/"+year+"/101280701_"+year+month+".html?_=1495685758174"headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/50.0.2661.102Safari/537.36","Referer":"/weather40d/101280701.shtml",}returnrequests.get(url,headers=headers)defparse(res):json_str=res.content.decode(encoding='utf-8')[11:]returnjson.loads(json_str)defsave(list):subkey={'date':'日期','hmax':'最高温度','hmin':'最低温度','hgl':'降水概率','fe':'节日','wk':'星期','time':'发布时间'}fordictinlist:subdict={value:dict[key]forkey,valueinsubkey.items()}#提取原字典中部分键值对,并替换key为中文forecast.insert_one(subdict)#插入mongodb数据库if__name__=='__main__':year="2016"month=1client=pymongo.MongoClient('localhost',27017)#连接mongodb,端口27017test=client['test']#创建数据库文件testforecast=test['forecast']#创建表forecastforiinrange(month,13):month=str(i)ifi>9else"0"+str(i)#小于10的月份要补0save(parse(request(year,month)))time.sleep(1)关于这次报告1.前期

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论