本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下。

这次要爬的站点是这个:http://www.weather.com.cn/forecast/

要求是把你所在城市过去一年的历史数据爬出来。

分析网站

首先来到目标数据的网页 http://www.weather.com.cn/weather40d/101280701.shtml

我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化。

这是因为网页前端使用了JS异步加载的技术,更新时不用加载整个页面,从而提升了网页的加载速度。

对于这种非静态页面,我们在请求数据时,就不能简单的通过替换URL来请求不同的页面。

着眼点要放在Network,观察整个请求的过程,从中寻找突破口。

老规矩按下F12 > network,切换下页面,发现多了一些东西,这就是切换月份,浏览器发出的请求,可以很清楚的看到请求头和请求参数。

再来看看Response是怎样的吧

真是没想到,返回的居然是json格式的天气数据!直接做 json 反序化就能变成字典的形式,省掉了我们解析 html 的麻烦呀。既然找到了数据所在的地方,就可以开始尝试构建请求了。

构建请求

先直接copy上面的Request URL,试下请求。http://d1.weather.com.cn/calendar_new/2017/101280701_201706.html?_=1495720234075

然后发现报错了,先把请求头全部满上怼进去,发现可以正常的响应。

但是我们还要分析下到底哪个参数不对出了问题。经过尝试,发现请求头里的Referer的原因,去掉就会报错。

这是因为这是浏览器发出请求时,会通过Referer告诉服务器我是从哪个页面链接过来的,有些网站会对这个做验证,主要时为了防止别人盗链的问题。

这个中国天气网,就是验证了Referer里的域名是不是自己的,不是的话就会403禁止访问服务器。

接下来就要考虑怎么请求不同月份的数据。

通过观察URL,发现其实很简单,直接替换年月,就可以循环抓取,得到整年的数据。

那中间的101280701是什么意思呢,经过请求不同的城市对比URL,我发现这是表示地理位置的一个数据。

前3位表示国家中国,后6位依次表示,省份,城市和区县。修改这里,就能实现对不同城市进行查询了。

最后一个参数1495720234075,开始以为是随机数,后来有朋友提醒这是unix时间戳,实际上就算去掉这个,也能正常访问数据,没什么影响。

解析数据

拿到数据以后,就可以开始解析了。不过这里根本用不上xpath,直接用Json.load(),就能反序列化成json对象,从中取出字典,节省很多麻烦。需要注意的是,返回的40天的天气数据 fc40 字符串是这样

