Python3.6下使用会话session保持登陆状态
本次工具主要利用python easygui模块的inputbox让用户首次输入登陆信息,作为网站requests-post请求的data字段,观察XHR(异步加载)的数据包,构造post请求,利用requests库的session功能保持登陆状态,进而请求其他子页下的所需信息,最终爬取到本地excel文件中。
我们手工登陆后,网站会进行跳转,通过浏览器F12查看network页签,logindo页面可以看到登陆后服务器在response headers栏 有set-cookie:

但是网站登陆redirect后的页面并没有看到:response.cookies;

如果利用response.cookies将得到一个空的RequestsCookieJar对象,无法为后续的信息爬取提供cookies字段放入headers栏,此时可以考虑用response.session保持首次登陆状态,后续服务器端在session有效期内不会再要求页面传入登陆信息,主要代码如下,:
import requests,json,easygui,os,sys,math,time
from openpyxl import load_workbook
msg = "请输入OA用户名和密码"
title = "用户登录入口"
user_info = []
user_info = easygui.multpasswordbox(msg,title,("用户名","密码"))
start = time.time()
pwd = os.getcwd() wb = load_workbook(filename=pwd+u"\\info_list.xlsx")
sheet=wb[u"参数"] base_url='http://******.com/srm/supplier/Criteria.do' loginData={'redirect':'','username':user_info[0],'password':user_info[1]}
#下面的data-search字典中,condition键其实就是Oracle数据库的select条件在网页中的集成形式,通过设置exp表达式以及value等,可以灵活的查询,突破页面集成的查询默认条件限制。
data_search={
'page':1,#控制请求的页面数
'rows':100,#控制每页显示的行数
'condition':'[{"orConditionList":[{"column":"S.S_SUPPLIER_NO","exp":"like","value":"00001"}]},{"column":"S.S_SUPPLIER_NO","orderType":"default","orderKey":"","direction":"DESC"}]',
'additionalParams':'{}'
}
s=requests.session()
def login(s,loginData,data_search):
try:
response=s.post('http://******.com/portal/u/a/login.do',loginData)
if response.status_code==200:
print("login_success")
except requests.ConnectionError as e:
print('Error',e.args)
def getjson(s,base_url,data_search):
try:
response=s.post(base_url,data_search)
if response.status_code==200:
#print("vendor_info_yes")
return response.json()
except requests.ConnectionError as e:
print('Error',e.args) if __name__ == "__main__":
ss=login(s,loginData,data_search)
page=getjson(s,base_url,data_search) maxNum=math.ceil(page['total']/100) #计算出总的信息显示所需页面数
for pageNum in range(1,500):
if pageNum==maxNum+1:
wb.save(filename=pwd+u"\\info_list.xlsx") #最后一页写完后,进行保存excel操作
end = time.time()
time.sleep(2)
sys.exit(0)
data_search['page']=pageNum #修改字典的‘page’键对应值,逐页请求服务器数据
page=getjson(s,base_url,data_search)
listlen=len(page['rows']) #由于最后一次得到的行数不见得是100行,所以需要动态获取列表长度,作为循环次数的依据。
for i in range(listlen): #对请求后得到的json文件进行解析,类似于字典,字典中含有列表,需要注意,当部分字段为空时,字典中部分元素可能不存在,需要判断字典。 sheet['A%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['supplierNo']
sheet['B%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['companyName']
if 'linkMan1' in page['rows'][i].keys():
sheet['C%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['linkMan1']
if 'phone1' in page['rows'][i].keys():
sheet['D%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['phone1']
if 'email1' in page['rows'][i].keys():
sheet['E%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['email1']
if 'legalRepresentative' in page['rows'][i].keys():
sheet['F%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['legalRepresentative']
if 'email2' in page['rows'][i].keys():
sheet['G%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['email2']
print(pageNum)
该程序还有一个可以完善的地方:就是封装后给用户使用时不够直观,需要利用Tkinter等制作简易gui进度条百分比及剩余时间展示。
Python3.6下使用会话session保持登陆状态的更多相关文章
- 简单PHP会话(session)说明
现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...
- php会话(session)生命周期概念介绍及设置更改和回收
http://www.169it.com/article/8429580816135935852.html https://my.oschina.net/jiec/blog/227252 sessi ...
- http 会话(session)详解
会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- .Net core 使用特性Attribute验证Session登陆状态
1.新建一个.net core mvc项目 2.在Models文件夹下面添加一个类MyAttribute,专门用来保存我们定义的特性 在这里我只写了CheckLoginAttribute用来验证登陆情 ...
- 网络基础 http 会话(session)详解
http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...
- 在tomcat集群下利用redis实现单点登陆
场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到 ...
- Java通过遍历sessionId获取服务器所有会话session
Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...
- 使用SpringSession管理分布式系统的会话Session
在我方供应链项目分布式部署的环境下,需要在统一网关服务中管理访问的Session,即无论访问请求路由到哪一个网关服务环境,使用的都是相同的HttpSession,这样就保证了在用户登录之后,能够使用统 ...
随机推荐
- d3.js 根据需求定制pie图饼图
参考网址: http://d3pie.org/#generator 用法: 1.在网址中,跟着步骤,设置样式和效果,最后获取pie的option格式 2.引入d3.min.js和d3pie.min.j ...
- 命名空间与Autoload
命名空间是为了防止函数名冲突 当php编译器找到未定义类时,就会自动去调用__autoload($class)这个函数,$class就代表这个未定义的类名相对于当前项目根目录所在路径 php5.3 ...
- IIS Asp.Net 访问 Com组件 报拒绝访问
IIS Asp.Net 访问 Com组件 报拒绝访问 解决方法: IIS 程序池->高级设置->进程模式->标识->内置帐户=LocalSystem
- com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'id' at row 1
1.存储的值超过了字段长度.调整数据库中的字段长度 2,变更字段字符集编码为utf8
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [替罪羊树]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- [No0000167]CPU内部组成结构及指令执行过程
计算机的基本硬件系统由运算器.控制器.存储器和输入.输出设备五大部件组成.运算器和控制器等部件被集成在一起统称为中央处理单元(Central Processing Unit,CPU). CPU的功能 ...
- 深入 Vue 生命周期
深入 Vue 生命周期 这篇博客将会从下面四个常见的应用诠释组件的生命周期,以及各个生命周期应该干什么事 1.单组件的生命周期 2.父子组件的生命周期 3.兄弟组件的生命周期 4.宏mixin的生命周 ...
- PE/ELF文件里面存的是什么呢?
malloc分配的空间是连续的吗?PE/ELF文件里面存的是什么呢?
- 终于碰到iOS对象集合深拷贝的坑
从原始数组,拆分排列组合成新数组,同时给新的数组中的模型元素追加字段,数组的容量翻倍,如果不用深拷贝,后面追加的值就把前面的值覆盖了 UnitModel *model1 = [UnitModel ne ...
- django上下文处理器
上下文处理器(context processors)上下文处理器是可以返回一些数据,在全局模板中都可以使用.比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每 ...