博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用urllib和http.cookiejar获取python老男孩学员成绩
阅读量:6896 次
发布时间:2019-06-27

本文共 3929 字,大约阅读时间需要 13 分钟。

打开 鼠标右键查看源代码,可以看到我们需要post的name。如下:

 

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

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

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

具体代码如下:

#!/usr/bin/env python3__author__ = 'DSOWASP'#encoding:UTF-8import urllibimport urllib.parseimport http.cookiejarimport urllib.requestimport prettytableimport collections# urllib.request.urlopen(url) 返回 http.client.HTTPResponse 对象# 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookiecj = 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)# 获取csrfmiddlewaretokendata = h.read().decode('UTF-8')for i in data.split('\n'):    # 
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)) #
data = data2.read() data = data.decode('UTF-8') data = data.split('\n') # p_chegnji 如果遇到''则为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 '' == 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)

 

输出结果:

转载于:https://www.cnblogs.com/owasp/p/5491054.html

你可能感兴趣的文章
通过CImageList加载图标 报错
查看>>
古老的CSS同高列问题
查看>>
纯小白入手 vue3.0 CLI - 3.2 - 路由的初级使用
查看>>
注解 @EnableFeignClients 工作原理
查看>>
项目完工后,常用技术点小结
查看>>
安卓开发笔记——探索EventBus(转)
查看>>
Python开发一个csv比较功能相关知识点汇总及demo
查看>>
最大后验估计(map)——转自可乐LL
查看>>
【翻译】热门支持技巧
查看>>
疯狂ios讲义之实现游戏逻辑(3)
查看>>
JFreeChart开源图表组件在Java开发中的应用(二)
查看>>
linux中如何查询端口被占用的情况
查看>>
6425C-Lab14 域服务的连续性
查看>>
Logminer实战
查看>>
桌面虚拟化之PCoIP访问协议会话统计功能
查看>>
在.NET开发中的单元测试工具之(1)——NUnit
查看>>
Oracle 多表 连接 顺序 与 性能关系 测试
查看>>
MFCProperty
查看>>
社区、标签-jsp中获取状态怎么写?-by小雨
查看>>
jquery UI datepicker时间控件的使用
查看>>