python模拟登录获取网站cookie

因工作的需要需要使用某第三方网站页面的功能,但其网站未提供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

posted @ 2021-02-25 18:48  python吞php  阅读(1561)  评论(0编辑  收藏  举报