本次工具主要利用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. day_5.28 py网络编程

    端口 socket简介: socket为一个类   s接收的是返回的对象引用 2018-5-28 15:52:47 开始进行网络编程 udp 套接字 encode() 编码 decode() 解码 ' ...

  2. 命名空间与Autoload

    命名空间是为了防止函数名冲突 当php编译器找到未定义类时,就会自动去调用__autoload($class)这个函数,$class就代表这个未定义的类名相对于当前项目根目录所在路径   php5.3 ...

  3. git rebase 操作撤销

    git rebase可以更改提交历史,在不影响别人的情况下,能够重整git树. 但如果git rebase操作失误,却在push后才发现,怎么撤销rebase操作呢? 使用git reflog + g ...

  4. LIBXML2库使用指南2

    3. 简单xml操作例子 http://blog.sina.com.cn/s/blog_4673bfa50100b0xj.html 了解以上基本知识之后,就可以进行一些简单的xml操作了.当然,还没有 ...

  5. asp.net利用存储过程分页代码

    -最通用的分页存储过程 -- 获取指定页的数据 CREATE PROCEDURE Pagination ), -- 表名 ) = '*', -- 需要返回的列 )='', -- 排序的字段名 , -- ...

  6. thinkphp 点击某个class提交post值,返回回来用一个弹窗插件,提示返回来要说的话

    下一篇文章有讲到弹窗插件的怎么使用,自写教程 如果能帮到你,给点个赞鼓励一下 <=============  控制器  =================> public function ...

  7. LeetCode 112 Minimum Depth of Binary Tree

    Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...

  8. Navicat工具、pymysql模块 sql注入

    cls超 Navicat工具.pymysql模块 阅读目录 一 IDE工具介绍 二 pymysql模块 一 IDE工具介绍(Navicat) 生产环境还是推荐使用mysql命令行,但为了方便我们测试, ...

  9. [No0000FB]C# 命名空间(Namespace)

    命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式.在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突. 定义命名空间 命名空间的定义是以关键字 namespace  ...

  10. sklearn的K折交叉验证函数KFold使用

    K折交叉验证时使用: KFold(n_split, shuffle, random_state) 参数:n_split:要划分的折数 shuffle: 每次都进行shuffle,测试集中折数的总和就是 ...