zoukankan      html  css  js  c++  java
  • selenium的学习和使用

    1.Selenium+Chrome的配置

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    # 实例化对象
    option = Options()
    
    # 配置无界面谷歌浏览器
    # option.add_argument('--headless')
    
    # 启动开发者模式(关闭chrome控制)
    option.add_experimental_option("excludeSwitches", ["enable-automation"])
    option.add_experimental_option("useAutomationExtension", 'False')
    
    # 调用谷歌浏览器
    driver = webdriver.Chrome(r'E:\chromedriver\chromedriver.exe', options=option)
    
    # 发起请求
    driver.get('https://www.baidu.com')
    
    #最大窗口化
    # 注意:爬虫最好将窗口最大化后再进行抓取
    # 原因:如果获取的数据如果在窗口中没有,可能会获取不到
    driver.maximize_window()

    注意:

    1. selenium运行速度非常慢,如果不是特别需要,尽量不使用selenium

    2. 使用selenium之后,尽可能不要使用selenium的提取数据的方法

    3. selenium主要用于页面的请求

    2.Selenium+PhantomJS(无界面浏览器)的组合使用

    # 安装:pip install selenium
    
    # selenium的使用步骤:
    # 1. 导入webdriver
    import time
    
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    # 2. 调用浏览器
    driver = webdriver.PhantomJS(executable_path=r'D:\phantomjs-2.1.1-windows\bin\phantomjs.exe')
    
    # 3. 访问网址
    driver.get(url='https://www.baidu.com/')
    
    # 4. 方法及属性
    # 4.1 title  获取网页标题
    # print(driver.title)
    
    # 4.2 current_url  获取当前请求的URL
    # print(driver.current_url)
    
    
    # 4.3 page_source  获取页面内容
    # print(driver.page_source)
    
    
    # 4.4 get_cookies()  获取cookie
    # print(driver.get_cookies())
    
    
    # 4.5 查找元素
    # 4.5.1 根据id查找元素
    # find_element_by_id('id值')
    # kw = driver.find_element_by_id('kw')
    # print(kw)  # <selenium.webdriver.remote.webelement.WebElement (session="2362c650-d4bf-11eb-9f3d-0d52f2b7d981", element=":wdc:1624520297180")>
    
    # 4.5.2 根据class查找元素
    # find_element_by_class_name('类名')   查找第一个符合类名的元素
    # find_elements_by_class_name('类名')   返回列表,查找所有符合类名的元素
    # s_ipt = driver.find_elements_by_class_name('s_ipt')
    # print(s_ipt)  # [<selenium.webdriver.remote.webelement.WebElement (session="805f3fa0-d4bf-11eb-946f-7fab7674449d", element=":wdc:1624520453128")>]
    
    # s_ipt = driver.find_element_by_class_name('s_ipt')
    # print(s_ipt)
    
    
    # 4.5.3 根据xpath来查找元素
    # find_element_by_xpath('xpath的路径')
    # find_elements_by_xpath('xpath的路径')
    
    # res = driver.find_element_by_xpath('//input[@id="kw"]')
    # print(res)
    
    
    # 4.6 text  获取标签之间的内容
    # content = driver.find_element_by_id('s-top-left').text
    # content = driver.find_element_by_xpath('//div[@id="s-top-left"]').text
    # print(content)
    
    
    # 4.7 get_attribute('属性名')
    # print(driver.find_element_by_id('kw').get_attribute('class'))
    
    
    # 4.8 截图
    # save_screenshot()
    # driver.save_screenshot('baidu.png')
    
    
    
    # 4.9 send_keys('输入的内容')
    # 步骤:
    # 1.先获取文本框
    # 2.再输入内容
    # driver.find_element_by_xpath('//input[@id="kw"]').send_keys('金所炫')
    # driver.save_screenshot('输入.png')
    
    
    # 4.10 click()  点击
    # driver.find_element_by_id('su').click()
    # time.sleep(2)
    # driver.save_screenshot('点击.png')
    
    
    # 4.11 支持快捷键
    driver.find_element_by_id('kw').send_keys('金所炫')
    driver.save_screenshot('全选之前.png')
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
    driver.save_screenshot('全选.png')
    driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
    driver.save_screenshot('剪切.png')

     3.selenium反爬处理

        浏览器能够识别当前操作是人为,还是selenium操作 ,如果window.navigator.webdriver=True时说明控制浏览器的是selenium,因此如何解决这个问题是反爬必要的一步。个人推荐方法2,它是封装好的可以绕过webdriver检测的js代码。js下载地址:https://files.cnblogs.com/files/Liu928011/stealth.min.js

    from selenium import webdriver
    
    driver = webdriver.Chrome(executable_path=r'D:\chrome\chromedriver.exe')
    
    # 方法1、处理selenium中webdriver特征值 # driver.execute_cdp_cmd( # 'Page.addScriptToEvaluateOnNewDocument', # { # 'source':'Object.defineProperty(navigator,"webdriver",{get:()=>undefined})' # } # ) # 方法2、读取js文件内容 with open('stealth.min.js','r',encoding='utf-8') as fp: content = fp.read() driver.execute_cdp_cmd( 'Page.addScriptToEvaluateOnNewDocument', { 'source':content } ) driver.get('https://www.baidu.com')

    4.selenium应用过程中遇到的问题

    1.IE浏览器中的SSL认证问题

     # IE如果出现私密连接的提示,解决办法添加下面代码
      driver.execute_script("javascript:document.getElementById('overridelink').click()")

    2.如果driver.find_element_by_id('id名').click(),无效,解决办法,改用js单击

    driver.execute_script("document.getElementById('id名').click()")
  • 相关阅读:
    ajax 检测用户名是否可用
    Ajax 知识
    flask 基础
    如何使Session永不过期
    Css 截取字符串长度
    json sort
    js 原生获取Class元素
    js 跳转整理
    html5 ajax Java接口 上传图片
    调用URL 接口服务
  • 原文地址:https://www.cnblogs.com/Liu928011/p/14929076.html
Copyright © 2011-2022 走看看