因工作的需要需要使用某第三方网站页面的功能,但其网站未提供API,只有登录用户可使用该功能。

之前试过php使用snoopy获取set-cookie内容项进行手动拼装cookie,使用一段时间后发现网站改版,cookie中出现了一些动态参数使用snoopy获取不到导致拼装出的cookie是无效的。

于是修改思路:如果不手动拼装cookie而是直接拿到cookie后存起来不就完美了吗?

明确要达到的目标

  1、安装配置简单,

  2、开发难度要低

基于上述目标选择了python + selenium + Chrome开发

使用到的工具和技术

  1、python

  2、selenium

  3、xpath

  4、chromedriver.exe 谷歌浏览器驱动

  5、pyinstaller python代码打包

  6、request 第三方包

使用pycharm进行开发,首先安装selenium和pyinstaller第三方包,可使用pip安装也可以使用pycharm自带的功能进行安装,

  安装第三方包见此篇:https://www.cnblogs.com/python-gulp-php/articles/14448363.html

  

具体代码编写思路

  1、从配置获取登录页面地址(这里是登录页面地址,不是请求提交地址)

  2、使用selenium.webdriver获取对应的浏览器驱动

1         def get_driver(self):
2
3
4 '''获取驱动对象并返回'''
5 self.drivers = webdriver.Chrome(executable_path=self.chromePath)
6 return self.drivers
这里的self.chromePath写的是驱动的地址,
需要注意的是
  1、这里是驱动不是谷歌浏览器应用程序,
  2、这个驱动可在当前代码目录下不是必须放在浏览器的安装路径
  3、Chrome需要首字母大写
驱动需要自己手动下载百度搜索并找到自己浏览器对应版本的驱动进行下载即可

3、使用xpath找到登录页面用户名,密码、登录按钮输入框并将用户名和密码绑定到对应DOM元素,
xpath获取见此文:https://www.cnblogs.com/python-gulp-php/articles/14448586.html
1                 # 拼装登陆数据
2 driver.find_element_by_xpath(self.username_xpath).send_keys(self.username) #输入用户名
3 driver.find_element_by_xpath(self.password_xpath).send_keys(self.password) #输入密码
4 driver.find_element_by_xpath(self.button_xpath).click() #点击登陆

4、构建session并获取cookie

 1                 req = requests.Session() #构建Session
2 self.cookies = driver.get_cookies() #导出cookie
3
4 #print(self.cookies)
5 for cookie in self.cookies:
6 if self.cookie_str == '':
7 self.cookie_str = cookie['name']+'='+cookie['value']+';'
8 else:
9 self.cookie_str += cookie['name'] + '=' + cookie['value'] + ';'
10
11 if(self.params != ''):
12 self.cookie_str += self.params + ';'
13
14 self.cookie_str = self.cookie_str.encode("utf-8")

这里要修改编码为utf-8否则可能会抛异常

5、将拼装好的cookie传给服务器

 1                 self.base_str = base64.b64encode(self.cookie_str)
2
3 #print(self.base_str)
4
5 #driver.close()
6 driver.quit()
7
8 self.response = requests.post(self.request_url,{'base_cookie':self.base_str})
9
10 return self.response.json()

这里导入了base64模块将cookie转为base64格式进行传输防止传输时cooke中的特殊字符被转义或过滤掉,这里请求用到了request包需要手动导入它

这里贴上主方法的代码

 1         def real_login(self):
2
3 '''实际登陆并获取cookie主方法'''
4 # 获取登陆页面地址
5 loginUrl = self.get_login_url();
6
7 # 获得驱动
8 driver = self.get_driver();
9
10 # 进入登陆界面
11 driver.get(loginUrl)
12
13 # 拼装登陆数据
14 driver.find_element_by_xpath(self.username_xpath).send_keys(self.username) #输入用户名
15 driver.find_element_by_xpath(self.password_xpath).send_keys(self.password) #输入密码
16 driver.find_element_by_xpath(self.button_xpath).click() #点击登陆
17
18
19 req = requests.Session() #构建Session
20 self.cookies = driver.get_cookies() #导出cookie
21
22 #print(self.cookies)
23 for cookie in self.cookies:
24 if self.cookie_str == '':
25 self.cookie_str = cookie['name']+'='+cookie['value']+';'
26 else:
27 self.cookie_str += cookie['name'] + '=' + cookie['value'] + ';'
28
29 if(self.params != ''):
30 self.cookie_str += self.params + ';'
31
32 self.cookie_str = self.cookie_str.encode("utf-8")
33 self.base_str = base64.b64encode(self.cookie_str)
34
35 #print(self.base_str)
36
37 #driver.close()
38 driver.quit()
39
40 self.response = requests.post(self.request_url,{'base_cookie':self.base_str})
41
42 return self.response.json()

