zoukankan      html  css  js  c++  java
  • Python Selenium框架

    1. selenium介绍

    # 介绍: 
    1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制, 比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作. 
    2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器. 
    # 目的: 
    在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种, 一种通过ajax请求加载数据, 另 一种通过js代码加载动态数据. selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据
    
    ajax:
        url有规律且未加密, 直接构建url连接请求 
        url加密过无法破解规律 --> selenium 
    js动态数据加载 --> selenium
    

    2. selenium安装

    三要素: 浏览器, 驱动程序, selenium框架 
        浏览器: 推荐谷歌浏览器, 标准稳定版本 驱动程序:http://chromedriver.storage.googleapis.com/index.html
    
    pip install selenium 
                    
    # 测试: 
    from selenium import webdriver 
    browser = webdriver.Chrome('./chromedriver.exe') # 将驱动放在脚本所在的文件夹 
    browser.get('https://www.baidu.com')
    

    3. selenium常用操作

    # 实例化浏览器对象: 
    from selenium import webdriver 
    browser = webdriver.Chrome('driverpath') ----->(跟插件的地址)
    
    # 发送get请求: 
    browser.get('https://www.baidu.com')
    browser.get('https://image.baidu.com')
    
    browser.page_source
    
    # 获取网页的数据: browser.page_source ---> str类型 
    # 获取页面元素: 
    find_element_by_id:根据元素的id 
    
    find_element_by_name:根据元素的name属性 
    
    find_element_by_xpath:根据xpath表达式 
    
    find_element_by_class_name:根据class的值(如果class中的属性是多值,有空格,会出错)
    
    find_element_by_css_selector:根据css选择器
    
    find_element_by_xpath("//*[contains(text(), '{}')]".format(a2.strip())).click()  # 根据包含该字体的进行抓取,缺点只会抓取第一次出现的,尽量跟据页面唯一id抓取
                    
    # 节点交互操作: 
    click(): 点击 
    send_keys(): 输入内容 
    clear(): 清空操作 
    execute_script(js): 执行指定的js代码 
    # JS代码: window.scrollTo(0, document.body.scrollHeight)可以模拟鼠标滚动一屏高度 
    quit(): 退出浏览器 
    
    
    # frame 
    # 若爬取一个页面,需观察如果有两个HTML(一个父HTML,一个子HTML),所需内容在子HTML中,则需要switch_to.frame('frameid') 转至子页面继续操作
    
    switch_to.frame('frameid')                
    

    3.1 selenium设置无头浏览器加代理

    from selenium import webdriver
    chrome_opt = webdriver.ChromeOptions()
    chrome_opt.add_argument(
        'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36"')   # 添加UA
    chrome_opt.add_argument('window-size=1200x1050')  # 设置窗口大小
    chrome_opt.add_experimental_option('excludeSwitches', ['enable-automation']) 
    chrome_opt.add_argument('blink-settings=imagesEnabled=false')
    chrome_opt.add_argument('--disable-infobars')
    chrome_opt.add_argument("--headless")      #使用无头浏览器
    chrome_opt.add_argument('--disable-gpu')      # 禁用gpu
    chrome_opt.add_argument('--no-sandbox')
    chrome_opt.add_argument("--proxy-server=%s" % func1(ip_list))   # 使用添加代理
    browser = webdriver.Chrome(
        executable_path="./chromedriver.exe",
        options=chrome_opt)
    
    

    4. QQ空间模拟登陆

    from selenium import webdriver
    import time
    # 实例化浏览器对象
    browser = webdriver.Chrome('./chromedriver.exe')
    # 打开qq空间登陆页面
    browser.get('https://qzone.qq.com/')
    time.sleep(1)
    # 转至frame子页面
    browser.switch_to.frame('login_frame')
    # 获取密码登陆选项并点击
    a_tag = browser.find_element_by_id('switcher_plogin')
    a_tag.click()
    time.sleep(1)
    # 获取账号输入框并输入账号
    browser.find_element_by_id('u').clear()
    user = browser.find_element_by_id('u')
    user.send_keys('1816668038')
    time.sleep(1)
    # 获取密码输入框并输入密码
    browser.find_element_by_id('p').clear()
    pwd = browser.find_element_by_id('p')
    pwd.send_keys('1971628197192liu')
    time.sleep(1)
    # 获取登陆按钮并单击
    button = browser.find_element_by_id('login_button')
    button.click()
    
    
    
    
    '''
    微博模拟登陆
    '''''
    # import requests,time
    # from selenium import webdriver
    # broeser = webdriver.Chrome('./chromedriver.exe')
    # broeser.get('https://weibo.com/login.php')
    #
    # input_tag = broeser.find_element_by_id('loginname')
    # input_tag.clear()
    # input_tag.send_keys('15135544556')
    # time.sleep(3)
    # input_tag_pwd = broeser.find_element_by_xpath('//div[@class="info_list password"]/div[@class="input_wrap"]/input')
    # input_tag_pwd.clear()
    # input_tag_pwd.send_keys('123456789liu')
    # time.sleep(3)
    # button_tag = broeser.find_element_by_xpath('//div[@class="W_login_form"]/div[@class="info_list login_btn"]/a')
    # button_tag.click()
    

    5. 图片懒加载

    '''
    网址 http://sc.chinaz.com/tupian/   站长素材
    图片懒加载
    '''''
    
    import requests
    from lxml import etree
    url = 'http://sc.chinaz.com/tupian/bingxueshijie.html'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    }
    res = requests.get(url=url,headers=headers)
    tree = etree.HTML(res.text)
    
    #src2的位置,在必要的时候可以把值赋给src----懒加载核心
    
    ret = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')
    
    for i in ret:
        comment = requests.get(url=i,headers=headers).content
        name = i.split('/')[-1]
        with open('./image/%s'% name,'wb') as f:
            f.write(comment)
    

    6. Python+Selenium 实现打开浏览器、定时刷新页面

    # 方法一
    import time
    from selenium import webdriver
    
    # driver = webdriver.Firefox()  打开火狐浏览器
    driver = webdriver.Chrome()   # 打开Chrome
    driver.maximize_window()    #最大化窗口
    driver.get('www.baidu.com')    #打开地址
    time.sleep(60)    #睡眠60s
    driver.refresh()    #刷新打开的页面
    driver.close()     #关闭浏览器
    
    # 方法二
    
    import time
    from selenium import webdriver
     
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(6)
     
    driver.get("https://www.baidu.com")
    time.sleep(2)
    try:
        driver.refresh() # 刷新方法 refresh
        print ('test pass: refresh successful')
    except Exception as e:
        print ("Exception found", format(e))
    driver.quit()
    
  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12382235.html
Copyright © 2011-2022 走看看