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

本文研究的主要是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爬虫实现网络股票信息爬取的demo
  • Python3多线程爬虫实例讲解代码
  • Python爬虫中urllib库的进阶学习
  • Python爬虫通过替换http request header来欺骗浏览器实现登录功能
  • python爬虫(入门教程、视频教程)
  • Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
  • Python爬虫爬取一个网页上的图片地址实例代码
  • Python使用requests及BeautifulSoup构建爬虫实例代码
(0)

相关推荐

  • 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

  • Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例

    本文实例讲述了Python实现可获取网易页面所有文本信息的网易网络爬虫功能.分享给大家供大家参考,具体如下: #coding=utf-8 #--------------------------------------- # 程序:网易爬虫 # 作者:ewang # 日期:2016-7-6 # 语言:Python 2.7 # 功能:获取网易页面中的文本信息并保存到TXT文件中. #--------------------------------------- import string impor

  • Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补.并且在Python3中废弃了thread模块,保留了更强大的threading模块. 使用场景 在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限

  • 使用python爬虫实现网络股票信息爬取的demo

    实例如下所示: import requests from bs4 import BeautifulSoup import traceback import re def getHTMLText(url): try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def getStockList(lst, stockUR

  • python爬虫(入门教程、视频教程) 原创

    python的版本经过了python2.x和python3.x等版本,无论哪种版本,关于python爬虫相关的知识是融会贯通的,我们关于爬虫这个方便整理过很多有价值的教程,小编通过本文章给大家做一个关于python爬虫相关知识的总结,以下就是全部内容: python爬虫的基础概述 1.什么是爬虫 网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个页面(通常是首页)开始,读

  • Python爬虫通过替换http request header来欺骗浏览器实现登录功能

    以豆瓣为例,访问https://www.douban.com/contacts/list 来查看自己关注的人,要登录才能查看. 如果用requests.get()方法获取这个http,没登录只能抓取回一个登录界面,所以我们要用Python登录网站才能抓取想要的网页. 一个简便的方法就是自己在浏览器上登录好,然后通过下图方法(Chrome为例),找到自己的Cookie和User-Agent,然后发送request时用这复制来的header替换掉待发送的request以达到登录的目的,server端

  • Python使用requests及BeautifulSoup构建爬虫实例代码

    本文研究的主要是Python使用requests及BeautifulSoup构建一个网络爬虫,具体步骤如下. 功能说明 在Python下面可使用requests模块请求某个url获取响应的html文件,接着使用BeautifulSoup解析某个html. 案例 假设我要http://maoyan.com/board/4猫眼电影的top100电影的相关信息,如下截图: 获取电影的标题及url. 安装requests和BeautifulSoup 使用pip工具安装这两个工具. pip install

  • Python爬虫中urllib库的进阶学习

    urllib的基本用法 urllib库的基本组成 利用最简单的urlopen方法爬取网页html 利用Request方法构建headers模拟浏览器操作 error的异常操作 urllib库除了以上基础的用法外,还有很多高级的功能,可以更加灵活的适用在爬虫应用中,比如: 使用HTTP的POST请求方法向服务器提交数据实现用户登录 使用代理IP解决防止反爬 设置超时提高爬虫效率 解析URL的方法 本次将会对这些内容进行详细的分析和讲解. POST请求 POST是HTTP协议的请求方法之一,也是比较

  • Python爬虫天气预报实例详解(小白入门)

    本文研究的主要是Python爬虫天气预报的相关内容,具体介绍如下. 这次要爬的站点是这个:http://www.weather.com.cn/forecast/ 要求是把你所在城市过去一年的历史数据爬出来. 分析网站 首先来到目标数据的网页 http://www.weather.com.cn/weather40d/101280701.shtml 我们可以看到,我们需要的天气数据都是放在图表上的,在切换月份的时候,发现只有部分页面刷新了,就是天气数据的那块,而URL没有变化. 这是因为网页前端使用

  • 基于python图书馆管理系统设计实例详解

    写完这个项目后,导师说这个你完全可以当作毕业项目使用了,写的很全,很多的都设计考虑周全,但我的脚步绝不止于现在,我想要的是星辰大海!与君共勉! 这个项目不是我的作业, 只是无意中被拉进来了,然后就承担了所有,肝了一周多,终于完成,但这个也算是一个很大的项目了吧,对于我现在来说,写这个项目遇到了很多困难,这是真的,其中涉及到数据库的使用,就遇到了一点瓶颈, 但这不算什么,还是要被我搞定的. 梦想就像这个远处夕阳,终究触手可及! Python项目: 项目前提: 这个项目涉及到的知识点有很多, 知识串

  • Python 调用Java实例详解

    Python 调用Java实例详解 前言: Python 对服务器端编程不如Java 所以这方面可能要调用Java代码 前提: Linux 环境  1 安装 jpype1 安装后测试代码: from jpype import * startJVM(getDefaultJVMPath(), "-ea") java.lang.System.out.println("Hello World") shutdownJVM() 2 调用非jdk的jar包, test.jar 包

  • python 系统调用的实例详解

    python 系统调用的实例详解               本文将通过两种方法对python 系统调用进行讲解,包括python使用CreateProcess函数运行其他程序和ctypes模块的实例, 一 python使用CreateProcess函数运行其他程序 >>> import win32process >>> handle = win32process.CreateProcess('c:\\windows\\notepad.exe','',None,None

  • Python 加密的实例详解

     Python 加密的实例详解 hashlib支持md5,sha1,sha256,sha384,sha512,用法和md5一样 import hashlib #hashlib支持md5,sha1,sha256,sha384,sha512,用法和md5一样 m = hashlib.md5() #创建加密对象 m.update(b'password') #对输入内容进行加密, m.digest() #获取二进制加密密文 m.hexdigest() #获取十六进制加密密文 '''''python3默认

  • Python 异常处理的实例详解

    Python 异常处理的实例详解 与许多面向对象语言一样,Python 具有异常处理,通过使用 try...except 块来实现. Note: Python v s. Java 的异常处理 Python 使用 try...except 来处理异常,使用 raise 来引发异常.Java 和 C++ 使用 try...catch 来处理异常,使用 throw 来引发异常. 异常在 Python 中无处不在:实际上在标准 Python 库中的每个模块都使用了它们,并且 Python 自已会在许多不

  • Python字符串处理实例详解

    Python字符串处理实例详解 一.拆分含有多种分隔符的字符串 1.如何拆分含有多种分隔符的字符串 问题: 我们要把某个字符串依据分隔符号拆分不同的字段,该字符串包含多种不同的分隔符,例如: s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz" 其中;,|,\t 都是分隔符号,如何处理? 方法一: 连续使用str.split()方法,每次处理一种分隔符号 s = "ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz&q

  • Python 多线程的实例详解

     Python 多线程的实例详解 一)线程基础 1.创建线程: thread模块提供了start_new_thread函数,用以创建线程.start_new_thread函数成功创建后还可以对其进行操作. 其函数原型: start_new_thread(function,atgs[,kwargs]) 其参数含义如下: function: 在线程中执行的函数名     args:元组形式的参数列表.     kwargs: 可选参数,以字典的形式指定参数 方法一:通过使用thread模块中的函数创

  • C++调用Python基础功能实例详解

    c++调用Python首先安装Python,以win7为例,Python路径为:c:\Python35\,通过mingw编译c++代码. 编写makefile文件,首先要添加包含路径: inc_path += c:/Python35/include 然后添加链接参数: ld_flag += c:/Python35/libs/libpython35.a 在源文件中添加头文件引用: #include "Python.h" Python解释器需要进行初始化,完成任务后需要终止: void s

  • Python rstrip()方法实例详解

    Python 字符串 描述 Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格). 语法 rstrip()方法语法: str.rstrip([chars]) 参数 chars – 指定删除的字符(默认为空格) 返回值 返回删除 string 字符串末尾的指定字符后生成的新字符串. 实例 以下实例展示了rstrip()函数的使用方法: #!/usr/bin/python str = " this is string example-wow!!! "; p

随机推荐