var fc40 = [{"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这个字典,用 for in取出subkey中的key,再回到原本的dict中取出对应的值,最后将这些键值对,都存储在一个subdict字典里,就完成了提取出子字典的功能。说起来很麻烦,但是代码却很简单,这可能就是python的魅力吧。

subkey = {'date', 'hmax', 'hmin', 'hgl', 'fe', 'wk', 'time'}

subdict = {key: dict[key] for key in subkey}

然后我还做了个用中文替换的原来key的功能,只需要稍作修改,for in 取出来的是键值对,然后用中文的value,替换英文的key,就ok了。

subkey = {'date': '日期', 'hmax': '最高温度', 'hmin': '最低温度', 'hgl':

'降水概率', 'fe': '节日', 'wk': '星期'}

subdict = {value: dict[key] for key, value in subkey.items()}

最后的结果如下图,这是用pycharm上的mongodb可视化插件Mongo Plugin看到的,在pycharm>settings>plugins里面可以搜索安装。需要注意的是,默认只显示300条数据。想要看到更多,就在Row limit 上输入总数就行。

Python的代码非常短才30多行,就完成了爬虫的整个流程, 请求,解析,保存,一气呵成,可谓是爬虫界的豪杰。

# encoding=utf-8

import requests

import json

import pymongo

import time

def request(year, month):

url = "http://d1.weather.com.cn/calendar_new/" + year + "/101280701_" + year + month + ".html?_=1495685758174"

headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",

"Referer": "http://www.weather.com.cn/weather40d/101280701.shtml",

}

return requests.get(url, headers=headers)

def parse(res):

json_str = res.content.decode(encoding='utf-8')[11:]

return json.loads(json_str)

def save(list):

subkey = {'date': '日期', 'hmax': '最高温度', 'hmin': '最低温度', 'hgl': '降水概率', 'fe': '节日', 'wk': '星期', 'time': '发布时间'}

for dict in list:

subdict = {value: dict[key] for key, value in subkey.items()} #提取原字典中部分键值对,并替换key为中文

forecast.insert_one(subdict) #插入mongodb数据库

if __name__ == '__main__':

year = "2016"

month = 1

client = pymongo.MongoClient('localhost', 27017) # 连接mongodb,端口27017

test = client['test'] # 创建数据库文件test

forecast = test['forecast'] # 创建表forecast

for i in range(month, 13):

month = str(i) if i > 9 else "0" + str(i) #小于10的月份要补0

save(parse(request(year, month)))

time.sleep(1)

总结

以上就是本文关于Python爬虫天气预报实例详解(小白入门)的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

python编程入门与案例详解pdf-Python爬虫天气预报实例详解(小白入门)相关推荐

  1. python编程入门与案例详解-Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 这次要爬的站点是这个:http://www.weather.com.cn/forecast/ 要求是把你所在城市过去一年的历史数据爬 ...

  2. python爬虫入门实例-Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有 ...

  3. Python编程自动化办公案例(3)

    · 作者简介:一名在校计算机学生.每天分享Python的学习经验.和学习笔记.   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.前几章代码 1.获取到第一题的选项单 ...

  4. 微课|《Python编程基础与案例集锦(中学版)》第5章例题讲解(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 京东图书地址:https://item.jd.com/12571990.html 当当图书地址:h ...

  5. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(3)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-10  把十进制数转换为其他进制形式. 例4-11  验证6174猜想. 例4-12.例4- ...

  6. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(2)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-4 例4-5 例4-6 微课|中学生可以这样学Python(例4.3):百钱买百鸡 例4-7 ...

  7. 微课|《Python编程基础与案例集锦(中学版)》第4章例题讲解(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例4-1 例4-2 例4-3 京东图书地址:https://item.jd.com/1257199 ...

  8. 微课|《Python编程基础与案例集锦(中学版)》第3章例题讲解(2)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例3-6 微课|中学生可以这样学Python(例3.2):今天是今年的第几天 例3-7 例3-8 ...

  9. 微课|《Python编程基础与案例集锦(中学版)》第3章(1)

    适用教材:<Python编程基础与案例集锦(中学版)>,董付国,应根球著,电子工业出版社 例3-1 例3-2 例3-3:微课|中学生可以这样学Python(3.3节):多分支选择结构 例3 ...

最新文章

  1. ERPLAB中文教程:ERPLAB安装与添加通道
  2. Android程序为什么没有退出设计?
  3. Google DeepMind围棋程序AlphaGo的分析
  4. Linux中文件权限的一些知识
  5. gvim同时处理中日韩文
  6. Java Web学习笔记10:Servlet基础
  7. php 不同数据库的调用方法,php连接不同数据库的几种方法
  8. MyBatis的mapper.xml中对于一个传参的多重判断
  9. x/(x+1)=ln(x+1)=x
  10. 大数据可视化平台优点在哪
  11. sqlserver2010教程百度云盘_郝斌SqlServer2005自学全集视频教程
  12. Java监听和发送飞秋群消息
  13. 路由器设置虚拟服务器王者人生,王者人生位置修改 | 手游网游页游攻略大全
  14. appicon一键生成网站
  15. 计算机专业毕业设计选题与方向走势
  16. 三端口 DC-DC 变换器(C 题)-- 2021年全国大学生电子设计竞赛试题
  17. 怎样在网站中添加google统计代码
  18. 高效程序员秘籍(5):让EyeDefender提醒你注意休息,保护视力
  19. html自动调音量,HTML5 音量调节控件
  20. python简单算法题_python - 简单算法题 - 列表偏移

热门文章

  1. [CF314C](Sereja and Subsequences)
  2. AXIS2整合spring需要的jar,以及大部分缺少jar所报的异常
  3. mvc5入门示例博客(有惊喜)
  4. 【设计模式】—— 模板方法Template
  5. js 数组,字符串,JSON,bind, Name
  6. 以下用于数据存储领域的python第三方库是-『爬虫四步走』手把手教你使用Python抓取并存储网页数据!...
  7. python精彩编程200例pdf下载-最经典的25本Python编程开发电子书(附下载地址)!...
  8. 以下用于数据存储领域的python第三方库是-Python数据存储及表示
  9. python手机版安卓-当python遇到Android手机 那么,万物皆可盘
  10. python关闭读写的所有的文件-Python文件操作:文件的打开关闭读取写入