因工作的需要需要使用某第三方网站页面的功能,但其网站未提供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. Excelize 发布 2.3.0 版本, Go 语言 Excel 文档基础库

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

  2. ABC216H - Random Robots(容斥,状压DP)

    题面 有 K K K 个机器人初始分别位于数轴上 x 1 , x 2 , . . . , x K x_1,x_2,...,x_{K} x1​,x2​,...,xK​ 的整点位置. 接下来会经历 N N ...

  3. CF1450G. Communism(状压DP)

    题面 有一个字符串 s \tt s s 和一个有理数 k \tt k k,可以进行如下操作任意次: 选一个当前串中存在的字符 x \tt x x ,令 i 1 , i 2 , . . . , i m ...

  4. PHP一句话简单免杀

    PHP一句话简单免杀 原型 几种已经开源的免杀思路 拆解合并 <?php $ch = explode(".","hello.ev.world.a.l"); ...

  5. manim

    from manim import * #导入manim命名空间 #这是一个最基本的manim结构,类名叫做BaseFrame,传入一个场景Scene,并且包含一个construct方法,传入self ...

  6. Html飞机大战(七):发射第一颗子弹

    好家伙,终于到子弹了 我们先来理一理思路: 子弹由飞机射出,所以我们把发射子弹的方法写在英雄类中 当然了,子弹也必须有自己独立的类 后期会有很多子弹射出,所以一个个将子弹类实例化肯定是不对的 我们也需 ...

  7. aardio + .NET 快速开发独立 EXE 程序,可防 ILSpy 反编译

    简介 aardio 可以非常方便地调用 .NET( 不需要任何复杂的步骤 ). .NET 在 aardio 中很好用,系统自带 .NET 组件以及各种开源 .NET 组件在 aardio 用户中也很受 ...

  8. 【Git进阶】基于文件(夹)拆分大PR

    背景 前段时间为了迁移一个旧服务到新项目,由此产生了一个巨大的PR,为了方便Code Review,最终基于文件夹,将其拆分成了多个较小的PR:现在这里记录下,后面可能还会需要. 演示 为了方便演示, ...

  9. OpenFOAM编程 | Hello OpenFOAM

    写在前面 OpenFOAM 是一个非常好用的开源程序包,笔者一直在研究和使用,其编程语言是笔者非常喜欢使用的 C++.但是笔者不是很喜欢 OpenFOAM 自己的构建工具 wmake,更倾向于使用 C ...

  10. 硬核剖析Redis单线程为什么那么快?

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) Redis目前是使用率最高的内存库数据库,是企业应用开发的必备, ...