|
锁定老贴子 主题:督促自己-清风Python练习贴
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
时间:2005-01-10
这是我在faridea首发的帖子,转到这里期待和更多的朋友进行交流,原贴:http://www.faridea.com/bbs/Announce/Announce.asp?BoardID=301&ID=5814
让我们开始:) 感觉手绘区的这个方法特别好,我也特此开贴,督促自己学习:),有想和我一起学Python的就开始吧。 先到Python老家下载最新版的Python->http://www.python.org 2005-1-7: 为何要学习Python?到google可以搜索到一大堆理由。 我的理由是其字符串处理能力,和随心所欲的脚本语言写法,写Java总有一种很严肃很认真的感觉,而Python则很简便,有一种想法到哪,程序就到哪里的感觉 今天学习几个简单的部分: 1。生成随机数 [code:1] import random rnd = random.randint(1,500)#生成1-500之间的随机数 [/code:1] 2。读文件 [code:1] f = open("c:\\1.txt","r") lines = f.readlines()#读取全部内容 for line in lines: print line [/code:1] 3。 写文件 [code:1] f = open("c:\\1.txt","r+")#可读可写模式 f.write("123")#写入字符串 [/code:1] 4。基本语法 这是Python最令我欣赏的地方,无论你以前从事何种语言的开发,都会很快上手Python的语法 以上这些简单的代码,就可以组成一个小程序了,一个抽奖系统的后台核心代码了:) to be continue.... 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2005-01-10
2005-1-8:
接下来要用Python做两项工作: 1,网站的后台改造,用Python完成核心代码 会用到的技术:XML的读写,数据库的操作,XSLT的解析,代码的WebService化 2,一个网页爬虫机器人,抓取其他网站内容 正则表达式 其实对于一个项目的开发,语言并不是最重要的,关键是解决问题的方法和这种语言所提供的解决方案,为何选择Python来做这两个工作?开发快速,字符串处理能力强,移植性好 今天就先来测试一下Python的正则表达式能力 任务:读取tomcat的日志文件,并且把日期开头的内容显示出来,例如:xxxx-xx-xx [code:1] import re regx = "\d\d\d\d-\d\d-\d+" f = open("c:\stdout.log","r") i = 0 for str in f.readlines(): if re.search(regx,str): Response.write(str+"<br>") if i>10:break#由于是测试,只分析十行 i=i+1 f.close(); [/code:1] 代码很简单,关于正则表达式这里不做过多说明,由此也可以看出语言不是最重要的,重要的是解决方案。以下简单介绍一下Python的正则表达式,想了解更多到Google搜索Python+Regx 引用 样本规则表达式 ABC([d-w]*\d\d?)+XYZ 对于要匹配这个表达式的字符串,它必须以 "ABC" 开头、以 "XYZ" 结尾 -- 但它的中间必须要有什么呢?中间子表达式是 ([d-w]*\d\d?),而且后面跟了“一或多”运算符。所以,字符串的中间必须包括一个(或者两个,或者一千个)与括号中的子表达式匹配的字符或字符串。字符串 "ABCXYZ" 不匹配,因为它的中间没有必要的字符。 不过这个内部子表达式是什么呢?它以 d-w 范围内的零或多个字母开头。一定要注意:零字母是有效匹配,虽然使用英语单词 "some"(一些)来描述它,可能会感到很别扭。接着,字符串必须恰好有一个数字;然后有零或一个附加数字。(第一个数字字符类没有循环运算符,所以它只出现一次。第二个数字字符类有 "?" 运算符。)总而言之,这将翻译成“一个或两个数字”。以下是一些与规则表达式匹配的字符串: 匹配样本表达式的字符串 ABC1234567890XYZ ABCd12e1f37g3XYZ ABC1XYZ 还有一些表达式与规则表达式不匹配(想一想,它们为什么不匹配): 不匹配样本表达式的字符串 ABC123456789dXYZ ABCdefghijklmnopqrstuvwXYZ ABcd12e1f37g3XYZ ABC12345%67890XYZ ABCD12E1F37G3XYZ 需要一些练习才能习惯创建和理解规则表达式。但是,一旦掌握了规则表达式,您就具有了强大的表达能力。也就是说,转而使用规则表达式解决问题通常会很容易,而这类问题实际上可以使用更简单(而且更快速)的工具,如 string,来解决。 一个用来测试Python正则表达式的工具: http://kodos.sourceforge.net/ 图形界面,简单易用,适合学习Python的正则表达式 一个正则表达式标记的中文说明: http://hedong.3322.org/archives/000244.html |
|
| 返回顶楼 | |
|
时间:2005-01-10
2005-1-8第二贴:
任务:尝试Python的XML-RPC远程调用 引用 何为XML-RPC? XML-RPC 是 XML Web 服务的鼻祖。它是一个用于远程过程调用(remote procedure call,RPC)的简单规范,这种调用使用 HTTP 作为传输协议,并使用 XML 词汇表作为消息有效负载。由于 XML-RPC 非常简单(整个规范打印出来还不到十页纸),它已经变得非常流行,现在大多数语言都有了标准的或已经可用的 XML-RPC 实现。这些语言中包括 Python,它在版本 2.2 中就开始捆绑 xmlrpclib(Fredrik Lundh 开发的 XML-RPC 实现)了。 首先,我们打算将CMS(Context Manager System)系统进行Python的改造,第一件事,先向外公开版本的变化,可供远程调用。 [code:1] import SimpleXMLRPCServer #定义自己的CMS类 class MyCMS: def getVersion(self):#向外公开版本的方法 return "Powerd By Python 0.1a" cms = MyCMS() server = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8888)) server.register_instance(cms) print "Listening on port 8888" server.serve_forever()#服务器执行,并监听8888端口 [/code:1] 执行后截图: 此主题相关图片
客户端调用代码,获得最新的版本信息 [code:1] import xmlrpclib server = xmlrpclib.ServerProxy("http://localhost:8888";) version = server.getVersion() print "version:"+version [/code:1] 执行后截图: 此主题相关图片
总结: 比同等的JAVA实现代码量明显减少,使精力能够更多的集中到系统本身中来 JAVA的一个XmlRpc实现:http://ws.apache.org/xmlrpc/ JAVA调用代码如下: [code:1] XmlRpcClient xmlrpc = null; try { xmlrpc = new XmlRpcClient("http://localhost:8888/";); } catch (MalformedURLException e) { e.printStackTrace(); } Vector params = new Vector(); try { String result = (String) xmlrpc.execute("getVersion", params); System.out.println(result); } catch (XmlRpcException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } [/code:1] 执行效果如图: 此主题相关图片
想了解更多,请到这里: http://www.python.org/doc/current/lib/module-xmlrpclib.html http://www.python.org/doc/current/lib/module-SimpleXMLRPCServer.html |
|
| 返回顶楼 | |
|
时间:2005-01-10
2005-1-8第N贴:
任务:抓取FarideaBBS首页的所有图片 主要应用技术:正则表达式&urllib 第一步,模拟HTTP连接,连接FarideaBBS,获取Html源代码 [code:1] def farideaHttp(): page = urllib.urlopen("../Boards.asp";) body = page.readlines() page.close() return body [/code:1] 第二步分析Html源代码,建立正则表达式: 今天先建立一个简单的表达式,不考虑图片链接是否有http头 regx = r"""<img\s*src\s*="?(\S+)""" 函数代码如下: [code:1] def anyHtml(line): import re regx = r"""<img\s*src\s*="?(\S+)"?""" match_obj = re.search(regx,line) if match_obj!=None: all_groups = match_obj.groups() for img in all_groups:print img#这个img就是图片的链接了 [/code:1] 调用代码如下: [code:1] lines = farideaHttp()#读取全部内容 for line in lines: anyHtml(line) [/code:1] 执行后效果如图: 此主题相关图片
由此也可以看出,Python的网络能力和字符串能力以及使用的简便,OK,既然说要改造网站,那么下一个任务就是把主页的抓取天气预报的功能由ASP改为Python的。 |
|
| 返回顶楼 | |
|
时间:2005-01-10
2005-1-10:
任务:从新浪抓取天气预报 首先访问http://weather.sina.com.cn/cgi-bin/figureWeather/simpleSearch.cgi来看一下新浪天气预报的样式 此主题相关图片
OK,一天的基本天气在这里就都有了,我们要做的就是把他变为自己的,抓取后的效果如图: 此主题相关图片
这次不忙着写代码,既然当成一个小项目,那么就按照软件工程的步骤慢慢来。 1.技术分析 此主题相关图片
2.正则表达式的建立 由上图可以看出最重要的一个部分当数正则表达式的建立,这样才可以迅速有效的把天气抓取回来。 3.可复用代码 无疑连接服务器,抓取网页,根据正则表达式抓取内容是将来可以再利用的部分,应当进行相应的封装。 4.单元测试的建立 根据XP极端编程的思想,我们先写测试代码,确定下调用过程,再进行真正代码的编写 以上的部分我会慢慢补充到这一贴 |
|
| 返回顶楼 | |
|
时间:2005-01-11
2005-1-11:
今天在继续天气预报代码之前让我们做一件,既有趣又无聊的事情:),改变访问网页时的USER_AGENT,有趣的是好像又发明了一种浏览器,无聊的是没什么太大意义,但既然是Python学习之旅,那么就想到哪做到哪了。 首先想一下命名,就叫QingFengbot吧:),版本0.1,然后让我们看一下其他浏览器是如何定义自己的USER_AGENT的: 建立一个ASP网页,里面就放一句代码就好 [code:1]<% response.Write(request.ServerVariables("HTTP_USER_AGENT")) %>[/code:1] 然后我们分别用Mozilla、IE、和我们的QingFengbot访问这个页面,看看输出的是什么:) IE: 引用 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322) Mozilla: 引用 Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.7.5) Gecko/20041124 Firefox/1.0
QingFengbot: 此主题相关图片
那么,如何实现呢,让我们用代码交流: 建立一个qingfengbot.py,这个机器人的所有代码就都放在这里 [code:1]import urllib import re class MyUserAgent(urllib.FancyURLopener): def __init__(self, *args): self.version = "QingFengbot/0.1(Python;QingFengbot 0.1;zh-CN)"#定义自己的user_agent urllib.FancyURLopener.__init__(self, *args) def httpclient(url): urllib._urlopener = MyUserAgent() page = urllib.urlopen(url) body = page.read()#read? readlines? page.close() return body[/code:1] 目前里面仅仅封装了一个方法httpclient,用来连接一个web地址,然后返回这个地址的html,在这里究竟应当返回read还是readlines,我还得继续研究,目前感觉返回read外面好处理一些。 调用方法如下: [code:1] import qingfengbot print qingfengbot.httpclient("http://www.faridea.com/bbs/Boards.asp") [/code:1] OK,今天这个帖子,就当作一个小插曲吧:) |
|
| 返回顶楼 | |
|
时间:2005-01-11
:)另外,感谢斑竹加精,希望能吸引大家一起来学习Python这个有趣的语言。
ps:在JAVA企业应用那个版的建模的话题(http://forum.javaeye.com/viewtopic.php?t=9147)没能继续下去深感遗憾,等我继续学习一些东西以后再继续深入讨论那个问题:oops: |
|
| 返回顶楼 | |
|
时间:2005-01-12
2005-1-12:
今天再为QingFeng bot封装一个分析正则表达式的方法,传入一个正则表达式,传入一个待分析的字符串,就可以得到想要的结果了,简单封装如下: [code:1] #express:正则表达式 #htmlstr:待分析的字符串 def regxHtml(express,htmlstr): return re.search(express,htmlstr) [/code:1] 然后,我们就要分析一下新郎天气预报的html了,整个html很规整 引用 <b>晴</b><br> <b class=f16>1℃~-8℃</b> 那么分别建立正则表达式如下: [code:1] regx1 = r"<b>(\S+)</b><br>"#天气阴晴 regx2 = r"<b class=f16>(\S+)</b>"#温度 [/code:1] OK,现在有了连接服务器的方法,分析正则表达式的方法,还有了自己的USER_AGENT,那么抓取天气则轻而易举了,调用代码如下: [code:1] import qingfengbot regx1 = r"<b>(\S+)</b><br>"#天气阴晴 regx2 = r"<b class=f16>(\S+)</b>"#温度 body = qingfengbot.httpclient("http://weather.sina.com.cn/cgi-bin/figureWeather/simpleSearch.cgi") fine = qingfengbot.regxHtml(regx1,body).group(1)#阴晴 temperature = qingfengbot.regxHtml(regx2,body).group(1)#温度 print fine +" " + temperature [/code:1] 调用后效果如图:
这只是完成了最简单的抓取,接下来要为三种调用方式分别生成返回串,to be continue... |
|
| 返回顶楼 | |
|
时间:2005-01-14
2005-1-14:
关于Python的数据库操作能力,还要经过进一步的学习,不过我们仍然可以利用Python的字符串和网络操作能力,做一些有趣的事情:) 今天的任务是: 利用Python编写网格服务,编写并行密码生成算法,暴力破解登陆密码。声明:不是为了做坏事,仅仅是为了学习Python,仅仅是为了以后忘记密码时可以使用。 技术分析: 目前还没掌握的部分:Python的WebService的编写,Python的Socket,Python的XML处理。 但基本流程我们已经可以定下了 1。分解密码生成算法,将其变为并行算法,以便在网格中使用 2。将一个个小任务发给客户端,使其帮助运算 3。收集客户端计算结果,找到最终密码 OK,继续学习,to be continue..... |
|
| 返回顶楼 | |
|
时间:2005-01-18
2005-1-18:
年关了,事情一件接一件,自己的公司方面需要SIP,Jabber,所在部门又在Grid,给朋友做的游戏Demo又在ActionScript,疯狂的IT圈。。。 不管那么多了,挤时间也要Python一下,仍然继续上次的任务,继续学习。上次谈到要用Python做网格,那么分布算法是很重要的一个部分,对于单机而言,可以先用多线程尝试一下这个主题。在网上搜索了一下,找到这样一篇文章:http://www-900.ibm.com/developerWorks/cn/linux/sdk/python/charm-25/index_eng.shtml 其中有一段代码是这样,有如下操作: [code:1] s = "Mary had a little lamb" s = s.upper() s = "Mary had a little lamb" s = s.lower() s = "Mary had a little lamb" s = s.replace('a','A') [/code:1] 把一个字符串分别进行转换为大写、小写、替换小写a字符为大写A 很明显这个算法,可以将三个操作拆分为三个函数,变为一个多线程算法 [code:1] def upper(): def lower(): def replace(): [/code:1] 然后放到线程中执行: [code:1] global threads threads.append(upper()) threads.append(lower()) threads.append(replace()) [/code:1] 问题来了,他只是定义了一个global threads,翻手册发现,global只是将变量定义为全局变量,而不是指定其类型。执行了一下代码,果然报错如下: 引用 NameError: global name 'threads' is not defined 于是手工在上面加上了threads = [],代码正确执行了,可是执行时间没有如文章所说减少了,反而增加了。。。现在不知问题出在这个global上,还是我的线程代码有问题,晕,已经给该文作者发了右键,希望能得到解答,也希望大家看一下在附件中的代码,看看问题在哪?一起交流。 执行时间如下: 引用 LOOP TIME: 0.610896077574 THREAD TIME: 0.961342572869 |
|
| 返回顶楼 | |



