Archive

Posts Tagged ‘python’

用Python写东西的笔记

December 16th, 2011 No comments

自从最近这次换工作以后,空闲时间一下子变得奢侈起来,博客最近也写得少了,一些喜欢的小东西也无暇顾及。

——————无聊分割线————————-

一直对python很钟情,不过最近很少用,能记得比较完整的程序就是“用Python做了个Spider”,当时在一个Linode的VPS上跑了几个月。最近处理数据时候又重新用python来做,做完之后还是继续感慨它的便利性。

用python的一个最大的优点就是可以快速的迭代式开发,不断的重构,这一点在这次体会尤深。

其中有几次跳跃式的重构如下:

第一次的重构在书写了几个数据段的解析函数之后,决定定制一个规则,然后通过解析规则来处理各种字段。于是有了一个大约20条记录的标签库(后来再加一个文件解析的时候又增加了6行),然后就处理了近30种数据段,而且可以很方便的定制扩充。

第二次重构在输出报告的完成了一个数据段的汇总后,抽象出了一个Report类,完全控制报告的输出。也就有了后来用css+html的报告时候的顺理成章。

另外一次不大的重构,在于利用的简化的有限状态自动机的思想来处理各种特殊情况。当然只是思想而不是一个完整的自动机。 这一条在N年前给sudidi同学的abaqus数据文件提取工具中就大体考虑过,可以说轻车熟路。

后来用配置文件来设置参数,打包exe。从开始学习到成功,大约花了30分钟,代码10行,我爱python。

除去一些修饰性的代码和css样式表,核心代码不到500行。如果用c++的话,代码量至少要翻2倍,时间2倍不止。

Eclipse+PyDev是目前开发python程序的不二选择,除去log外,一个完善的Debug环境还是很赞的。

——————无聊分割线2——————–

有些东西记下来权当笔记,免得以后再找。

1.  文件路径的相关处理

用 os.path 就完全解决所有问题,包括路径拼接、路径拆分、相对路径提取、文件存在性判断、文件遍历、递归遍历等等。相关函数有:

os.path.join

os.path.basename

os.path.exists

os.makedirs

os.path.isdir

os.path.splitext

2. 文件的遍历

目录下的文件遍历有两种,一种是os.listdir,一种是用os.walk。如果需要递归,则后者更为方便。

   1: files = os.listdir(proj_dir)

   2: for f in files:

   3:     filepath = os.path.join(proj_dir,f)

   4:     if os.path.isdir(filepath): continue

   5:     if f.find('----')>-1:

   6:         shutil.copy(filepath, self.REPORT_DETAIL_DIR)

使用os.walk则很容易进行遍历:

   1: for root,dirs,files in os.walk(proj_list_dir, True):

   2:     for f in files:

   3:         pass

3. 文件的复制

对于文件、文件夹、目录树的拷贝删除可以使用shutil相关函数,注意有些条件,比如目标目录不能存在之类。

shutil.copytree

shutil.rmtree

shutil.copy

4. 乱码

如果能用utf-8统一处理是最好,但是如果在window下面,并且和平常文件打交道多的话,可能也需要其他编码。这时候需要注意系统的编码格式。下面这段代码有帮助。

   1: default_encoding = 'gbk'

   2: if sys.getdefaultencoding() != default_encoding:

   3:     reload(sys)

   4:     sys.setdefaultencoding(default_encoding)

5. 配置文件的读写

python内置了ConfigParser,一般的用途足够了。简洁好用。

6. 打包成exe

有时候为了部署方便,而且windows上默认也不会装python,所以打包成一个独立的exe还是相当有吸引力。以前的py2exe已经不维护了,不过现在有更简单的 pyinstaller (www.pyinstaller.org),使用相当简单,支持各种python版本。

需要留意的是,vc9的crt和upx有冲突,可以取消upx选项。

—————-最后的分割线——————————-

写点喜欢的东西还是很高兴,能提高工作效率,从最枯燥无聊的数据工作中解脱出来更高兴.

人生苦短,有限的时间应该花在有意义的吃喝玩乐上,呵呵.

Categories: 快乐每一天 Tags:

Python中获取Javascript渲染后的HTML源码

April 9th, 2009 4 comments

Get Rendered HTML Source In Python

前因:

现在的网页越来越动态和漂亮,大量地用到了Javascript,包括但是不限于Ajax,这样一来直接查看网页源代码的话的,获取到的并不是真正的渲染完成后的页面。这对采集来说,是一个很大的挑战。

在火车头当中,对于Ajax获取的数据的话,可以手动分析页面提取的Ajax的处理url,然后来提取。但是对于复杂的session验证(特别是.NET的网站来说)处理比较困难。

另外一方面,对于javascript生成的页面,火车头也没法直接提取。

思路:

首先明确的是必须获取Javascript渲染结束后的结果。这一点是明确的,具体就是方法就因人而异。

