rainyzz's blog

用python模拟提交表单

之前做的空教室查询的系统,我所获得的数据都是直接从教务处上一个个手动下载下来的,一直想做一个自动的版本,一直不知道怎么做,在看了python后发现,标准库里就有自带的函数,很方便。

下面就是我们学校查询课表的表单的精简形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<form name="" id="" action="http://202.118.31.197/ACTIONQUERYCLASSROOMSCHEDULE.APPPROCESS?mode=2&query=1&YearTermName=2011-2012学年第二学期" method="post" target="">
<select name="RoomTypeNO" id="RoomTypeNO">
<option value="">全部</option>
<option value="19">不排课教室</option>
<option value="17">成教机房</option>
<option value="28">大厅</option>
<option value="07" selected="">多功能</option>
</select>
<select name="StoryNO" id="StoryNO">
<option value="">全部</option>
<option value="0000" selected="">1#教学楼</option>
<option value="0007">采矿馆 </option>
<option value="8007">采矿馆(网络)</option>
</select>
<select name="YearTermNO" id="YearTermNO" style=" width:99%">
<option value="12" selected="">2011-2012学年第二学期</option>
</select>
<select name="ClassRoomNO" id="ClassRoomNO" style="width:98%">
<option value="">全部</option>
<option value="000007113" selected="">000007113[1#楼113]</option>
<option value="000007111">000007111[1#楼111]</option>
<option value="000007109">000007109[1#楼109]</option>
<option value="000007105">000007105[1#楼105]</option>
</select>
<input type="submit" name="querySchedule" value="查询" >
</form>

关键还是看form的method和action(即表单要提交给的网页)
接下来用urllib的urlencode方法,参数可以是二元组的列表,也可以是字典的形式,构造出表单中的提交项和对应的值,然后使用urlopen方法就可以像打开普通文件一样处理提交后转到的网页的数据了

1
2
3
4
5
6
7
8
# -*- coding: utf-8 -*-
import sys,re
import urllib,urllib2
url = "http://202.118.31.197/ACTIONQUERYCLASSROOMSCHEDULE.APPPROCESS?mode=2&query=1&YearTermName=2011-2012%D1%A7%C4%EA%B5%DA%B6%FE%D1%A7%C6%DA"
params = urllib.urlencode([('RoomTypeNO', '07'), ('StoryNO', '0000'),( 'YearTermNO', '12'),('ClassRoomNO', '000007113')])
req = urllib2.Request(url)
f = urllib2.urlopen(req,params)
print f.read()

然后通过正则表达式就可以提取网页数据等等,上例中是post方法提交的,get也差不了多少