• python爬虫10:使用selenium模拟浏览器登录账号


    需求背景:

    很多网页通过复杂的JS函数组合,来实现对信息的加密、异步信息处理等,导致很难分析出网页接口。

    那么最快速度的实现爬虫功能,是模拟浏览器的行为,加载运行JS,才能破解页面。

    模拟浏览器行为,在python中的最佳实践方案是使用selenium包。被模拟的浏览器可以使用chromedriver(有界面浏览器)或者phantomjs(无界面浏览器)。

    所有复杂的登录、JS加密、AJAX异步,如果无法分析出网页接口,都可以使用selenium+browserdriver方案,来模拟浏览器上网。

    知识点

    一、什么是selenium?

    selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。

    selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

    selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。

    二、如果配置被模拟的浏览器?

    那chromedriver举例

    先在百度搜chromedriver,并且下载到本地。(朱毅chromedriver.exe对应的版本要和实际安装的chrome.exe版本一致。)

     三、举例一段模拟登陆某个网页,并且获取cookies的过程

    下面是一段登陆网盘的模块。如果cookies是空,那么就使用selenium打开网页登陆一次保存cookies。如果不空,那么就直接使用缓存中的cookies。

     1 from etc import jboxenv
     2 from selenium import webdriver
     3 from selenium.webdriver.common.by import By
     4 from selenium.webdriver.support import expected_conditions as EC
     5 from selenium.webdriver.support.wait import WebDriverWait
     6 
     7 logger = jboxenv.JBOX_LOGGER
     8 __jbox_cookies = {}
    12 __header = {
    13     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}
    14 
    15 
    16 def get_user_cookies(username, password):
    17     '''
    18     获取JBOX的登录cookies
    19     模块第一次使用时通过账号密码获取cookie
    20     登录成功以后再申请cookie,读取模块中的缓存
    21     :param username: 用户名
    22     :param password: 密码
    23     :return: 返回一个dict,保存了cookies字典
    24     '''
    25     # 打开首页获取cookies
    26     global __jbox_cookies
    27     if __jbox_cookies.keys():
    28         return __jbox_cookies
    29     else:
    30         driver = webdriver.Chrome(r'C:Program Files (x86)GoogleChromeApplicationchromedriver.exe')
    31         try:
    32             driver.get("http://pan.jd.com/")
    33             name = driver.find_element_by_id('account')
    34             name.send_keys(username)
    35             psd = driver.find_element_by_id('password')
    36             psd.send_keys(password)
    37             btn = driver.find_element_by_class_name('btnsubmint')
    38             btn.click()
    39             # 等待新页面出现的某个元素出现
    40             wait = WebDriverWait(driver, 10)
    41             wait.until(EC.presence_of_element_located((By.ID, 'showMine')))
    42             if len(driver.get_cookies())>0:
    43                 for c in driver.get_cookies():
    44                     __jbox_cookies[c.get('name')] = c.get('value')
    45         finally:
    46             driver.close()
    47         #如果没有登录成功,就提醒需要重新登录
    48         if not __jbox_cookies.keys():
    49             logger.error('通过登录JBOX申请cookies,登录结果:失败')
    50     print(__jbox_cookies)
    51     return __jbox_cookies
    52 
    53 
    54 if __name__ == '__main__':
    55     print(get_user_cookies('shwujiang', 'Fig@2016092404'))
  • 相关阅读:
    【C++】C++代码动态检查
    【加解密】使用CFSSL生成证书并使用gRPC验证证书
    分库分表下跨库join解决方案
    解决1235
    为什么v-for中的key值不推荐使用index
    弹性布局公共样式总结
    关于python的模块
    [转]Ubuntu18.04安装uwsgi错误:error: lto-wrapper failed collect2: error: ld returned 1 exit status
    python 坐标遍历 生成笛卡尔积矩阵
    Mongo BsonUndefined 转换问题(自定义Mongo类型转换器)
  • 原文地址:https://www.cnblogs.com/figlab/p/10834362.html
Copyright © 2020-2023  润新知