问题:
公司的日报,每天填写的时候总是那么巨慢,都有点恐惧它了!
解决方案:
让代码帮我们每天定时提交,这样就可以省下精力取吹牛去了
好了,开始吧:
有两种思路,大概的描述一下如下:
一:定制一份模板的数据,每个月或者每个星期,让它自己的获取生成相应的数据,并提交.
二:采用交互的界面,这样就不要打开ie了,每天只要通过命令行就可以搞定.
首先看登陆:
1def login(self):
2 """
3 登陆
4 """
5 loginparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
6 'UPC_REQUEST_URI':'*.do','UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
7
8 self.pform = urllib.urlopen(self.url,loginparams)
9
2 """
3 登陆
4 """
5 loginparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
6 'UPC_REQUEST_URI':'*.do','UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
7
8 self.pform = urllib.urlopen(self.url,loginparams)
9
我们需要导入urllib. 传人登陆的参数即可,如上面的loginparams.
调用
1urllib.urlopen(url[,params])
执行登陆.
其次:解析登陆完毕,从数据库种返回的内容,工号,姓名,部门,单位,地点,等等.
换一种方式也就是说,运用regex在html种解析,得到数据库范户的数据.
导入我们需要的re.
1def parse(self):
2 """
3 解析登陆完成的HTML页面,获取用户相应的信息
4 """
5 content = ' '.join(self.pform.readlines())
6 items = ["employeeName","department","workArea","workCity","fillInDate"]
7 for item in items:
8 pattern = "name=""+item+""s*(size="d*")?s*value="(S*(s*S*)?)""
9 matcher = re.search(pattern,content)
10
11 if matcher!=None:
12 self.item = matcher.groups()[1]
2 """
3 解析登陆完成的HTML页面,获取用户相应的信息
4 """
5 content = ' '.join(self.pform.readlines())
6 items = ["employeeName","department","workArea","workCity","fillInDate"]
7 for item in items:
8 pattern = "name=""+item+""s*(size="d*")?s*value="(S*(s*S*)?)""
9 matcher = re.search(pattern,content)
10
11 if matcher!=None:
12 self.item = matcher.groups()[1]
regex这一部分,不明白,可以参考这里http://docs.python.org/lib/module-re.html.
好了,下一步就是提交我们的日报:
1def post(self):
2 """
3 提交日报
4 """
5 posturl = 'http://host/*.do'
6
7 f = open(dataFileName)
8 contents = f.readlines()
9
10 #读取data文件,判断是否采用交互界面,还是采用data文件的数据
11 if contents[0]=='n':
12 c = raw_input('是否采用提交当天日志(y/n)?:')
13 if c!='y':
14 self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')
15
16 projectId = raw_input('项目名称代码:')
17 workId = raw_input('具体事项:')
18 workContent = raw_input('工作内容:')
19 workNum = raw_input('正常工作时长:')
20 overtimeNum = raw_input('加班工作时长:')
21 else:
22
23 #是否采用文件中的时间,如果不采用,则采用当前时间
24 if contents[1]=='y':
25 self.fillInDate = contents[2]
26
27 projectId = contents[3]
28 workId = contents[4]
29 workContent = contents[5]
30 workNum = contents[6]
31 overtimeNum = contents[7]
32
33 #拼凑参数 o_o
34 postparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
35 'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG',
36 'employeeId':self.username,'employeeName':self.employeeName,
37 'department':self.department,'workArea':self.workArea,'workCity':self.workCity,'fillInDate':self.fillInDate,
38 'detailList[0].projectId':projectId,'detailList[0].workId':workId,
39 'detailList[0].workContent':workContent,'detailList[0].workNum':workNum,'detailList[0].overtimeNum':overtimeNum})
40
41 #提交
42 result = urllib.urlopen(posturl,postparams)
43 #todo:解析提过完成页面,获取信息
44 #
45 result.close()
46
2 """
3 提交日报
4 """
5 posturl = 'http://host/*.do'
6
7 f = open(dataFileName)
8 contents = f.readlines()
9
10 #读取data文件,判断是否采用交互界面,还是采用data文件的数据
11 if contents[0]=='n':
12 c = raw_input('是否采用提交当天日志(y/n)?:')
13 if c!='y':
14 self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')
15
16 projectId = raw_input('项目名称代码:')
17 workId = raw_input('具体事项:')
18 workContent = raw_input('工作内容:')
19 workNum = raw_input('正常工作时长:')
20 overtimeNum = raw_input('加班工作时长:')
21 else:
22
23 #是否采用文件中的时间,如果不采用,则采用当前时间
24 if contents[1]=='y':
25 self.fillInDate = contents[2]
26
27 projectId = contents[3]
28 workId = contents[4]
29 workContent = contents[5]
30 workNum = contents[6]
31 overtimeNum = contents[7]
32
33 #拼凑参数 o_o
34 postparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
35 'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG',
36 'employeeId':self.username,'employeeName':self.employeeName,
37 'department':self.department,'workArea':self.workArea,'workCity':self.workCity,'fillInDate':self.fillInDate,
38 'detailList[0].projectId':projectId,'detailList[0].workId':workId,
39 'detailList[0].workContent':workContent,'detailList[0].workNum':workNum,'detailList[0].overtimeNum':overtimeNum})
40
41 #提交
42 result = urllib.urlopen(posturl,postparams)
43 #todo:解析提过完成页面,获取信息
44 #
45 result.close()
46
当然,现在的data文件格式比较简单,我们可以做的更实用一点,采用key=value的形式,或者其他.
fun.data的样子如下:
y n 0 JX00001 WK00022 稽查需求分析 0 8
第一行:是否采用当前data文件数据
第二行:是否采用自定义时间,如果不采用,第三行忽略,如果采用,时间即为第三行的值
第四行,第五行,第六行,日报具体的东西,不谈了.
第七行:正常工作时间
第八行:加班时间
完整代码如下:
1#!/usr/bin/python
2# -*- coding: UTF-8 -*-
3
4import urllib
5import os
6import re
7
8class Fun:
9 def __init__(self,username,password,times=1,
10 dataFileName='fun.data',
11 url='http://host/login.ctl',
12 proxies={'http': ip:port'},pform=None):
13 self.username=username
14 self.password=password
15 self.times = times
16 self.url=url
17 self.proxies=proxies
18 self.pform=pform
19 self.employeeName=''
20 self.department=''
21 self.workArea=''
22 self.workCity=''
23 self.fillInDate=''
24 self.dataFileName=dataFileName
25
26 def login(self):
27 """
28 登陆
29 """
30 loginparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
31 'UPC_REQUEST_URI':'*.do','UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
32 self.pform = urllib.urlopen(self.url,loginparams)
33 self.parse()
34
35 def parse(self):
36 """
37 解析登陆完成的HTML页面,获取用户相应的信息
38 """
39 content = ' '.join(self.pform.readlines())
40 items = ["employeeName","department","workArea","workCity","fillInDate"]
41 for item in items:
42 pattern = "name=""+item+""s*(size="d*")?s*value="(S*(s*S*)?)""
43 matcher = re.search(pattern,content)
44
45 if matcher!=None:
46 self.item = matcher.groups()[1]
47
48 def post(self):
49 """
50 提交日报
51 """
52 posturl = 'http://host/*.do'
53
54 f = open(dataFileName)
55 contents = f.readlines()
56
57 #读取data文件,判断是否采用交互界面,还是采用data文件的数据
58 if contents[0]=='n':
59 c = raw_input('是否采用提交当天日志(y/n)?:')
60 if c!='y':
61 self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')
62
63 projectId = raw_input('项目名称代码:')
64 workId = raw_input('具体事项:')
65 workContent = raw_input('工作内容:')
66 workNum = raw_input('正常工作时长:')
67 overtimeNum = raw_input('加班工作时长:')
68 else:
69
70 #是否采用文件中的时间,如果不采用,则采用当前时间
71 if contents[1]=='y':
72 self.fillInDate = contents[2]
73
74 projectId = contents[3]
75 workId = contents[4]
76 workContent = contents[5]
77 workNum = contents[6]
78 overtimeNum = contents[7]
79
80 #拼凑参数 o_o
81 postparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
82 'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG',
83 'employeeId':self.username,'employeeName':self.employeeName,
84 'department':self.department,'workArea':self.workArea,'workCity':self.workCity,'fillInDate':self.fillInDate,
85 'detailList[0].projectId':projectId,'detailList[0].workId':workId,
86 'detailList[0].workContent':workContent,'detailList[0].workNum':workNum,'detailList[0].overtimeNum':overtimeNum})
87
88 #提交
89 result = urllib.urlopen(posturl,postparams)
90 #todo:解析提过完成页面,获取信息
91 #
92 result.close()
93
94
2# -*- coding: UTF-8 -*-
3
4import urllib
5import os
6import re
7
8class Fun:
9 def __init__(self,username,password,times=1,
10 dataFileName='fun.data',
11 url='http://host/login.ctl',
12 proxies={'http': ip:port'},pform=None):
13 self.username=username
14 self.password=password
15 self.times = times
16 self.url=url
17 self.proxies=proxies
18 self.pform=pform
19 self.employeeName=''
20 self.department=''
21 self.workArea=''
22 self.workCity=''
23 self.fillInDate=''
24 self.dataFileName=dataFileName
25
26 def login(self):
27 """
28 登陆
29 """
30 loginparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
31 'UPC_REQUEST_URI':'*.do','UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG'})
32 self.pform = urllib.urlopen(self.url,loginparams)
33 self.parse()
34
35 def parse(self):
36 """
37 解析登陆完成的HTML页面,获取用户相应的信息
38 """
39 content = ' '.join(self.pform.readlines())
40 items = ["employeeName","department","workArea","workCity","fillInDate"]
41 for item in items:
42 pattern = "name=""+item+""s*(size="d*")?s*value="(S*(s*S*)?)""
43 matcher = re.search(pattern,content)
44
45 if matcher!=None:
46 self.item = matcher.groups()[1]
47
48 def post(self):
49 """
50 提交日报
51 """
52 posturl = 'http://host/*.do'
53
54 f = open(dataFileName)
55 contents = f.readlines()
56
57 #读取data文件,判断是否采用交互界面,还是采用data文件的数据
58 if contents[0]=='n':
59 c = raw_input('是否采用提交当天日志(y/n)?:')
60 if c!='y':
61 self.fillInDate = raw_input('请输入提交日期(格式yyyy-mm-dd):')
62
63 projectId = raw_input('项目名称代码:')
64 workId = raw_input('具体事项:')
65 workContent = raw_input('工作内容:')
66 workNum = raw_input('正常工作时长:')
67 overtimeNum = raw_input('加班工作时长:')
68 else:
69
70 #是否采用文件中的时间,如果不采用,则采用当前时间
71 if contents[1]=='y':
72 self.fillInDate = contents[2]
73
74 projectId = contents[3]
75 workId = contents[4]
76 workContent = contents[5]
77 workNum = contents[6]
78 overtimeNum = contents[7]
79
80 #拼凑参数 o_o
81 postparams = urllib.urlencode({'j_username':self.username,'j_password':self.password,
82 'UPC_LOGIN_FLAG':'UPC_LOGIN_FLAG',
83 'employeeId':self.username,'employeeName':self.employeeName,
84 'department':self.department,'workArea':self.workArea,'workCity':self.workCity,'fillInDate':self.fillInDate,
85 'detailList[0].projectId':projectId,'detailList[0].workId':workId,
86 'detailList[0].workContent':workContent,'detailList[0].workNum':workNum,'detailList[0].overtimeNum':overtimeNum})
87
88 #提交
89 result = urllib.urlopen(posturl,postparams)
90 #todo:解析提过完成页面,获取信息
91 #
92 result.close()
93
94
相关推荐
create or replace procedure test_msg(i_user in varchar2, o_msg out varchar2) is begin o_msg := i_user ||', Good Morning!'; end; 然后,开始在Python命令行中进行存储过程调用。 import cx_Oracle as cx ...
至于"python_mmio"标签,这可能指的是Python内存映射输入/输出(Memory-Mapped I/O)。在某些情况下,直接使用MMIO可以提高与硬件设备通信的效率,特别是在处理低级别的I/O操作时。不过,在DHT传感器的使用中,通常不...
这些实验可能涉及输入输出、字符串操作、列表和元组的使用、字典和集合的操作、文件I/O等基础知识。更高级的主题可能包括模块导入、异常处理、面向对象编程、装饰器、生成器以及Python标准库和第三方库的使用,比如...
Tornado则以其异步I/O模型和高性能而闻名,适合高并发场景。 2. **服务器搭建**:Python自带的HTTP服务器模块`http.server`可以快速启动一个简单的HTTP服务器,用于本地测试。但对于生产环境,通常会使用更专业的...
在实际应用中,为了提高效率和简化代码,可以使用Python的`asyncio`库来实现异步TCP服务器,利用事件循环和协程实现非阻塞I/O,从而在单线程中实现高效的并发处理。 总结,通过Python的socket和threading模块,我们...
其非阻塞I/O模型使得它可以处理大量的并发连接。 2. **TCP基础**:TCP是传输层协议,提供可靠的数据传输,通过三次握手建立连接,四次挥手断开连接。TCP保证数据包按顺序到达,且在网络异常时可以重传丢失的数据。 ...
不过,如果你需要下载大量的文件或者大文件,可能会考虑使用多线程或异步I/O来提高效率。Python的`concurrent.futures`模块提供了线程池和进程池,可以帮助我们实现这一目标。例如,你可以创建一个线程池并提交任务...
6. **文件和I/O操作**: 文件的读写操作、文件对象的使用、文本与二进制的区别、序列化和反序列化(pickle模dule)等都是Python开发者必备的知识。 7. **模块和包的管理**: 讲解如何有效地组织代码,创建模块...
Jones合著的一本经典Python编程参考书,由O'Reilly Media出版。这本书旨在为Python程序员提供实用的代码片段和解决方案,覆盖了从基础到高级的各种编程问题。它不仅是初学者学习Python语言的宝贵资源,也是经验丰富...
10. 八进制数字的表示方式改变,`0o`前缀用于表示八进制,`oct()`函数的输出格式也相应调整。 11. 引入了二进制字面量和`bin()`函数。 12. 扩展的可迭代解包,允许使用星号解包列表和其他可迭代对象。 13. 新的`...
5. **并发处理**:为了处理多个同时在线的用户,服务器端可能需要使用多线程或多进程,或者使用非阻塞I/O模型如asyncio库。 6. **错误处理**:良好的错误处理机制是必不可少的,包括网络中断、无效消息处理等。 ...
删除IDA 7.0目录\python\sip.pyd 删除IDA 7.0目录\python\PyQt5目录 比如你的python安装目录是C:\python27-x64 添加环境变量 PYTHONHOME=C:\python27-x64 QT_QPA_PLATFORM_PLUGIN_PATH=C:\python27-x64\Lib\site-...
6. **文件操作**:Python提供了方便的文件I/O接口,包括读写文本文件、二进制文件、追加模式等,学会这些能实现数据持久化。 7. **标准库与第三方库**:Python拥有强大的标准库,如urllib、requests用于网络请求,...
通过`asyncio`库,开发者可以编写异步代码,实现非阻塞I/O,优化网络服务和多任务应用。 ### 多线程与多进程 Python提供了`threading`和`multiprocessing`库来实现多线程和多进程。多线程适用于CPU密集型任务,而...
Timsort能在O(n log n)的时间复杂度内完成排序,对于已经部分有序的数据,其效率更高。 除了内置的排序方法,Python还允许用户自定义排序的关键字,通过`key`参数实现。例如,如果我们要根据字符串长度进行排序,...
4. 文件I/O:了解如何在Python中读写文件,特别是处理TexGen的特定格式。 5. 编织算法:设计和实现算法来生成复杂的三维编织模式。 6. 数学和几何知识:理解和应用线性代数,理解3D空间中的坐标系统和几何变换。 ...
"python 异步"表明这个框架利用了Python的异步特性,如asyncio库,以实现高效的网络I/O操作。"网络协议"则暗示这个框架可能支持多种网络协议,如TCP/IP、HTTP等,允许开发者构建基于这些协议的应用。 在Python中,...
4. **Python文件操作**:如果数据存储在文件中而非直接在数据库中,那么`open()`函数和文件I/O操作会有所涉及。`pandas`库也支持直接从CSV、Excel等文件中读写数据。 5. **多线程(threading模块)**:标签中的...