自由的python 二
将上面的代码重构了一下,并且添加了cookies,这样我们就不需要每次登陆了
2 # -*- coding: UTF-8 -*-
3
4 import urllib
5 import cookielib, urllib2
6 import os
7 import re
8
9 class Fun:
10 def __init__ (self,username,password,times = 1 ,\ dataFileName = ' fun.data ' ,loginurl = '' ,posturl = '' ,\ proxies = {},pform = None,cookies = None):
11 print ' 初始化 '
12 self.username = username
13 self.password = password
14 self.times = times
15 self.loginurl = loginurl
16 self.posturl = posturl
17 self.proxies = proxies
18 self.pform = pform
19 self.dataFileName = dataFileName
20 self.cookies = cookielib.CookieJar()
21 self.opener = None
22
23 def login(self):
24 """
25 登陆
26 """
27 print ' 登陆 '
28 loginparams = urllib.urlencode({ ' j_username ' :self.username,\ ' j_password ' :self.password,\
29 ' UPC_REQUEST_URI ' : ' *.do ' ,\ ' UPC_LOGIN_FLAG ' : ' UPC_LOGIN_FLAG ' })
30 self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))
31
32 self.pform = self.opener.open(self.loginurl,loginparams)
33 print ' 登陆成功 '
34
35 def post(self):
36 """
37 解析登陆完成的HTML页面,获取用户相应的信息
38 """
39 print ' 解析html页面,获取服务器端返回的内容 '
40 content = ' \n ' .join(self.pform.readlines())
41 items = [ " employeeName " , " department " , " workArea " , " workCity " , " fillInDate " ]
42 values = []
43 for item in items:
44 pattern = " name=\ "" +item+ " \ " \s*(size=\ " \d * \ " )?\s*\ value=\ " (\S * (\s * \S * )?)\ " \s*id=\ "" +item+ " \ ""
45 matcher = re.search(pattern,content)
46
47 if matcher != None:
48 values.append(matcher.groups()[ 1 ])
49 print values
50 else :
51 values.append( '' )
52 print ' 解析完成 '
53 """
54 提交日报
55 """
56
57 print ' 读取data文件: ' + self.dataFileName
58 f = open(self.dataFileName)
59 contents = f.readlines()
60
61 # 读取data文件,判断是否采用交互界面,还是采用data文件的数据
62
63 if contents[0] == ' n ' :
64 c = raw_input( ' 是否采用提交当天日志(y/n)?: ' )
65 if c == ' n ' :
66 self.fillInDate = raw_input( ' 请输入提交日期(格式yyyy-mm-dd): ' )
67 projectId = raw_input( ' 项目名称代码: ' )
68 workId = raw_input( ' 具体事项: ' )
69 workContent = raw_input( ' 工作内容: ' )
70 workNum = raw_input( ' 正常工作时长: ' )
71 overtimeNum = raw_input( ' 加班工作时长: ' )
72 else :
73
74 # 是否采用文件中的时间,如果不采用,则采用当前时间
75 if contents[ 1 ] == ' y ' :
76 self.fillInDate = contents[ 2 ]
77
78 projectId = contents[ 3 ]
79 workId = contents[ 4 ]
80 workContent = contents[ 5 ]
81 workNum = contents[ 6 ]
82 overtimeNum = contents[ 7 ]
83
84 # 拼凑参数 o_o
85 paramsmap = { ' employeeId ' :self.username,\ ' employeeName ' :values[0],\
86 ' department ' :values[ 1 ],\ ' workArea ' :values[ 2 ],\ ' workCity ' :values[ 3 ],\ ' fillInDate ' :values[ 4 ],\
87 ' detailList.projectId ' :[projectId],\ ' detailList.workId ' :[workId],\
88 ' detailList.workContent ' :[workContent],\ ' detailList.workNum ' :[0], ' detailList.overtimeNum ' :[ 8 ]}
89
90 keys = paramsmap.keys()
91 for key in keys:
92 print key, ' : ' ,paramsmap[key]
93
94 postparams = urllib.urlencode(paramsmap)
95 print ' postparams: ' + postparams
96 # 提交
97 # opener = urllib2.build_opener(self.cookies)
98 print ' 开始提交日报 '
99 result = self.opener.open(self.posturl,postparams)
100 # result = urllib2.urlopen(posturl,postparams)
101 # todo:解析提过完成页面,获取信息
102 #
103 result.close()
104 print ' 日报填写成功 '
105
106 def close(self):
107 """
108 """
109 if not self.pform:
110 self.pform.close()
111
112
113
114 if __name__ == ' __main__ ' :
115 # 测试一下
116 try :
117 test = Fun(username = '' ,password = '' ,loginurl = '' ,posturl = '' )
118 test.login()
119 test.post()
120 test.close()
121 except IOError:
122 raise
初始化
登陆...
登陆成功
解析html页面,获取服务器端返回的内容
['\xd0\xec\xcf\xe9\xbe\xfc']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab', '\xc4\xcf\x
be\xa9']
['\xd0\xec\xcf\xe9\xbe\xfc', '\xc4\xcf\xbe\xa9', '\xbb\xaa\xb6\xab', '\xc4\xcf\x
be\xa9', '2005-09-24 17:45:40.0']
解析完成
读取data文件:fun.data
detailList.workId : ['10003102\n']
employeeId : 404
workCity : 南京
detailList.projectId : ['JX0001\n']
detailList.overtimeNum : [8]
detailList.workNum : [0]
detailList.workContent : ['\xbb\xfc\xb2\xe9\xd0\xe8\xc7\xf3\xb7\xd6\xce\xf6\n']
fillInDate : 2005-09-24 17:45:40.0
department : 南京
workArea : 华东
employeeName : 徐祥军
postparams:detailList.workId=%5B%2710003102%5Cn%27%5D&employeeId=404&workCity=%C
4%CF%BE%A9&detailList.projectId=%5B%27JX0001%5Cn%27%5D&detailList.overtimeNum=%5
B8%5D&detailList.workNum=%5B0%5D&detailList.workContent=%5B%27%5Cxbb%5Cxfc%5Cxb2
%5Cxe9%5Cxd0%5Cxe8%5Cxc7%5Cxf3%5Cxb7%5Cxd6%5Cxce%5Cxf6%5Cn%27%5D&fillInDate=2005
-09-24+17%3A45%3A40.0&department=%C4%CF%BE%A9&workArea=%BB%AA%B6%AB&employeeName
=%D0%EC%CF%E9%BE%FC
开始提交日报
日报填写成功