• python 爬虫 selenium


    Selenium 个人学习笔记

    准备工作

    一: 安装Chrome浏览器

    二: 根据你浏览器的版本号下载 ChromeDriver (笔者的版本号是 76.0.3809.100

    ChromeDriver下载地址

    笔者的版本下载

    三:环境变量配置

    (windows下)直接将ChromDriver可执行文件复制到python的Script目录下

    四:验证安装

    在cmd中直接执行 chromedriver 命令

    如图


    1.selenium基本使用

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com')
    input_ = browser.find_element_by_id('kw')
    input_.send_keys('Python')
    browser.close()
    

    2.声名浏览器对象

    from selenium import  webdriver
    
    browser = webdriver.Chrome()
    browser = webdriver.Firefox()
    browser = webdriver.Edge()
    browser = webdriver.PhantomJS()
    browser = webdriver.Safari()
    

    3.访问页面

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    print(browser.page_source)
    browser.close()
    

    4.查找节点

    • 单个节点
    from selenium import webdriver
    # 查找节点
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    input_first = browser.find_element_by_id('q')
    # input_first_1 = browser.find_element(By.ID, 'q')
    
    input_second = browser.find_element_by_css_selector('#q')
    input_third = browser.find_element_by_xpath('//*[@id="q"]')
    print(input_first, input_second, input_third, sep='
    ')
    browser.close()
    
    • 获取单个节点的方法
    find_element_by_id()
    find_element_by_name()
    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()
    
    find_element()  #通用方法
    需要传入两个参数
    如:
    find_element_by_id == find_element(By.ID, id)
    
    • 多个节点
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    lis = browser.find_elements_by_css_selector('.service-bd li')
    print(lis)
    browser.close()
    
    #在单节点的基础上,element 加一个 s
    

    5节点交互

    from selenium import webdriver
    import time
    
    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    input_ = browser.find_element_by_id('q') 
    input_.send_keys('跳蛛') #输入文字
    time.sleep(1)   
    input_.clear() # 清空文字
    input_.send_keys('蜥蜴')
    button = browser.find_element_by_class_name('btn-search')
    button.click()
    

    6动作链

    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')
    source = browser.find_element_by_css_selector('#draggable')
    target = browser.find_element_by_css_selector('#droppable')
    actions = ActionChains(browser)
    actions.drag_and_drop(source, target)
    actions.perform()
    

    7.执行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")')
    

    *8.获取节点信息

    from selenium import webdriver
    
    #获取属性
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com')
    logo = browser.find_element_by_id('su')
    print(logo)
    print(logo.get_attribute('class'))
    
    # 获取文本值
    browser = webdriver.Chrome()
    url = 'https://www.baidu.com'
    browser.get(url)
    input_ = browser.find_element_by_class_name('mnav')
    print(input_.text)
    
    # 获取id、位置、标签名和大小
    
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    url= 'https://www.zhihu.com/explore'
    browser.get(url)
    input_ = browser.find_element_by_xpath('//*[@id="Popover1-toggle"]')
    print(input_.tag_name)
    print(input_.location)
    print(input_.size)
    print(input_.id)
    print(input_.__class__)
    

    9.切换Frame

    Selenium打开页面后,默认是在父级Frame里面操作的,而此时如果页面中还有子Frame,是不能够获取到子Frame里面的节点的。这时需要使用Switch_to_frame()方法

    ex:

    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') # 切换到子Frame
    try:
        logo = browser.find_element_by_class_name('logo') # 尝试获取Frame里的logo节点
    except NoSuchElementException:
        print('NO LOGO') 
    browser.switch_to.parent_frame()
    logo = browser.find_element_by_class_name('logo')
    print(logo)
    print(logo.text)
    

    10.延时等待

    get()方法会在网页框架加载结束后结束执行,此时获取 page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的Ajax请求,我们在网页源码中也不一定能成功获取到,所以,这里需要延时等待一定时间,确保节点已经加载出来。

    • 隐式等待
      当查找节点而节点并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认时间是0

    ex:

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.implicitly_wait(10)     # 隐式等待
    url = 'https://pixabay.com/zh/images/search/%E8%B7%B3%E8%9B%9B/'
    browser.get(url)
    browser.close()
    
    • 显示等待

    指定要查找的节点,然后指定一个最长等待时间。如果规定时间内加载出来了该节点,返回查找的节点;反之,抛出超时异常。

    ex:

    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()
    url = 'https://www.taobao.com'
    browser.get(url)
    wait = WebDriverWait(browser, 10) # 显式等待
    input_ = wait.until(EC.presence_of_element_located((By.ID, 'q'))) # 等待条件
    botton_ = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
    print(input_, botton_, sep='
    ')
    
    • 等待条件极其含义
    等待条件 含义
    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 加载并切换
    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 是否出现警告

    11.前进和后退

    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()
    

    12.Cookies

    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    print(browser.get_cookies())
    browser.add_cookie({'name': 'duoban', 'domain': 'www.zhihu.com', 'value': 'germey'})
    print(browser.get_cookies())
    browser.delete_all_cookies()
    print(browser.get_cookies())
    

    13.选项卡管理

    import time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.get('https://baidu.com')
    browser.execute_script('window.open()')
    print(browser.window_handles) # 获取当前开启的所有选项卡
    browser.switch_to.window(browser.window_handles[1])  # 参数为 选项卡代号
    browser.get('https://mail.qq.com')
    time.sleep(1)
    browser.switch_to.window(browser.window_handles[0])
    browser.get('https://translate.google.cn/')
    
    

    14异常处理

    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('help')
    except NoSuchElementException:
        print('No Element')
    finally:
        browser.close()
    
  • 相关阅读:
    每日日报16
    每日日报15
    每日日报14
    每日日报13
    每日日报12
    每日日报11
    每日日报10
    每日作业报告
    每日作业报告
    每日作业报告
  • 原文地址:https://www.cnblogs.com/duoban/p/11366570.html
Copyright © 2020-2023  润新知