Houdini - 用Python开发pm2.5数值读取插件 (1)

最近在空余时间开发了一个houdini比较撩骚的插件,能够读取当前pm2.5的数值,主要是北京的这个环境太闹心了,脏乱差也得苦中找点乐子吧。插件还没做好,现在只是把数据读取那一部分做完了,等过段时间和搞设计的小伙伴看看怎样做程序动画比较好玩。

这里简单讲一讲思路,之后再上代码吧。

开始之前先列出我抓取数据的网站:

pm2.5 :                      http://pm25.in

城市列表(事后可以自己手动添加城市) : http://europe.chinadaily.com.cn/travel/2014-12/16/content_19095561.htm

1:读取城市列表。

我想到的是如果你是第一次使用这个插件,在节点创立的时刻能够给你在网络上读取一个可靠地城市列表并以txt的形式存储在你的本地电脑中,这样下一次的时候就能直接调取本地列表了,同时也能够随意添加或修改所需的城市。其实你手动自己去写一个列表也没差,只不过这一步更加智能了一点点。

2:选择城市并调取数据

在面板中选择好自己想要的查找的城市之后,点击更新的时候程序先定位到该城市的网页页面。比如选择“chongqing”,那么脚本会先点位到http://pm25.in/chongqing。其实这个网站已经提供了一个可靠的api,但是这个api的申请审核有点麻烦,所以本着能不麻烦别人就不麻烦别人的原则我就还是不麻烦审核人员了,何况我对实时更新速度根本没要求。用python直接读取页面信息其实也不难,有现成的urllib可以使用,之后再用正则表达式来搜索自己想要的那一部分文本。这里我抓取了pm2.5和一氧化碳等之类的数值,以及AQI的24小时历史数据。

在脚本部分,我分成了两个模块,第一部分是节点生成的时候会执行一边的,主要是更新城市列表的。第二部分是相应按钮来读取具体数据的。下面就上干货代码了:

OnCreated部分:

import re
import urllib2
import string
import hou

url = "http://europe.chinadaily.com.cn/travel/2014-12/16/content_19095561.htm"
cityFileRead = open("C:\Users\Administrator\Documents\houdini13.0\pythonFiles\Cities.txt","r")
cityList = cityFileRead.read()

# open url and get the content
def getUrlContent(url, cityList):
    if len(cityList) < 10:
        request = urllib2.Request(url)
        request.add_header(‘User-Agent‘, ‘magic-client‘)
        response = urllib2.urlopen(request).read()
        print len(response)
        return response
    else:
        return None

def findKeyWords(content):
        keyWord = re.compile(r"""(?<=<p>Here is the full list of this year‘s ranking:</p>).*?(?=<div width="100%">)""", re.DOTALL)
        results = keyWord.findall(content)
        subKeyWord = re.compile(r"(?<=. ).*?(?=</p>)")
        cities = subKeyWord.findall(results[0])

        cityFileWrite = open("C:\Users\Administrator\Documents\houdini13.0\pythonFiles\Cities.txt","w")

        for city in cities:
            city = city.lower()
            city = city.replace("’","")
            cityFileWrite.write(city + ",")

        cityFileWrite.close()

content = getUrlContent(url, cityList)
if content != None:
        findKeyWords(content)

cityFileRead.close()      

#print "loaded again"

接着是PythonModule部分:

import urllib2
import re

self = hou.pwd()
#geo = self.geometry
cityFileRead = open("C:\Users\Administrator\Documents\houdini13.0\pythonFiles\Cities.txt","r")
cityList = cityFileRead.read()
cityList = cityList.split(",")

pmValues = {}

def getCityName():
    index = self.parm("cityName").eval()
    #print index
    for i in range(len(cityList)):
        if i == index:
            return cityList[i]
            #print cityList[i]

def findUrlContent(city):
    url = "http://pm25.in/" + city
    #print city
    self.setParms({"city":city})
    request = urllib2.Request(url)
    request.add_header(‘User-Agent‘, ‘firefox‘)
    response = urllib2.urlopen(request).read()
    return response

def getPmInformation(content):
    #get per hour data
    #print content
    dayDataKeyWord = re.compile(r"(?<=data: ).*?(?=,\n)")
    dayDataResults = dayDataKeyWord.findall(content)[0]
    dayDataResults = dayDataResults.replace("[", "")
    dayDataResults = dayDataResults.replace("]", "")
    histries = dayDataResults.split(",")
    #print histries

    #get different types of data
    typesValueKeyWord = re.compile(r‘‘‘(?<=<div class="value">\n            ).*?(?=\n          </div>)‘‘‘, re.DOTALL)
    typesValueResults = typesValueKeyWord.findall(content)[:-1]
    typesTitleKeyWord = re.compile(r‘‘‘(?<=<div class="caption">\n            ).*?(?=\n          </div>)‘‘‘, re.DOTALL)
    typesTitleResults = typesTitleKeyWord.findall(content)
    del typesTitleResults[-2]
    del typesTitleResults[-2]
    for i in range(len(typesTitleResults)):
        typesTitleResults[i] = typesTitleResults[i].replace("/","_")
        typesTitleResults[i] = typesTitleResults[i].replace(".","_")
        pmValues[typesTitleResults[i]] = typesValueResults[i]
    #print pmValues
    return histries

