zoukankan      html  css  js  c++  java
  • 爬虫(六):Selenium库使用

    一:Selenium简介

    selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。

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

    二:Selenium基本使用

    用python写爬虫的时候,主要用的是selenium的Webdriver。(个人主要使用Chrome浏览器)

    (1):声明浏览器对象

    selenium支持很多的浏览器,但是如果想要声明并调用浏览器则需要:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser = webdriver.Firefox()

    (2):访问页面

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    
    browser.get("http://www.baidu.com")
    print(browser.page_source)
    browser.close() 
    
    # 运行后,会自动打开Chrome浏览器,并登陆百度打印百度首页的源代码,然后关闭浏览器

    (3):查找元素

    单个元素查找:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    input_first = browser.find_element_by_id('q') # 用id来寻找元素
    input_second = browser.find_element_by_css_selector('#q') # 用css选择器
    input_third = browser.find_element_by_xpath('//*[@id="q"]') # 用xpath来选择
    print(input_first, input_second, input_third)
    browser.close() # 关闭浏览器

    ####################### 常用的查找元素的方法
    find_element_by_name
    find_element_by_id
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector
    ########################

    通用的查找方式:By模块

    from selenium import webdriver
    
    from selenium.webdriver.common.by import By
    
    browser = webdriver.Chrome()
    
    browser.get("http://www.taobao.com")
    input_first = browser.find_element(By.ID,"q")
    print(input_first)
    browser.close()
    
    #当然这种方法和上述的方式是通用的,browser.find_element(By.ID,"q")这里By.ID中的ID可以替换为其他几个

    多个元素查找

    # 其实多个元素和单个元素的区别,举个例子:find_elements,单个元素是find_element,其他使用上没什么区别
    
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get("http://www.taobao.com")
    lis = browser.find_elements_by_css_selector('.service-bd li') # 获得的是列表
    print(lis)
    browser.close()
    
    # 上面这种也可以用By来实现
    # lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
    
    ###########################
    find_elements_by_name
    find_elements_by_id
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector
    ###########################

    元素交互操作

    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome()
    browser.get("http://www.taobao.com")
    input_str = browser.find_element_by_id('q') # 找到搜索框
    input_str.send_keys("手机") # 输入手机
    time.sleep(1)
    input_str.clear()  # 清除搜索框
    input_str.send_keys("电脑") # 输入电脑
    button = browser.find_element_by_class_name('btn-search')
    button.click() # 点击按钮
    
    # 运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入手机,然后删除,重新输入电脑,并点击搜索

    Selenium的api文档--》查看

    交互动作

    --》详情

    # 交互动作,驱动浏览器进行动作,模拟拖拽动作,将动作附加到动作链中串行执行
    from selenium import webdriver
    from selenium.webdriver import ActionChains#引入动作链
    
    browser = webdriver.Chrome()
    url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
    browser.get(url)
    browser.switch_to.frame('iframeResult')#切换到iframeResult框架
    source = browser.find_element_by_css_selector('#draggable')#找到被拖拽对象
    target = browser.find_element_by_css_selector('#droppable')#找到目标
    actions = ActionChains(browser)#声明actions对象
    actions.drag_and_drop(source, target)
    actions.perform()#执行动作

    执行JavaScript

    # 有些动作可能没有提供api,比如进度条下拉,这时,我们可以通过代码执行JavaScript
    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    browser.execute_script('alert("To Bottom")')

    获取元素属性

    # 获取属性  get_attribute('class')
    from selenium import webdriver
    from selenium.webdriver import ActionChains
    
    browser = webdriver.Chrome()
    url = 'https://www.zhihu.com/explore'
    browser.get(url)
    logo = browser.find_element_by_id('zh-top-link-logo')#获取网站logo
    print(logo)
    print(logo.get_attribute('class'))
    browser.close()

    获取文本值

    from selenium import webdriver
    browser = webdriver.Chrome()
    url = 'https://www.zhihu.com/explore'
    browser.get(url)
    input = browser.find_element_by_class_name('zu-top-add-question')
    print(input.text)#input.text文本值
    browser.close()
    
    # 获取Id,位置,标签名,大小
    from selenium import webdriver
    browser = webdriver.Chrome()
    url = 'https://www.zhihu.com/explore'
    browser.get(url)
    input = browser.find_element_by_class_name('zu-top-add-question')
    print(input.id)#获取id
    print(input.location)#获取位置
    print(input.tag_name)#获取标签名
    print(input.size)#获取大小
    browser.close()
    Frame操作
    # frame相当于独立的网页,如果在父类网frame查找子类的,则必须切换到子类的frame,子类如果查找父类也需要先切换
    # 常用的是switch_to.from()和switch_to.parent_frame()
    from selenium import webdriver from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') print(source) try: logo = browser.find_element_by_class_name('logo') except NoSuchElementException: print('NO LOGO') browser.switch_to.parent_frame() logo = browser.find_element_by_class_name('logo') print(logo) print(logo.text)

    等待 --》详细内容

    隐式等待

    到了一定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会立即执行

    当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.implicitly_wait(10) # 等待十秒加载不出来就会抛出异常,10秒内加载出来正常返回
    browser.get('https://www.zhihu.com/explore')
    input = browser.find_element_by_class_name('zu-top-add-question')
    print(input)

    显示等待 

    指定一个等待条件,和一个最长等待时间,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com/')
    wait = WebDriverWait(browser, 10)
    input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
    button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
    print(input, button)
    
    
    ######################
    title_is 标题是某内容
    title_contains 标题包含某内容
    presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
    visibility_of_element_located 元素可见,传入定位元组
    visibility_of 可见,传入元素对象
    presence_of_all_elements_located 所有元素加载出
    text_to_be_present_in_element 某个元素文本包含某文字
    text_to_be_present_in_element_value 某个元素值包含某文字
    frame_to_be_available_and_switch_to_it frame加载并切换
    invisibility_of_element_located 元素不可见
    element_to_be_clickable 元素可点击
    staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
    element_to_be_selected 元素可选择,传元素对象
    element_located_to_be_selected 元素可选择,传入定位元组
    element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
    element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
    alert_is_present 是否出现Alert
    #######################
    前进后退-实现浏览器的前进后退以浏览不同的网页
    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com/')
    browser.get('https://www.taobao.com/')
    browser.get('https://www.python.org/')
    browser.back() # 后退
    time.sleep(1)
    browser.forward() # 前进
    browser.close()
    Cookies
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    print(browser.get_cookies())
    browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) # 添加Cookies
    print(browser.get_cookies()) # 获取cookies
    browser.delete_all_cookies() # 删除全部cookie
    print(browser.get_cookies())
    选项卡管理 增加浏览器窗口
    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('window.open()') # 执行js命令打开新的选项卡
    print(browser.window_handles) # 不同的选项卡存在列表里
    browser.switch_to_window(browser.window_handles[1]) # 可以操作的第二个选项卡
    browser.get('https://www.taobao.com')
    time.sleep(1)
    browser.switch_to_window(browser.window_handles[0])
    browser.get('http://www.fishc.com')

    异常处理--》详情内容

    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException, NoSuchElementException
    
    browser = webdriver.Chrome()
    try:
        browser.get('https://www.baidu.com')
    except TimeoutException:
        print('Time Out')
    try:
        browser.find_element_by_id('hello')
    except NoSuchElementException:
        print('No Element')
    finally:
        browser.close()
  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/felixwang2/p/8728556.html
Copyright © 2011-2022 走看看