驱动这里关闭有close()和quite()两种,区别是close()只关闭打开的当前浏览器窗口,运行时的cmd黑窗口不处理,quit()会将二者都关闭

6、为提高可移植性这里使用pyinstaller将代码打包成.exe

具体步骤和配置参见:https://blog.csdn.net/yql_617540298/article/details/112441159

python模拟登录获取网站cookie的更多相关文章

  1. 用python模拟登录(解析cookie + 解析html + 表单提交 + 验证码识别 + excel读写 + 发送邮件)

    老婆大人每个月都要上一个网站上去查数据,然后做报表. 为了减轻老婆大人的工作压力,所以我决定做个小程序,减轻我老婆的工作量. 准备工作 1.tesseract-ocr 这个工具用来识别验证码,非常好用 ...

  2. 记一次HTTPClient模拟登录获取Cookie的开发历程

    记一次HTTPClient模拟登录获取Cookie的开发历程 环境: ​ springboot : 2.7 ​ jdk: 1.8 ​ httpClient : 4.5.13 设计方案 ​ 通过新建一个 ...

  3. 【py登陆】python模拟登录

    用Python模拟登录网站 前面简单提到了 Python 模拟登录的程序,但是没写清楚,这里再补上一个带注释的 Python 模拟登录的示例程序.简单说一下流程:先用cookielib获取cookie ...

  4. python模拟登录的实现

    本文主要用python实现了对网站的模拟登录.通过自己构造post数据来用Python实现登录过程.   当你要模拟登录一个网站时,首先要搞清楚网站的登录处理细节(发了什么样的数据,给谁发等...). ...

  5. [Python] Python 模拟登录,并请求

    Python 模拟登录,并请求 # encoding: utf- import requests import socket import time socket.setdefaulttimeout( ...

  6. 【Python数据分析】Python模拟登录(一) requests.Session应用

    最近由于某些原因,需要用到Python模拟登录网站,但是以前对这块并不了解,而且目标网站的登录方法较为复杂, 所以一下卡在这里了,于是我决定从简单的模拟开始,逐渐深入地研究下这块. 注:本文仅为交流学 ...

  7. ph模拟登录获取信息

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

  8. 忘记秘密利用python模拟登录暴力破解秘密

    忘记秘密利用python模拟登录暴力破解秘密: #encoding=utf-8 import itertools import string import requests def gen_pwd_f ...

  9. Python入门小练习 003 利用cookielib模拟登录获取账户信息

    为了方便, 使用chinaunix的账户获取账户主题. 有些网站可能需要验证码,  找一些不用验证码的网站 下面 ****** 很多个星号的均为私密信息, 所以用星号代替 #!/usr/bin/pyt ...

随机推荐

  1. openjdk的bug

    容器内就获取个cpu利用率,怎么就占用单核100%了呢 背景:这个是在centos7 + lxcfs 和jdk11 的环境上复现的 下面列一下我们是怎么排查并解这个问题的. 一.故障现象 oppo内核 ...

  2. CPU性能优化干货总结

    一.背景 部门成立专项组,对数智平台和站务系统做性能优化,其中目标之一为降低服务端硬件成本,即在32G内存.CPU银牌的配置下,能支撑1万+发客量.要达到此目标,需通过压力测试并配合监控系统,以QPS ...

  3. 前端架构-分层而治,铁打的MV流水的C

    大家好,我是Eluxjs的作者,Eluxjs是一套基于"微模块"和"模型驱动"的跨平台.跨框架『同构方案』,欢迎了解... 文前声明,以下推断和结论纯属个人探索 ...

  4. 【JAVA】学习路径35-InputStream使用例子

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; pu ...

  5. 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...

  6. Rsync数据备份工具

    Rsync数据备份工具 1.Rsync基本概述 rsync是一款开源的备份工具,可以在不同主机之间进行同步(windows和Linux之间 Mac和 Linux Linux和Linux),可实现全量备 ...

  7. RTSP播放器或RTMP播放器常用的Evnet事件回调设计

    很多开发者在开发RTSP或RTMP播放器的时候,不晓得哪些event回调事件是有意义的,针对此,我们以大牛直播SDK(github)的Android平台RTSP/RTMP直播播放端为例,简单介绍下常用 ...

  8. 手把手教你君正X2000开发板的OpenHarmony环境搭建

    摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...

  9. 谣言检测——《MFAN: Multi-modal Feature-enhanced Attention Networks for Rumor Detection》

    论文信息 论文标题:MFAN: Multi-modal Feature-enhanced Attention Networks for Rumor Detection论文作者:Jiaqi Zheng, ...

  10. Skype for Business server 数据库安装

    之前安装了SFB 2015标准版,但是没有安装归档据库,现在打算重新安装.环境中安装的是默认自带的SQL EXPRESS. 继续安装向导,安装SQL数据库.但是在最后的时候遇到了问题. 安装向导报错 ...