首页 > Python > 用Python从中国天气网定时抓取天气实况
2017
06-05

用Python从中国天气网定时抓取天气实况

一、抓取天气实况

中国天气网中,大连的天气地址是:http://www.weather.com.cn/weather1d/101070201.shtml

通过Chrome的开发者工具观察页面,页面调用Ajax从如下网址获得天气信息的JS代码:

天气实况:http://d1.weather.com.cn/sk_2d/101070201.html

天气预报:http://d1.weather.com.cn/dingzhi/101070201.html

但是用浏览器直接打开,会得到“403拒绝访问”。那就一定是在发送请求的时候附带了某种信息,以区别是否是自己的网页来调用。首先想到的是cookies,但是模拟之后还是403。再就模拟添加Refere头,发现可以获得数据了!

用Python从中国天气网定时抓取天气实况 - 第1张  | 老王的网站

var dataSK = {"nameen":"dalian","cityname":"大连","city":"101070201","temp":"19","tempf":"66","WD":"南风","wde":"S ","WS":"4级","wse":"16-24km/h","SD":"67%","time":"19:35","weather":"晴","weathere":"Sunny","weathercode":"n00","qy":"1003","njd":"35000","sd":"67%","rain":"0","rain24h":"0","aqi":"46","limitnumber":"","aqi_pm25":"46","date":"06月05日(星期一)"}

剩下的就是用Python将返回的JS代码处理一下,变成标准的JSON格式,解析之后就可以使用了。

import urllib2
import json
def getWeatherInfo():
    request = urllib2.Request("http://d1.weather.com.cn/sk_2d/101070201.html")
    request.add_header('Referer', 'http://www.weather.com.cn/weather1d/101070201.shtml')
    res = urllib2.urlopen(request)
    jscode = res.read()
    pos = jscode.find('{')
    jsoncode = jscode[pos:]
    jsonobj = json.loads(jsoncode, encoding="UTF-8")
    return {'weather': jsonobj['weather'], 'current': jsonobj['temp'], 'wind': jsonobj['WD'] + jsonobj['WS']}

二、定时执行抓取任务

Python的sched模块可以定期执行任务。但是scheduler的run()方法是阻塞的,执行后将无法进行别的操作。所以,需要启一个线程来执行定时任务。

import sched
import time
import threading
schedule = sched.scheduler(time.time, time.sleep)
currentState = ''
def performAction():
    info = getWeatherInfo()
    text = u"当前温度" + info['current'] + u"摄氏度,天气" + info['weather'] + u"," + info['wind'] #构建天气实况字符串
    global currentState
    currentState = text #更新最新实况到全局变量
    # print text
    schedule.enter(600, 0, performAction, ()) #每十分钟抓取一次
def scheduleFunc():
    schedule.enter(1, 0, performAction, ()) #延迟1秒立马抓取
    print "Starting schedule service in python...\n"
    schedule.run()
t = threading.Thread(target=scheduleFunc)
t.setDaemon(True)
t.start()

★完整代码在GitHub上:https://github.com/searky/WeatherCrawler

最后编辑:
作者:Searky
这个作者貌似有点懒,什么都没有留下。

用Python从中国天气网定时抓取天气实况》有 2 条评论

留下一个回复

你的email不会被公开。