打开http://crm.oldboyedu.com/crm/grade/single/ 鼠标右键查看源代码,可以看到我们需要post的name。如下:

这里需要在post试提交token和search_str的值,这里的token应该使用时效性的。可以一次获取,短时间内多次使用。

在没有使用cookie时提交数据报错:

这里需要加上cookie本地存储。

具体代码如下:

#!/usr/bin/env python3
__author__ = 'DSOWASP'
#encoding:UTF-8
import urllib
import urllib.parse
import http.cookiejar
import urllib.request
import prettytable
import collections # urllib.request.urlopen(url) 返回 http.client.HTTPResponse 对象 # 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj = http.cookiejar.LWPCookieJar()
cookies_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookies_support,urllib.request.HTTPHandler)
urllib.request.install_opener(opener) # get
#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
# 获取网站内容
url = "http://crm.oldboyedu.com/crm/grade/single/"
h = urllib.request.urlopen(url) # 获取csrfmiddlewaretoken
data = h.read().decode('UTF-8')
for i in data.split('\n'):
# <form class="col-xs-12 col-sm-10 col-sm-offset-1" method="post" action="/crm/grade/single/"><input type='hidden' name='csrfmiddlewaretoken' value='QKNMJKS49GvbVBdBzADwFT2HuHxIUUcP' />
if "csrfmiddlewaretoken" in i:
i = i.strip().split('value')
m = i[1].split('\'')
token = m[1] #构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
# header_dict={'User-Agent':\
# 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko'} # qq列表,为了隐私,这里已将qq号删除
qq_list = [
'xxxxx','yyyyy',...
]
# 学号列表
xuehao_list = [
'1','2','3','4','5',
'6','7','8','9','10','11','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'
] chengji_list = collections.OrderedDict() #构造Post数据,他也是从抓大的包里分析得出的。 for qq in qq_list:
post = {}
post['search_str'] = qq
post['csrfmiddlewaretoken'] = token
# 成绩列表默认为空
chengji_list[qq] = []
#需要给Post数据编码
post_data = urllib.parse.urlencode(post).encode(encoding="utf-8")
# post
# req = urllib.request.Request(url,data=post_data,headers=header_dict)
req = urllib.request.Request(url,data=post_data)
data2 = urllib.request.urlopen(req)
# print(type(data2)) # <class 'http.client.HTTPResponse'>
data = data2.read()
data = data.decode('UTF-8')
data = data.split('\n')
# p_chegnji 如果遇到'<td>'则为True,下一行则就成绩。
p_chengji = False
for i in data:
i = i.strip()
if len(i) != 0:
if p_chengji == True:
chengji_list[qq].append(i)
p_chengji = False
# 获取成绩的的代码需要根据实际网页放回的源码而定。可以右键查看源代码来分析一种较好的方法获取到想要的值。
if '<td>' == i:
p_chengji = True
# 上课天数或网页上已展示的成绩列数
l = len(chengji_list[qq_list[0]])
# 打印模块头部
PrettyTlist = ['学号','QQ']
# 根据已展示的天数来扩充打印模块头部
for i in range(l):
i = i + 1
PrettyTlist.append('Day%d'%i)
# 添加打印模块头部'总分'
PrettyTlist.append('总分')
# 实例化打印头部
a = prettytable.PrettyTable(PrettyTlist) # 总成绩列表,qq:总成绩
sumc_chengji_list = {}
for xueyuan,grade in chengji_list.items():
if grade != []:
sumc = 0
for i in grade:
if i == 'A+':
sumc += 100
elif i == 'A':
sumc += 90
elif i == 'B+':
sumc += 85
elif i == 'B':
sumc += 80
elif i == 'B-':
sumc += 70
elif i == 'C+':
sumc += 60
elif i == 'C':
sumc += 50
elif i == 'C-':
sumc += 40
else:
sumc += 0
else:
# 如果查不到学员的成绩
sumc = 0
for i in range(l):
chengji_list[xueyuan].append('N/A')
chengji_list[xueyuan].append(sumc)
sumc_chengji_list[xueyuan]=sumc
# [(qq,总成绩),()]
# sorted,把items()的值给lamdba,asd[0] 为qq号,asd[1]为总成绩,key表示排序的列,resverse 为True表示降序 # sorted(dic,value,reverse)
# dic为比较函数,value 为排序的对象(这里指键或键值),
# reverse:注明升序还是降序,True--降序,False--升序(默认) sort_chengji_list = sorted(sumc_chengji_list.items(),key = lambda asd:asd[1],reverse = True) # 生成打印列表
for xueyuan,grade in sort_chengji_list:
add_row = [xuehao_list[qq_list.index(xueyuan)],xueyuan]
for i in chengji_list[xueyuan]:
add_row.append(i)
a.add_row(add_row)
print(a)

输出结果:

