scrpay 和 pyv8解析js,抓取天气预报数据

github项目地址:https://github.com/robertzhai/python/tree/master/scrapy/weather
# -*- coding:utf-8 -*-
import os,sys
import time
import json
from pyv8 import PyV8
import json
str = '''
{city:'济南',tqInfo:[{ymd:'2016-08-01',bWendu:'32℃',yWendu:'24℃',tianqi:'雷阵雨~多云',fengxiang:'北风',fengli:'1-2级',aqi:'47',aqiInfo:'优',aqiLevel:'1'},{ymd:'2016-08-02',bWendu:'31℃',yWendu:'23℃',tianqi:'多云',fengxiang:'北风',fengli:'1-2级',aqi:'94',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-03',bWendu:'31℃',yWendu:'24℃',tianqi:'晴~多云',fengxiang:'东北风',fengli:'1-2级',aqi:'112',aqiInfo:'轻度污染',aqiLevel:'3'},{ymd:'2016-08-04',bWendu:'31℃',yWendu:'24℃',tianqi:'雷阵雨~多云',fengxiang:'东风',fengli:'1-2级',aqi:'108',aqiInfo:'轻度污染',aqiLevel:'3'},{ymd:'2016-08-05',bWendu:'31℃',yWendu:'23℃',tianqi:'雷阵雨~多云',fengxiang:'南风',fengli:'1-2级',aqi:'79',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-06',bWendu:'31℃',yWendu:'23℃',tianqi:'雷阵雨',fengxiang:'东风',fengli:'1-2级',aqi:'71',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-07',bWendu:'28℃',yWendu:'23℃',tianqi:'中到大雨',fengxiang:'北风',fengli:'1-2级',aqi:'52',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-08',bWendu:'29℃',yWendu:'24℃',tianqi:'阵雨',fengxiang:'北风',fengli:'1-2级',aqi:'48',aqiInfo:'优',aqiLevel:'1'},{ymd:'2016-08-09',bWendu:'32℃',yWendu:'24℃',tianqi:'多云',fengxiang:'南风',fengli:'1-2级',aqi:'66',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-10',bWendu:'34℃',yWendu:'26℃',tianqi:'晴',fengxiang:'南风',fengli:'1-2级',aqi:'59',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-11',bWendu:'35℃',yWendu:'27℃',tianqi:'晴',fengxiang:'南风',fengli:'1-2级',aqi:'62',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-12',bWendu:'35℃',yWendu:'26℃',tianqi:'晴~多云',fengxiang:'南风',fengli:'1-2级',aqi:'59',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-13',bWendu:'34℃',yWendu:'25℃',tianqi:'多云~雷阵雨',fengxiang:'南风',fengli:'1-2级',aqi:'71',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-14',bWendu:'32℃',yWendu:'24℃',tianqi:'雷阵雨',fengxiang:'北风',fengli:'1-2级',aqi:'97',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-15',bWendu:'30℃',yWendu:'24℃',tianqi:'雷阵雨',fengxiang:'东北风',fengli:'1-2级',aqi:'77',aqiInfo:'良',aqiLevel:'2'},{ymd:'2016-08-16',bWendu:'27℃',yWendu:'23℃',tianqi:'雷阵雨',fengxiang:'北风',fengli:'1-2级',aqi:'50',aqiInfo:'优',aqiLevel:'1'},{ymd:'2016-08-17',bWendu:'28℃',yWendu:'23℃',tianqi:'中雨~多云',fengxiang:'东北风',fengli:'1-2级',aqi:'73',aqiInfo:'良',aqiLevel:'2'},{}],maxWendu:'35(2016-08-11)',minWendu:'23(2016-08-16)',avgbWendu:'31',avgyWendu:'24',maxAqi:'112',minAqi:'47',avgAqi:'72',maxAqiInfo:'轻度污染',maxAqiDate:'08月03日',maxAqiLevel:'3',minAqiInfo:'空气优',minAqiDate:'08月01日',minAqiLevel:'1'};

'''

def get_ctx():
    if not hasattr(get_ctx, 'ctx'):
        ctx = PyV8.JSContext()
        ctx.enter()
        get_ctx.ctx = ctx
    return get_ctx.ctx


def js2json(data):
    """ convert from javascript data
        to json data
    """
    ctx = PyV8.JSContext()
    ctx.enter()
    ctx.eval("""
            function func() {
              var data = """ + data + """;
              var json_data = JSON.stringify(data);
              return json_data;
            }
            """)

    jsond = ctx.locals.func()
    ctx.leave()
    return jsond


# jsond = js2json("{name: 'john',age: 10,}")
jsond = js2json(str)

print jsond

js = json.loads(jsond)
print js
 
文档:
class JSContext(pyv8._PyV8.JSContext)
 |  Method resolution order:
 |      JSContext
 |      pyv8._PyV8.JSContext
 |      Boost.Python.instance
 |      __builtin__.object
 |
 |  Methods defined here:
 |
 |  __enter__(self)
 |
 |  __exit__(self, exc_type, exc_value, traceback)
 |
 |  __init__(self, obj=None, extensions=[])
 |
 |  ----------------------------------------------------------------------
 |  Methods inherited from pyv8._PyV8.JSContext:
 |
 |  __nonzero__(...)
 |      __nonzero__( (JSContext)arg1) -> bool :
 |
 |          C++ signature :
 |              bool __nonzero__(CContext {lvalue})
 |
 |  __reduce__ = <unnamed Boost.Python function>(...)
 |
 |  enter(...)
 |      enter( (JSContext)arg1) -> None :
 |          Enter this context. After entering a context, all code compiled and run is compiled and run in this context.
 |
 |          C++ signature :
  |              void enter(CContext {lvalue})
 |
 |  eval(...)
 |      eval( (JSContext)arg1, (str)source [, (str)name='' [, (int)line=-1 [, (int)col=-1 [, (object)precompiled=None]]]]) -> object :
 |
 |          C++ signature :
 |              boost::python::api::object eval(CContext {lvalue},std::string [,std::string='' [,int=-1 [,int=-1 [,boost::python::api::object=None]]]])
 |
 |  leave(...)
 |      leave( (JSContext)arg1) -> None :
 |          Exit this context. Exiting the current context restores the context that was in place when entering the current context.
 |
 |          C++ signature :
 |              void leave(CContext {lvalue})
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from pyv8._PyV8.JSContext:
 |
 |  calling
 |
 |  current
 |
 |  entered
 |
 |  inContext
 |
 |  locals
 |      Local variables within context
 |
 |  securityToken
 |
 |  ----------------------------------------------------------------------
 |          Exit this context. Exiting the current context restores the context that was in place when entering the current context.
 |
 |          C++ signature :
 |              void leave(CContext {lvalue})
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from pyv8._PyV8.JSContext:
 |
 |  calling
 |
 |  current
 |
 |  entered
 |
 |  inContext
 |
 |  locals
 |      Local variables within context
 |
 |  securityToken
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors inherited from Boost.Python.instance:
 |
 |  __dict__
 |
 |  __weakref__
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes inherited from Boost.Python.instance:
 |
 |  __new__ = <built-in method __new__ of Boost.Python.class object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T
(END)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值