如何使用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 相关文章推荐
windows下python模拟鼠标点击和键盘输示例
Feb 28 Python
pycharm 使用心得(二)设置字体大小
Jun 05 Python
python实现类的静态变量用法实例
May 08 Python
Python入门学习指南分享
Apr 11 Python
利用Python如何生成便签图片详解
Jul 09 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
Python中类的创建和实例化操作示例
Feb 27 Python
Django REST framework 分页的实现代码
Jun 19 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
django前端页面下拉选择框默认值设置方式
Aug 09 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初学者最感迷茫的问题小结
2010/03/27 PHP
关于mysql字符集设置了character_set_client=binary 在gbk情况下会出现表描述是乱码的情况
2013/01/06 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
python实现的系统实用log类实例
2015/06/30 Python
python计算文本文件行数的方法
2015/07/06 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python中collections模块的基本使用教程
2018/12/07 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
django url到views参数传递的实例
2019/07/19 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
python2和python3哪个使用率高
2020/06/23 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
cf战队收人口号
2014/06/21 职场文书
保安2014年终工作总结
2014/12/06 职场文书
广告业务员岗位职责
2015/02/13 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书