为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > Python获取网络json数据

Python获取网络json数据

2018-03-12 8页 doc 24KB 31阅读

用户头像

is_668482

暂无简介

举报
Python获取网络json数据Python获取网络json数据 使用 Python 获取中国天气网数据一、中国天气网 API 数据写这个文章的灵感就是因为西安的鬼天气,我突然想去查查西安这几天的天气怎么样,果断就找到了中国天气网。突发奇想,诶,这个网站的天气数据可不可以用 Python 来获取~这个网站是不是有天气数据接口,还是需要来解析返回的网页内容。首先是要知道中国天气网的数据接口,这个貌似很好找,随便 Baidu 了一下就出结果了: 从访问 :81/g/可以根据访问时候的 IP 地址给出所在城市的 ID,这个 ID 不知道 是怎编码的。 利用上面获...
Python获取网络json数据
Python获取网络json数据 使用 Python 获取中国天气网数据一、中国天气网 API 数据写这个文章的灵感就是因为西安的鬼天气,我突然想去查查西安这几天的天气怎么样,果断就找到了中国天气网。突发奇想,诶,这个网站的天气数据可不可以用 Python 来获取~这个网站是不是有天气数据接口,还是需要来解析返回的网页内容。首先是要知道中国天气网的数据接口,这个貌似很好找,随便 Baidu 了一下就出结果了: 从访问 :81/g/可以根据访问时候的 IP 地址给出所在城市的 ID,这个 ID 不知道 是怎编码的。 利用上面获取的编码,访问 就可以获取到天气数 据,这里的 101110101 是西安的城市 ID。可以试下,出来的数据结果列在下面,关于各自代的意思,俄,好简单。看到返回的数据貌似是字典,哎呀可是是字符串,怎么转换字典数据哎。其实这些数据是可以用 Python 的 json 模块解析的。weatherinfo:city:西安 城市名city_en:xian 这是拼音date_y:2012 年 6 月 24 日 这是日期date:week:星期日 这是星期fchh:18cityid:101110101 城市 IDtemp1:24?32? 查询当天的天气temp2:23?26? 这是第二天的temp3:22?25? 下面类推temp4:21?27?temp5:22?27?temp6:23?25?tempF1:75.2?89.6? 是这几天温度的华氏温度tempF2:73.4?78.8?tempF3:71.6?77?tempF4:69.8?80.6?tempF5:71.6?80.6?tempF6:73.4?77?weather1:阴转小雨 是这几天的天气描述weather2:中雨转小雨weather3:小雨weather4:小雨转阴weather5:小雨weather6:小雨转阴img1:2img2:7img3:8img4:7img5:7img6:99img7:7img8:2img9:7img10:99img11:7img12 :2img_single:7img_title1:阴img_title2:小雨img_title3:中雨img_title4:小雨img_title5:小雨img_title6:小雨img_title7:小雨img_title8:阴img_title9:小雨img_title10:小雨img_title11:小雨img_title12:阴img_title_single:小雨这是上面几天所对应的图片 ID,一天对应两个,正好是 12 个,随后一个 img_title_single 估计是单独显示用的天气图标wind1:微风wind2:微风wind3:旋转风小于 3 级wind4:旋转风小于 3 级wind5:旋转风小于 3 级wind6:旋转风小于 3 级fx1:微风fx2:微风fl1:小于 3 级fl2:小于 3级fl3:小于 3 级fl4:小于 3 级fl5:小于 3 级fl6:小于 3 级这是几天的风里描述信息,不知道为啥中间插两个 fx1 和 fx2index:炎热index_d:天气炎热,建议着短衫、短裙、短裤、薄型 T 恤衫、敞领短袖棉衫等清凉夏季服装。index48:暖index48_d:较凉爽,建议着长袖衬衫加单裤等春秋过渡装。年老体弱者宜着针织长袖衬衫、马甲和长裤。index_uv:弱index48_uv:最弱index_xc:不宜index_tr:适宜index_co:较不舒适这是天气描述和穿衣建议,同样还有紫外线(UV)、洗车(XC)、旅游(TR)和感觉吧应该(CO),确实是较不舒适st1:30st2:24st3:22st4:22st5:23st6:20index_cl:较不宜index_ls:不宜index_ag:不易发最后这些东西我也搞不懂是神马二、一个小例子知道了如何获取数据,以及数据返回的信息,那么这个程序应该是很简单就写出来了。但是再写程序之前,我还要规划一下这个程序都包含哪些功能,还有数据怎么组织这些问题。 首先,程序应该可以自动获取到所在城市,并从网上得到天气数据; 第二,还得要能够自己指定城市名称,得到城市 ID 并获取天气数据; 第三,返回的数据要能够以简单易懂的形式从外部访问到; 第四,程序需要能够以一定的格式简单出几天内的天气; 第五,程序要能够接受命令行参数,汇报指定城市的天气。程序需求分析好了,下面就决定下程序的结构: 一个获取城市 ID 的函数 一个获取天气信息的函数 一个以一定格式存储天气数据的类 一个能够简单汇报天气 信息的函数当然程序不能要先执行几个函数才能够输出天气数据,要能够有一个直 接汇报天气的函数,只需要执行类似于 weather.Report这样的代码就能够得到简单 的天气预报,或者直接双击执行程序就能够输出天气信息。一切的准备就绪了,开 始写程序。首先导入一下 必须的模块import sys urllib2 json codecs timesys 模块用来 获取命令行参数,用来获取城市名,也许可以一次获取很多城市名urllib2 模块用来 访问网络,json 用来解析返回数据codecs 模块用来打开城市编码文件time 模块只 用来是程序暂停几秒,然后再继续下面定义获取城市 ID 的函数这个 baidu 的编辑 器到底该怎样贴代码,这缩进虽然都对,但是看着好难看~def get_cityidcity None:if city None:id_url :81/g/id_data urllib2.urlopenid_urlcity_id id_data.readline.split1.split1else:idfile opencity_id.txt rfor line in idfile:line line.decodegbk.encodeutf-8if city in line:city_id line.split0breakelse:city_id Noneif city_id None:raise ValueErrorCity Name Incorrectreturn city_id这段代码可以实现自 动获取城市 ID 的功能,这时候输入 city 为 None;如果输入了 city 字符串,那 么函数就会进入 city_id.txt 这个文件去找对应的城市编码。city_id.txt 这个文件是 GBK 编码的,所以在查找之前需要进行编码转换。其中 :81/g/的 返回结果为“var ip61.150.43.40varid101110101iftypeofid_callbackundefinedid_callback”没有端段的引 号。先对这个字符串使分割,得到第二个元素为var id101110101,接下来使用分割, 得到的第二个元素就是城市 ID 了。city_id.txt 文件中每一行为一个城市,存储格 式为 101110101西安。下面定义获取天气的函数def get_weathercity_id:ids strcity_idbase_url :data_return urllib2.urlopencity_urlexcept urllib2.URLError:raise ValueErrorCity ID Not Correctweather_data i for i in data_returndata json.loadsweather_data0v Weatherdatareturn v这个函数接受 city_id 作为字符串参 数,以免发生意外就在函数的第一行做了强制类型转换。然后就是常见的求的完整 的 URL,再使用 urllib2 进行访问,获取返回结果了。这个函数的返回就是天气网 返回的完整的数据,这些数据将会在天气数据类的 init 函数中做解析。下面就是天 气数据类的定义class Weatherobject:def __init__self data:data dataweatherinfoself.city datacityself.id datacityidself.date .joindatadate_y dataweekt1 .joindatatemp1 dataweather1t2 .joindatatemp2 dataweather2t3 .joindatatemp3 dataweather3t4 .joindatatemp4 dataweather4t5 .joindatatemp5 dataweather5t6 .joindatatemp6 dataweather6self.weather t1 t2 t3 t4 t5 t6self.suggest dataindex_dself.original datadef reportself:days u今天 u明天 u后天print print self.city self.dateprint -26for i in range3:print daysi u: self.weatheriprint -26print self.suggest给这个类起个名字叫 Weather,它的父类是 python 所以类的父类 object。然后定义__init__函数,这个函 数是在该类实例化的时候由 python 自动调用的,用来初始化一些变量,我就用这 个函数来解析传递进来的天气数据。__init__函数接受两个参数,一个是 self,一个 是 data,类函数至少需要一个参数为 self,为解释器自动传递的。也就是说在 调用类方法函数的时候,不用指定任何参数解释器自动的把调用函数的类实例名称 作为第一个参数 self 传递进去。所以在定义类方法的时候至少要指定一个参数为 self,无论在函数中到底用不用它。另外,如果需要函数内的变量在整个类范围内都 能够被访问,就需要写成 self.XXX的样子,这其实是类属性。否则的话定义的变量 只是在函数内起作用。根据上一篇文章的描述,不难找出如何从那么一堆数据中提 取出需要的数据,无非就是写字符串处理。同时还定义了一个 report 作为类方法, 用来简单汇报一些天气信息。这样在程序的 Report 函数中就可以不用再编写冗长 的输出格式代码了。当然可以改汇报的天数,只需要将 for i in range3:中的 3 改成 其他数就可以了,当然同时还得在 days 列表中添加以后几天的描述,比如大后天, 大大后天,大大大后天……下面定义的是程序的 Report 函数def ReportcityLOCAL:if city LOCAL:city_id get_cityidweather_data get_weathercity_idweather_data.reportelse:city city.decodegbk.encodeutf-8city_id get_cityidcityweather_data get_weathercity_idweather_data.report这个函数其实就是 一个程序集,将上面定义的函数组织起来。函数接受城市名作为参数,也可以不提 供,这将默认自动获取所在地的天气。首先使用 get_id 函数获取城市 ID,当然输 入参数和没有输入参数是不一样的。接着根据获取的 ID 获得天气数据,实例化一 个 Weather 数据类,也就是提取出一些简单的数据,最后在使用数据类的 Report 方法简单汇报天气。当然最后还要实现能够接受命令行参数,也可以直接双击运行 if __name__ __main__:if lensys.argv 1:import timeReporttime.sleep5sys.exit0else:for city in sys.argv1::Reportcity每一个脚本运行的时候都会产生一个__name__变量,这 个变量在程序被导入的时候为导入程序的名字,如果程序是被直接运行的,不管事 双击还是命令行运行,__name__变量的值就为__main__,这样就保证程序在导入的 时候不会再运行一次产生一些干扰数据。sys.argv 会返回一个列表,为程序执行的 参数,其中第一个参数为程序文件的文件名,也就是说sys.argv 至少有一个值。如 果 sys.argv 的长度为 1 就证明,用户并没有传进任何参数,那么就只要获取所在 地城市 ID,汇报天气就 OK 了。如果 sys.argv 长度不为 1,就说明程序至少获取 到了一个城市名参数,那么就遍历所有的城市名参数,输出对应的天气预报。至此, 整个程序功能都实现了。完整的程序代码如下,没有注释: -- coding:utf-8 --import sysclass Weatherobject:def __init__self data:data dataweatherinfoself.city datacityself.id datacityidself.date .joindatadate_y dataweekt1 .joindatatemp1 dataweather1t2 .joindatatemp2 dataweather2t3 .joindatatemp3 dataweather3t4 .joindatatemp4 dataweather4t5 .joindatatemp5 dataweather5t6 .joindatatemp6 dataweather6self.weather t1 t2 t3 t4 t5 t6self.suggest dataindex_dself.original datadef reportself:days u今天 u明天 u后天print print self.city self.dateprint -26for i in range3:print daysi u: self.weatheriprint -26print self.suggestdef get_cityidcity None:import urllib2if city None:id_url :81/g/id_data urllib2.urlopenid_urlcity_id id_data.readline.split1.split1else:import codecsidfile opencity_id.txt rfor line in idfile:line line.decodegbk.encodeutf-8if city in line:city_id line.split0breakelse:city_id Noneif city_id None:raise ValueErrorCity Name Incorrectreturn city_iddef get_weathercity_id:import jsonimport urllib2ids strcity_idbase_url :data_return urllib2.urlopencity_urlexcept urllib2.URLError:raise ValueErrorCity ID Not Correctweather_data i for i in data_returndata json.loadsweather_data0v Weatherdatareturn vdef ReportcityLOCAL:if city LOCAL:city_id get_cityidweather_data get_weathercity_idweather_data.reportelse:city city.decodegbk.encodeutf-8city_id get_cityidcityweather_data get_weathercity_idweather_data.reportif __name__ __main__:if lensys.argv 1:import timeReporttime.sleep5sys.exit0else:for city in sys.argv1::Reportcity完整的程序和设计 时候不太一太样,我改变了模块的导入位置,也就是说在需要使用到模块的地方导 入,这样能够增加程序的运行速度。
/
本文档为【Python获取网络json数据】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索