而自己解决Javascript渲染无异于痴人说梦,所以必须借助现有的浏览器核心,比如Gecko、WebKit、IE。如果用Java开发的话可以Jrec这个库,它封装了Gecko。如果其他的语言,而且是在windows平台上的话,最简单的就是用——

COM,用Internet Explorer 提供的com组件。

解决方案:

突破了这层关系,下面的就水到渠成了。

在python下,对IE封装的比较完善而且文档齐全的就是PAMIE(http://sourceforge.net/projects/pamie),它的本意是作为自动化测试工具使用的。

需要注意的是,在页面加载完之后需要留出一定时间来让页面的js代码执行渲染完成后再提取html代码。这个时间需要通过试验确定。

需要注意的是:
前面所述的利用PAMIE来获取渲染后的html内容的方法是可行的,但是缺点是效率非常低。对于最常见的ajax动态内容页面来说,最直接的方法还是构造ajax请求,来获取相应内容。这样效率很高,而且返回数据都是结构化的xml或者json数据,比html更容易处理。

Categories: 技术讨论 Tags: , ,

用Python做了个Spider

March 6th, 2009 4 comments

前因:

  1. 前些天为TAR写了一个Python的接口插件tar_pytar后,对python的兴致很高。
  2. 本博上面最火的文章就是“开源的火车头采集-Wordpress2.7.1免登录发布接口”,看来大家利用采集做垃圾站的热情也很好。
  3. 著名的火车头采集器LocoySpider也出2009版了,解决了.Net 3.5不兼容问题,而且采集标签进行了语法高亮。很好很强大。但是免费版不支持任意附件下载功能…
  4. 想下载点资料,但是论坛里面一个一个点击太烦…

于是:

自己做一个吧,python做这个肯定很合适,与火车头的功能做个对比:

[阅读剩余部分…]

Categories: 技术讨论 Tags: ,

为TAR写了一个Python的接口插件tar_pytar

February 27th, 2009 1 comment

image TAR(Type And Run)是我一直以来所用的快速启动软件,最喜欢的是它那个快捷键呼出的超级简洁的命令行,而且TAR支持自动提取系统中已经注册的别名,比如excel就可以打开excel,mspaint打开画图。另外TAR支持插件,最常用的就是tar_math,可以对输入命令行的计算式进行计算,给出结果。

当然tar_math也存在缺点,那就是对大整数不支持,而且函数也不够丰富。另外还想增加一个查字典的功能。于是决定给TAR做个插件,取名叫tar_pytartar_pytar不只是个插件,而是一个python的接口插件。有了这个插件之后,就可以直接用python给TAR增加功能,而不是重新编译。

官方网站上有插件接口文件找不到了,于是给作者-=GaLaN=-发邮件要来了接口。TAR是拿Delphi写的,不过没关系。

时间紧张,只说明一下tar_pytar通过python接口提供的功能:

  • 完整的math功能,完全可以取代tar_math。因为背后是python嘛。
  • 词典功能,输入查询的英文单词,可以返回中文解释。(从dict.cn查询,同样感谢python的强大)

以后:

  • 作为一个工作的中心,就是一些人对待emacs/tc的态度。
Categories: 技术讨论 Tags: , , ,

非常棒的Python入门书-Dive Into Python

July 2nd, 2007 No comments

在学习过Python Tutorial,有了基本一点概念之后,阅读Dive Into Python无疑是非常合适的。

Dive Into Python是一本免费的图书,可以在线阅读或者下载回来离线阅读,目前有英文、中文等多种语言版本。

这本书非常类似 Head First Design Patterns的写作风格,以几个简单但是非常有代表性的例子,深入浅出的讲解Python的概念和思想。

Categories: 技术讨论 Tags: ,

Trac与Apache的集成(ModPython)

June 13th, 2007 1 comment

在”Trac+SVN的安装与配置(tracd模式)“中介绍了以tracd方式的trac服务器的安装与配置,今天来研究一下Trac通过ModPython来与Apache的集成。

与tracd的方式相比,和Apache的集成有很多优点,比如充分利用apache的强大功能以及ModPython的高效率,便于管理与控制,很方便支持ssl等等。

1. 下载并安装程序

  • 假设已经按照”Trac+SVN的安装与配置(tracd模式)“中的说明安装好了Trac。如果没有请参考安装
  • Apache-2.0.59:如果选择2.2,注意下面的ModPython的版本要对应
  • ModPython-3.3.1:这里注意选择与apache和python对应的版本,安装过程中会要求选择apache的安装目录,并且自动把mod_python.so复制到modules目录

2. 配置

  • 配置ModPython
    在apache的httpd.conf中加入下面一行:
    LoadModule python_module modules/mod_python.so
  • 配置trac
    在apache的httpd.conf中加入下面内容:
    <Location /trac>
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv F:\trac\proj1
    PythonOption TracUriRoot /trac
    </Location>
  • 然后就通过http://localhost/trac来访问

3. 下一步工作

  • 配置Authentication

参考资料: