因工作的需要需要使用某第三方网站页面的功能,但其网站未提供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. 超实用在线工具!能将文字加密为Emoji表情

    试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...

  2. VM虚拟机安装和使用

    作者:菘蓝 时间:2022/8/30 ================================================================================= ...

  3. C/C++ Capstone 引擎源码编译

    Capstone 是一个轻量级的多平台.多架构的反汇编框架.Capstone 旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎.Capstone的编译非常简单只需要一步即可轻松得到对应的Lib库文 ...

  4. Python图像处理丨带你认识图像量化处理及局部马赛克特效

    摘要:本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效. 本文分享自华为云社区<[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效>,作者: eastmoun ...

  5. 进阶:spring-bean生命周期流程

    Bean的生成过程 主要流程图 1. 生成BeanDefinition Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.Clas ...

  6. 关于使用kubeoperator搭建k8s集群使用containerd作为容器运行时,从自己搭建的habor仓库拉取镜像的有关说明

    1.kubepi界面添加habor仓库信息,并授权给k8s集群 这一步的操作是当在工作负载选择从harbor仓库拉取镜像时会自动创建有关的secrets信息,从而不用事先手动创建了(有别于kuboar ...

  7. 5.云原生之Docker容器网络介绍与实践

    转载自:https://www.bilibili.com/read/cv15185166/?from=readlist 例如, 当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完d ...

  8. 使用 Elastic 技术栈构建 K8S 全栈监控 -2: 用 Metricbeat 对 Kubernetes 集群进行监控

    文章转载自:https://www.qikqiak.com/post/k8s-monitor-use-elastic-stack-2/ 操作步骤 git clone https://github.co ...

  9. MySQL主从同步报错故障处理记录

    从库上记录删除失败,Error_code: 1032 问题描述:在master上删除一条记录,而slave上找不到,导致报错 Last_SQL_Error: Could not execute Del ...

  10. ProxySQL(3):Admin管理接口

    文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9281199.html ProxySQL的Admin管理接口 当ProxySQL启动后,将监听两个端口: (1 ...