zoukankan      html  css  js  c++  java
  • selenium

    前言:

    由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;

    selenium模块本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器;由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的;

    一、安装selenium+chromdriver.exe

    1.安装selenium

    pip install selenium

     2.下载chromdriver.exe放置python安装路径/scripts目录下

    下载chromdriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.29,并非2.9
    国内镜像网站地址:http://npm.taobao.org/mirrors/chromedriver/2.29/
    最新的版本去官网找:https://sites.google.com/a/chromium.org/chromedriver/downloads

    3.测试是否安装成功

    from selenium import webdriver
    browser=webdriver.Chrome()                #实例化1个谷歌浏览器对象
    browser.get('https://www.baidu.com/')     #开始

     二、selenium基本使用

    复制代码
    import time
    from selenium import webdriver#驱动浏览器
    from selenium.webdriver import ActionChains #滑动
    from selenium.webdriver.common.by import By #选择器
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素
    
    browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象
    wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间
    
    try:
        browser.get('https://www.baidu.com/')
        baidu_input_tag=browser.find_element_by_id("kw")  #寻找到百度页面的id='kw'的标签
        key=baidu_input_tag.send_keys('张根')             #在标签中输入'张根'
    
        baidu_button_tag=browser.find_element_by_id('su') #寻找到百度页面id='su'的标签
        baidu_button_tag.click()                           #点击
        wait.until(EC.presence_of_element_located((By.ID,'4')))  #等待百度页面 ID='4'的标签完毕,最大等待10秒
        '''
    请求相关:
    browser.get('url')
    
    
        响应相关:
        print(browser.page_source) #显示网页源码
        print(browser.current_url)   #获取当前url
        print(browser.get_cookies()) #获取当前网页cokies
        '''
    
    finally:
        time.sleep(5)
        browser.close()      #关闭浏览器
    复制代码

     三、selenium选择器

     模拟浏览器无非请求---->显示页面----->寻找标签 ------>点击标签的事件,所以selenium的关键是怎么找到页面中的标签,进而触发标签事件;

    1.通过标签id属性进行定位

    browser.find_element(By.ID,'kw').send_keys("美女")
    browser.find_element_by_id('kw').send_keys('性感')

     2.通过标签name属性进行定位

    browser.find_element_by_name("wd").send_keys("Linux")
    browser.find_element(By.NAME,'wd').send_keys("美女")

    3.通过标签名进行定位

     browser.find_element_by_tag_name("input").send_keys("selenium")
     browser.find_element(By.TAG_NAME, 'input').send_keys('aaa')

    4.通过CSS查找方式进行定位

    browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python django')
    browser.find_element(By.CSS_SELECTOR, '#kw').send_keys('python 之美')

    5.通过xphan方式定位

    browser.find_element_by_xpath('//*[@id="kw"]').send_keys("python Tornado")
    browser.find_element(By.XPATH, '//*[@id="kw"]').send_keys('吐槽大会')

    6.通过搜索 页面中 链接进行定位

    有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

    browser.find_element_by_link_text("新闻").click()

    7.通过搜索 页面中 链接进行定位 ,可以支持模糊匹配

    browser.find_element_by_partial_link_text("新").click()
    browser.find_element_by_partial_link_text("闻").click()

    8.小结

    上述均可以改写成find_element(By.ID,'kw')的形式

    find_elements_by_xxx的形式是查找到多个元素,结果为列表

     示例

     四、等待元素被加载

    复制代码
    #1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证能查找到元素,必须等待
    
    #2、等待的方式分两种:
    wait=WebDriverWait(browser,10) #显式等待
    wait1=browser.implicitly_wait(10) #隐式等待
    wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tH0')))
    '''
    显式等待:指定等待某个标签加载完毕
    隐式等待:等待所有标签加载完毕

    '''
    复制代码

    五、元素交互操作

    0.ActionChains(动作链)

    用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况(如:iframe标签),比如单击、双击、点击鼠标右键、拖拽(滑动验证)等等。而selenium给我们提供了一个类来处理这类事件——ActionChains;

     ActionChains动作链示例

    关于ActionChains参看:http://blog.csdn.net/huilan_same/article/details/52305176

    1.点击,清空

    复制代码
    import time
    from selenium import webdriver#驱动浏览器
    from selenium.webdriver import ActionChains #滑动
    from selenium.webdriver.common.by import By #选择器
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素
    
    browser=webdriver.Chrome() #调用Chrome 驱动,生成浏览器对象
    wait=WebDriverWait(browser,10) #设置selenium等待浏览器加载完毕的最大等待时间
    
    browser.get('https://www.baidu.com/')
    browser.find_element(By.ID,'kw').send_keys("美女")
    browser.find_element_by_id("su").click()#点击按钮
    time.sleep(4)
    browser.find_element(By.ID,'kw').clear()#清空input标签中的内容,让重新输入
    browser.find_element_by_id('kw').send_keys('性感')
    browser.find_element_by_id("su").click() #点击按钮
    复制代码

     2.前进和后退

    复制代码
    import time
    from selenium import webdriver#驱动浏览器
    from selenium.webdriver import ActionChains #滑动
    from selenium.webdriver.common.by import By #选择器
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素
    import time
    from selenium import webdriver
    
    browser=webdriver.Chrome()
    browser.get('http://www.cnblogs.com/sss4/')
    
    browser.find_element_by_partial_link_text( 'PythonWEB框架之Flask').click()
    
    time.sleep(3)
    browser.back() #后退
    time.sleep(3)
    browser.forward() #前进
    time.sleep(5)
    browser.close()
    复制代码

    3.cokies相关

    复制代码
    import time
    from selenium import webdriver#驱动浏览器
    from selenium.webdriver import ActionChains #滑动
    from selenium.webdriver.common.by import By #选择器
    from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC  #等待所有标签加载完毕
    from selenium.webdriver.support.wait import WebDriverWait #等待页面加载完毕 寻找某些元素
    
    
    from selenium import webdriver
    browser=webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    print(browser.get_cookies())                    #获取cokies信息
    browser.add_cookie({'k1':'xxx','k2':'yyy'}) #添加cokies信息
    print(browser.get_cookies())
    
    browser.delete_all_cookies()                   #删除cokies信息,慎用
    复制代码

    4.选项卡管理

     

    复制代码
    from selenium import webdriver
    
    browser=webdriver.Chrome()
    
    
    browser.execute_script('window.open()') #打开选项卡
    browser.execute_script('window.open()')
    
    
    print(browser.window_handles)             #获取所有的选项卡
    
    browser.switch_to_window(browser.window_handles[0]) #切换至选项卡0
    browser.get('https://www.taobao.com')
    
    
    browser.switch_to_window(browser.window_handles[1]) #切换至选项卡1
    browser.get('https://www.baidu.com')
    
    browser.switch_to_window(browser.window_handles[2]) #切换至选项卡2
    browser.get('https://v.qq.com/')
    复制代码

    5.selenium异常处理

    复制代码
    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
    
    try:
        browser=webdriver.Chrome()
        browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
        browser.switch_to.frame('iframssseResult')
    
    except TimeoutException as e:
        print(e)
    except NoSuchFrameException as e:
        print(e)
    finally:
        browser.close()
  • 相关阅读:
    嵌入式驱动视频2019.03.24
    wps如何输入连续的长破折号
    python绘图问题
    2.13
    2.12
    2.10
    2.9
    2.8
    2.7
    2.5
  • 原文地址:https://www.cnblogs.com/daien522556/p/10588289.html
Copyright © 2011-2022 走看看