存档

2009年12月 的存档

python脚本抓取学位照信息

2009年12月27日 1 条评论

前两天学校里拍了学位照,在档案馆网站上可以看到自己照片了,由于只要学号和姓名信息,所以就写了个脚本把照片给全部抓下来了,主要用到了urllib2,urllib,汗,以前一直用很底层的httplib做东西,还有这次写了一下代码对浏览器如何操作整个请求过程有了比较深入的了解,脚本执行时需要同目录下有个数据文件,其中包含学号和姓名信息,用逗号隔开,代码如下:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import os
import urllib
import urllib2
import re
 
def save_image(dir,image_name,image):
    if not os.path.isdir(dir):
        os.makedirs(dir)
    try:
        image_file = open(dir + image_name,'wb')
    except IOError as (error, strerror):
        print "I/O error({0}):{1}".format(error,strerror)
    else:
        image_file.write(image)
        image_file.close()
 
def get_image(name,student_no,login_url,picture_url,pattern):
    #Parameter Information
    login_type = 'yes'
    #Configure opener to handle cookies
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
    urllib2.install_opener(opener)
    #Build Prameters
    params = urllib.urlencode({'xm':name,'xh':student_no,'login':login_type})
    #Open login html
    f = opener.open(login_url,params)
    login_html = f.read()
    f.close()
    #Search the image link
    m = re.search(pattern,login_html)
    if m is None:#The student hasn't taken picture
        return None
    else:
        #Get the image    
        match_part = m.group(1)
        f = opener.open(picture_url + match_part)
        image = f.read()
        return image
 
def grab_all():
    dir = r'D:\\temp\\'
    login_url = 'http://dawww.nju.edu.cn/xwz/login.asp'
    picture_url = 'http://dawww.nju.edu.cn/xwz/picture.asp'
    picture_pattern = 'src="picture.asp(\?i=\d+)"'
    try:
        software_student_file = open('software.txt','r')
    except IOError as (error, strerror):
        print "I/O error({0}):{1}".format(error,strerror)
    else:
        lines = software_student_file.readlines()
        for line in lines:
            line = line.rstrip('\n')
            name = line.split(',')[0]
            student_no = line.split(',')[1]
            image = get_image(name,student_no,login_url,picture_url,picture_pattern)
            if image is not None:
                save_image(dir,student_no + '_' + name + '.jpg',image)
                print student_no + '_' + name + '.jpg' + ' is saved'
        software_student_file.close()
 
if __name__ == "__main__":
    grab_all()
分类: 数据抓取 标签: , ,

如何控制frames的部分打印

2009年12月22日 没有评论

前两天要做一个页面的print button,但是网页是由两个frame构成的,而且其中的一个frame中包含了一个width很大的table,所以每次使用ie打印的时候都会将table的右部截去,但是FF打印的时候会自动缩放,T_T,由此可见ie的劣根性。。。

网上搜索了一下,大概有几种方法可以解决局部打印问题。

  1. 在html里面嵌入<!–start_pirnt–><!–end_print–>标签,然后使用js将要打印的部分取出,然后新打开一个窗口,将要打印的部分送入新窗口,onload事件里面写window.print即可,这样做了以后table就会全打出来了,但是这样做的用户体验不会太好,新开的窗口还需手动关上,但是我看了一下好几个大型网站的做法,在页面布局很复杂的情况下,按下print按钮,先会出来一个print preview的页面,然后再打印,这样也许给了用户适当的选择。
  2. 使用css控制要打印的内容,对不打印的部分加上<div class=”noprint”></div>,对要缩放的table加上id=zoom_table,然后css里面加上@media print{.noprint {display:none;} #zoom_talbe{zoom:70%}},这里要注意的是,zoom这个属性只有ie支持,这样就可以解决部分打印的问题了,自己使用的是第二种方法

这里还要注意的是如果不想把另外一个frame打印出来,则需window.parent.frame_name.print

    分类: 前台设计 标签: , , ,