本次工具主要利用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有效期内不会再要求页面传入登陆信息,主要代码如下,:

  1. import requests,json,easygui,os,sys,math,time
  2. from openpyxl import load_workbook
  3. msg = "请输入OA用户名和密码"
  4. title = "用户登录入口"
  5. user_info = []
  6. user_info = easygui.multpasswordbox(msg,title,("用户名","密码"))
  7. start = time.time()
  8. pwd = os.getcwd()
  9.  
  10. wb = load_workbook(filename=pwd+u"\\info_list.xlsx")
  11. sheet=wb[u"参数"]
  12.  
  13. base_url='http://******.com/srm/supplier/Criteria.do'
  14.  
  15. loginData={'redirect':'','username':user_info[0],'password':user_info[1]}
    #下面的data-search字典中,condition键其实就是Oracle数据库的select条件在网页中的集成形式,通过设置exp表达式以及value等,可以灵活的查询,突破页面集成的查询默认条件限制。
  16. data_search={
  17. 'page':1,#控制请求的页面数
  18. 'rows':100,#控制每页显示的行数
  19. 'condition':'[{"orConditionList":[{"column":"S.S_SUPPLIER_NO","exp":"like","value":"00001"}]},{"column":"S.S_SUPPLIER_NO","orderType":"default","orderKey":"","direction":"DESC"}]',
  20. 'additionalParams':'{}'
  21. }
  22. s=requests.session()
  23. def login(s,loginData,data_search):
  24. try:
  25. response=s.post('http://******.com/portal/u/a/login.do',loginData)
  26. if response.status_code==200:
  27. print("login_success")
  28. except requests.ConnectionError as e:
  29. print('Error',e.args)
  30. def getjson(s,base_url,data_search):
  31. try:
  32. response=s.post(base_url,data_search)
  33. if response.status_code==200:
  34. #print("vendor_info_yes")
  35. return response.json()
  36. except requests.ConnectionError as e:
  37. print('Error',e.args)
  38.  
  39. if __name__ == "__main__":
  40. ss=login(s,loginData,data_search)
  41. page=getjson(s,base_url,data_search)
  42.  
  43. maxNum=math.ceil(page['total']/100) #计算出总的信息显示所需页面数
  44. for pageNum in range(1,500):
  45. if pageNum==maxNum+1:
  46. wb.save(filename=pwd+u"\\info_list.xlsx") #最后一页写完后,进行保存excel操作
  47. end = time.time()
  48. time.sleep(2)
  49. sys.exit(0)
  50. data_search['page']=pageNum #修改字典的‘page’键对应值,逐页请求服务器数据
  51. page=getjson(s,base_url,data_search)
  52. listlen=len(page['rows']) #由于最后一次得到的行数不见得是100行,所以需要动态获取列表长度,作为循环次数的依据。
  53. for i in range(listlen): #对请求后得到的json文件进行解析,类似于字典,字典中含有列表,需要注意,当部分字段为空时,字典中部分元素可能不存在,需要判断字典。
  54.  
  55. sheet['A%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['supplierNo']
  56. sheet['B%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['companyName']
  57. if 'linkMan1' in page['rows'][i].keys():
  58. sheet['C%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['linkMan1']
  59. if 'phone1' in page['rows'][i].keys():
  60. sheet['D%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['phone1']
  61. if 'email1' in page['rows'][i].keys():
  62. sheet['E%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['email1']
  63. if 'legalRepresentative' in page['rows'][i].keys():
  64. sheet['F%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['legalRepresentative']
  65. if 'email2' in page['rows'][i].keys():
  66. sheet['G%d' %((pageNum-1)*100+i+2)].value = page['rows'][i]['email2']
  67. 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. [No0000153]详解C# 迭代器【转】

    迭代器模式是设计模式中行为模式(behavioral pattern)的一个例子,他是一种简化对象间通讯的模式,也是一种非常容易理解和使用的模式.简单来说,迭代器模式使得你能够获取到序列中的所有元素而 ...

  2. Hot Plug Detection, DDC, and EDID

    Hot Plug Detection, DDC, and EDID DataPro Tech Info > Hot Plug Detection, DDC, and EDID Hot Plugg ...

  3. 2017年蓝桥杯省赛A组c++第5题(递归算法填空)

    /* 由 A,B,C 这3个字母就可以组成许多串. 比如:"A","AB","ABC","ABA","AACB ...

  4. Xcode工程编译之duplicate symbol问题引发的一些知识

    概括: 文件中重复定义了一个函数.变量(比如全局变量) 工程中包含同名的文件. 一般的解决方法 1 在使用import 引入头文件时,由于疏忽,误引入.m 文件. 2 同名文件放在不同的文件夹下. 3 ...

  5. mysql缓存分析

  6. Mysql 性能优化教程

    Mysql 性能优化教程 目录 目录 1 背景及目标 2 Mysql 执行优化 2 认识数据索引 2 为什么使用数据索引能提高效率 2 如何理解数据索引的结构 2 优化实战范例 3 认识影响结果集 4 ...

  7. [daily][btrfs][mlocate][updatedb] mlocate不认识btrfs里面的文件

    这是mlocate的一个bug, 截至到目前还没有修复, 至少在redhat上没有修复. https://bugzilla.redhat.com/show_bug.cgi?id=906591 解决方法 ...

  8. LeetCode 762 Prime Number of Set Bits in Binary Representation 解题报告

    题目要求 Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a ...

  9. navicat连接oracle失败

    正常是成功的,失败的话,就是oci.dll的问题 在这边下载: https://www.oracle.com/technetwork/topics/winsoft-085727.html 然后找到对应 ...

  10. websocketd

    https://www.cnblogs.com/tinywan/p/6826125.html https://www.jianshu.com/p/63afd0099565