如何使用selenium和requests组合实现登录页面


Posted in Python onFebruary 03, 2020

这篇文章主要介绍了如何使用selenium和requests组合实现登录页面,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、在这里selenium的作用

(1)模拟的登录。

(2)获取登录成功之后的cookies

代码

def start_login(self):
  chrome_options = Options()
  # 禁止图片加载,禁止推送通知
  prefs = {
    "profile.default_content_setting_values": {
      "images": 2
    }, "profile.default_content_setting_values.notifications": 2
  }
  chrome_options.add_experimental_option("prefs", prefs)
  if chrome_args().get("headless_flag") == "1":
    chrome_options.add_argument(chrome_args().get("headless"))
  chrome_options.add_argument(chrome_args().get("nogpu"))
  chrome_options.add_argument(chrome_args().get("noinfobars"))
  chrome_options.add_argument(chrome_args().get("max_windows"))
  chrome_options.add_argument(self.Proxy_server)
 
  driver = webdriver.Chrome(chrome_options=chrome_options)
  try:
    get_logger().info("start login.....")
    try:
      # login info
      self.login_name = self.loginInfo.get("login_id")
      self.password = aes_cbc_decrypt(self.loginInfo.get("login_pwd"))
    except Exception:
      get_logger().error("cant get login info,here are detals".format(traceback.format_exc()))
    wait = WebDriverWait(driver, 30)
    print(u"start login in")
    driver.get(self.login_url)
    try:
      login_id = wait.until(
        eccd.presence_of_element_located(
          (By.XPATH, self.Id_xpath))
      )
      login_id.send_keys(self.login_name)
      login_id.send_keys(Keys.ENTER)
      password = wait.until(
        eccd.presence_of_element_located(
          (By.XPATH, self.pwd_xpath))
      )
      password.send_keys(self.password)
      submit = wait.until(
        eccd.presence_of_element_located(
          (By.XPATH, self.login_btn_xpath))
      )
      submit.click()
      # login signal
      #判断是否显示 右上角是否显示用户名
      login_ok = wait.until(
        eccd.presence_of_element_located(
          (By.XPATH, self.login_ok_xpath))
      )
      try:
        #判断登录成功
        if login_ok:
          get_logger().info("get user name successful:"+u"{}".format(login_ok.text))
          try:
            get_weibo_info=driver.find_element_by_xpath(self.forward_home_page)
          except:
 
            driver.get(self.first_page)
 
          forward_home_page_ok = wait.until(
             eccd.presence_of_element_located(
               (By.XPATH, self.forward_home_page))
           )
          forward_home_page_ok.click()
          time.sleep(5)
          self.first_page=driver.current_url
          get_logger().info("get homepage successful,url is {}".format(driver.current_url))
          cookies = driver.get_cookies() # 导出cookie
          get_logger().info("get cookies")
          get_fansnum_ok= wait.until(
              eccd.presence_of_element_located(
                (By.XPATH, self.follow_xpath))
          )
          self.get_followfanshome(driver)
          get_logger().info("get_followfanshome ok")
          self.home_page_source=driver.page_source
          driver.close() # 关闭chrome
          #获取主页的
          # 如果需要保存cookies
          self.write_cookie(cookies)
          get_logger().info("get cookies,login ok")
          return cookies
 
 
        else:
          raise RuntimeError('login failed')
      except:
        get_logger().error("login failed")
        return None
 
    except:
      if driver is not None:
        driver.close()
  except Exception as e:
    if driver is not None:
      driver.close()
      get_logger().error("dbs operation error,here are details:{}".format(traceback.format_exc()))

通过使用cookies = driver.get_cookies() #我们获取了cookie那么我们怎用呢。

二、requests如何使用获取到的cookies

1.创建一个Session对象

req = requests.Session() # 构建Session

2.转换上面的cookies对象

for cookie in cookies:
      req.cookies.set(cookie['name'], cookie['value']) # 转换cookies

3.开始访问该网站的需求页面

data = req.get(url, headers=self.headers).text #获取文本网页
jsondata = req.get(url, headers=self.headers).json() #获取json型网页

好了就是这么简单,另外补充一个经常使用的库fake-useragent,可以获取随机的useragent,但是其中谷歌的useragent版本比较低,尤其在访问知乎的时候,会提示浏览器版本低的信息,这一点需要注意。

另外拥有一个headers是对爬虫起码的尊重,所以有个构建好的headers是非常必要的。我就经常用下面的例:

from fake_useragent import UserAgent as UA
import random
 
headers = {
      'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
      'Accept - Encoding': 'gzip, deflate',
      'Accept-Language': 'zh-Hans-CN, zh-Hans; q=0.5',
      'Connection': 'Keep-Alive',
      'User-Agent': UA().random #获取随机的useragent
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 控制语句
Nov 03 Python
Python处理XML格式数据的方法详解
Mar 21 Python
Python定时任务sched模块用法示例
Jul 16 Python
Flask框架各种常见装饰器示例
Jul 17 Python
对Python _取log的几种方式小结
Jul 25 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
python:动态路由的Flask程序代码
Nov 22 Python
pycharm 设置项目的根目录教程
Feb 12 Python
基于python和flask实现http接口过程解析
Jun 15 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
Python如何telnet到网络设备
Feb 18 Python
如何用python识别滑块验证码中的缺口
Apr 01 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 #Python
Tensorflow 实现释放内存
Feb 03 #Python
手把手教你进行Python虚拟环境配置教程
Feb 03 #Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 #Python
python global和nonlocal用法解析
Feb 03 #Python
Tensorflow设置显存自适应,显存比例的操作
Feb 03 #Python
解决Tensorflow占用GPU显存问题
Feb 03 #Python
You might like
php数据库密码的找回的步骤
2011/01/12 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
jquery命令汇总,方便使用jquery的朋友
2012/06/26 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
最后说说Vue2 SSR 的 Cookies 问题
2018/05/25 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
js实现div色块碰撞
2020/01/16 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
python使用matplotlib绘图时图例显示问题的解决
2017/04/27 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
Python键鼠操作自动化库PyAutoGUI简介(小结)
2020/05/17 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
人力资源管理专业学生自我评价
2013/11/20 职场文书
快递员岗位职责
2014/09/12 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
2014年银行员工年终自我评价
2014/09/19 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技