本次工具主要利用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保持登陆状态的更多相关文章

  1. 简单PHP会话(session)说明

    现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...

  2. php会话(session)生命周期概念介绍及设置更改和回收

    http://www.169it.com/article/8429580816135935852.html https://my.oschina.net/jiec/blog/227252  sessi ...

  3. http 会话(session)详解

    会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...

  4. Tensorflow会话Session

    转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...

  5. .Net core 使用特性Attribute验证Session登陆状态

    1.新建一个.net core mvc项目 2.在Models文件夹下面添加一个类MyAttribute,专门用来保存我们定义的特性 在这里我只写了CheckLoginAttribute用来验证登陆情 ...

  6. 网络基础 http 会话(session)详解

    http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...

  7. 在tomcat集群下利用redis实现单点登陆

    场景:比如说我们要实现一个集群环境,无非是把多个项目部署到多个tomcat下,然后按照一定的算法,轮询什么的随机访问多个tomcat服务器,但是问题也会有许多,比如说,我们最开始是把登陆人的信息存放到 ...

  8. Java通过遍历sessionId获取服务器所有会话session

    Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...

  9. 使用SpringSession管理分布式系统的会话Session

    在我方供应链项目分布式部署的环境下,需要在统一网关服务中管理访问的Session,即无论访问请求路由到哪一个网关服务环境,使用的都是相同的HttpSession,这样就保证了在用户登录之后,能够使用统 ...

随机推荐

  1. golang - interface的作用

    多态.struct 可以赋值给 interface.interface 可以转换成子接口,或者 struct. 请看go中的一段的源代码: listener, _ := net.Listen(&quo ...

  2. Zabbix监控MySQL免密码设置

    zabbix自带MySQL监控模板,配置文件在/etc/zabbix/zabbix_agentd.d userparameter_mysql.conf 如果MySQL不使用密码可以直接使用这个监控模板 ...

  3. Entity Framework DbSet<T>之Include方法与IQueryable<T>扩展方法Include的使用

    Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑 ...

  4. 深入理解无穷级数和的定义(the sum of the series)

    Given an infinite sequence (a1, a2, a3, ...), a series is informally the form of adding all those te ...

  5. MySQL命令:约束

    约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性.唯一性 约束分类: 约束类型与关键字: 主键      PRIMARY KEY 默认值  DEFAULT 唯一      UN ...

  6. 2012年蓝桥杯省赛A组c++第3题(喝断片的海盗)

    /* 有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒, 所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的, 再次重复...... 直到开了第4瓶酒,坐着的已经所剩无 ...

  7. Linux and Oracle常用目录详解

    目录详解 目录 内容 / 根目录,一切从这里开始 /bin 包含系统启动和运行所必需的二进制文件(程序) /boot 包含Linux内核.最初的RAM磁盘映像(系统启动时,驱动程序会用到),以及启动加 ...

  8. Celery 出现Process 'Worker-5' pid:5608 exited with 'exitcode 1' 问题

    起初我以为是进程PID文件问题,从新删除问题并未解决. 现已解决办法公布如下: pip install --upgrade billiard 原因:依赖的billiard库版本有点低,更新即可

  9. pandas之DataFrame

    DataFrame 类型类似于数据库表结构的数据结构,其含有行索引和列索引,可以将DataFrame 想成是由相同索引的Series组成的Dict类型.在其底层是通过二维以及一维的数据块实现. 1,D ...

  10. 让对象支持with语句

    一.with语句的好处 with语句的好处在于,它可以自动帮我们释放上下文,就比如文件句柄的操作, 如果你不使用with语句操作,你要先open一个文件句柄,使用完毕后要close这个文件句柄, 而使 ...