使用urllib和http.cookiejar获取python老男孩学员成绩的更多相关文章

  1. urllib的实现---timeout,获取http响应码,重定向,proxy的设置

    1.Timeout设置超时 只能修改Socket设置全局Timeout #! /usr/bin/env python3 import socket import urllib.request # ti ...

  2. php使用CURL不依赖COOKIEJAR获取COOKIE的方法

    本文实例讲述了php使用CURL不依赖COOKIEJAR获取COOKIE的方法.分享给大家供大家参考.具体分析如下: PHP中CURL类是一个非常牛逼的工具类,具体怎么牛逼就不啰嗦了. 对于COOKI ...

  3. 获取python的版本

    import sys # Syntax sugar. _ver = sys.version_info # 获取python版本 #: Python 2.x? is_py2 = (_ver[0] == ...

  4. python作业学员管理系统(第十二周)

    作业需求: 用户角色,讲师\学员, 用户登陆后根据角色不同,能做的事情不同,分别如下 讲师视图 管理班级,可创建班级,根据学员qq号把学员加入班级 可创建指定班级的上课纪录,注意一节上课纪录对应多条学 ...

  5. Day_11【集合】扩展案例1_遍历打印学生信息,获取学生成绩的最高分,获取成绩最高的学员,获取学生成绩的平均值,获取不及格的学员数量

    分析以下需求,并用代码实现: 1.按照以下描述完成类的定义 学生类 属性: 姓名name 年龄age 成绩score 行为: 吃饭eat() study(String content)(content ...

  6. Python——urllib函数网络文件获取

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. 智联招聘获取python岗位的数据

    import requests from lxml import html import time import pandas as pd from sqlalchemy import create_ ...

  8. b站滑动验证码图片的获取-python

    本文仅是获取验证码图片,python+selenium实现 图片的处理,算出偏移位置网上都有现成的:而由于b站的更新,图片的获取则与之前完全不同,不能直接从html中拿到 过程比较曲折所以记录一下,可 ...

  9. 获取Python安装目录

    >>> import sys>>> path=sys.executable>>> print (path)C:\Users\jumz-G\AppD ...

随机推荐

  1. 301 MovedPermanently 重定向

    页面永久性移走(301重定向)是一种非常重要的“自动转向”技术. 301重定向可促进搜索引擎优化效果 从搜索引擎优化角度出发,301重定向是网址重定向最为可行的一种办法.当网站的域名发生变更后,搜索引 ...

  2. Job-Show Liang,你来掌管诺基亚王国,可好?

    保留我一向高大上风格,开头当然来一个段子 在即将到来MWC(Mobile World Congress缩写,世界移动通信大会),很高兴能听到小诺来参展,我不得不给它32个赞,因为小诺已经好几届没有浮头 ...

  3. C# 中请使用Contains判断字符串是否包含另一段字符串

    ∵ :使用Contains 比 IndexOf 的性能要高很多. 因为 Contains 是判断某个字符串是否在该字符串里面,而IndexOf是返回对应下标值 但是在使用contains的时候,注意转 ...

  4. 【C#】LINQ

    一.什么是LINQ 长期以来,开发社区形成以下的格局: 1.面向对象与数据访问两个领域长期分裂,各自为政. 2.编程语言中的数据类型与数据库中的数据类型形成两套不同的体系,例如: C#中字符串用str ...

  5. 【C#】CLR

    CLR是如何工作的 借用维基百科上的一副图来描述CLR的运行流程: 从源代码到应用程序执行CLR主要做了以下工作: 将源代码编译成托管模块 托管模块是一个标准的 32 位 Microsoft Wind ...

  6. Oracle大字段(clob)模糊查询优化方法

    对于内容很多的时候clob打字段模糊查询很慢,整理一个小方法: 1,在查询的列上建索引 2,对于要查询的clob字段使用一下语句创建索引   CREATE INDEX idx_zs_info_note ...

  7. 51 nod 1350 斐波那契表示

    每一个正整数都可以表示为若干个斐波那契数的和,一个整数可能存在多种不同的表示方法,例如:14 = 13 + 1 = 8 + 5 + 1,其中13 + 1是最短的表示(只用了2个斐波那契数).定义F(n ...

  8. 可以避免的10大IT面试误区

    在所有的面试过程当中,很多面试者都普遍犯了这样一个错误——由于对面试准备的不足,所以对于应聘公司的背景,以及一些最基本的信息都缺乏了解,有些面试者甚至对要面试的公司毫无所知.这些数据并不是空穴来风,A ...

  9. 在虚拟机中连接oracle数据库报错ORA-12154,其他服务器连接无问题

    在一台服务器上使用sqlplus登录oracle数据库,cmd->sqlplus->name/passwd@orcl2登录某个数据库用户,提示ORA-12154.使用当前服务器的PLSQL ...

  10. 泛型2(lambda表达式/参数绑定)

    lambda 表达式: Lambda表达式完整的声明格式如下: [capture list] (params list) mutable exception-> return type { fu ...