def createAttrib(pmHistry):
    for key in pmValues.iterkeys():
        self.setParms({key : pmValues[key]})
    for i in range(len(pmHistry)):
        name = "histry%d" % i
        self.setParms({name : pmHistry[i]})

def update():
    city = getCityName()
    #print city
    content = findUrlContent(city)
    #print content
    pmHistry = getPmInformation(content)
    createAttrib(pmHistry)
    #print "done"

cityFileRead.close()

代码里面有我自定义的本地路径,需要根据不同人进行不同的设置。而且这里的代码普适性不强,因为是根据特定的网络页面来设定的正则表达式,所以换做读取其他页面那上面的代码也就基本作废了。

在最后面板按钮上写上  hou.pwd().hdaModule().update() 就能执行了。

其实现在这个小插件虽然能用了,但还是有些小bug正在调试。问题出在每次新建立这个节点不能直接点击update,需要先打开type properties点apply一下。要不然会报错:‘moudel‘ has no attribute ‘update‘。 这个问题我估计是生成时脚本加载不完整或者刚生成时Python模块读取不了自身对象。总之还在测试,如果你知道问题在哪,欢迎留言告诉我。

时间: 2024-10-15 06:22:14

Houdini - 用Python开发pm2.5数值读取插件 (1)的相关文章

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

【python开发教程】如何快速入门python开发?

想要学习python这门语言,却始终找不到一个全面的Python开发实战教程,倘若你是真心想学好一门语言,小编建议你亲自动手实践的.下面来看看入门python的学习教程. Python的语言特性 Python是一门具有强类型(即变量类型是强制要求的).动态性.隐式类型(不需要做变量声明).大小写敏感(var和VAR代表了不同的变量)以及面向对象(一切皆为对象)等特点的编程语言. 获取帮助 你可以很容易的通过Python解释器获取帮助.如果你想知道一个对象(object)是如何工作的,那么你所需要

Python开发实战教程(8)-向网页提交获取数据

来这里找志同道合的小伙伴!↑↑↑ Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本次课程是在掌握python基础之上进行的.基础没有学习的话建议先查看文章学习基础目录:Python开发实战系列教程-链接汇总,持续更新.进行学习. 最近几天感冒中,四肢乏力以及最近比较忙导致,更新较慢.还请见谅. 概述 很多时候我们需要给网

Python开发【第二十篇】:缓存

Python开发[第二十篇]:缓存redis&Memcache 点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可

Python开发【第二十一篇】:Web框架之Django【基础】

Python开发[第二十一篇]:Web框架之Django[基础] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 基本配置 一.创建django程序 终端命令:django-a

常用的十大Python开发工具

据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉你. 1.Micro Python Micro Python基于ANSI C,语法跟Pyton 3基本一致,拥有自家的解析器.编译器.虚拟机和类库等.目前支持基于32-bit的ARM处理器,比如说STM32F405. 借助它,用户完全可以通过Python脚本语言实现硬件底层的访问和控制,如控制LED

Python 开发轻量级爬虫05

Python 开发轻量级爬虫 (imooc总结05--网页下载器) 介绍网页下载器 网页下载器是将互联网上url对应的网页下载到本地的工具.因为将网页下载到本地才能进行后续的分析处理,可以说网页下载器是爬虫的核心组件. 网页下载器类似于网页浏览器,会将url对应的互联网网页,以HTML的形式下载到本地存储一个本地文件或者本地字符串,然后才能进行后续的分析和处理. Python有哪几种网页下载器呢? Urllib2 – python官方的基础模块,它支持直接的url下载, 或者说向网页提交一些需要

Python开发的3种命令执行方法

在python开发中,我们常常需要执行命令,修改相关信息.那对于初学者来说,python中如何执行命令呢?今天,小编就为大家分享3种python命令执行的方法. 1. 使用os.system("cmd") 在python中,使用os.system("cmd")的最大特点是,其执行时程序会打出cmd在linux上执行的信息. import os os.system("ls") 2. 使用Popen模块产生新的process Popen是现在pyth

《Python开发实战》

<Python开发实战> 基本信息 作者: (日)BePROUD股份有限公司 译者: 盛荣 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115320896 上架时间:2014-5-6 出版日期:2014 年5月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 软件与程序设计 > Python 更多关于>>><Python开发实战> 编辑推荐 真实项目中的经验总结 行业精英们的智慧结晶 团队开发环境的搭建与管理 /