zoukankan      html  css  js  c++  java
  • selenium

    1.1什么是selenium

    selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题、通过账号密码获取cookies(基于各大网站登录验证码的升级,特别是12306)。

    1.2centos7无桌面环境部署

    安装火狐浏览器

    $ yum install firefox
    

      

    安装selenium

    $ pip3 install selenium
    

    安装Firefoxdriver

    $ wget https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux64.tar.gz
    $ tar -zxvf geckodriver-*.tar.gz
    $ ln -s /root/geckodriver /usr/bin/geckodriver
    
    
    # 最新版本下载
    https://github.com/mozilla/geckodriver/releases

    启动程序测试

    from selenium import webdriver
    
    
    options = webdriver.FirefoxOptions()
    options.add_argument('-headless')
    b = webdriver.Firefox(firefox_options=options)
    b.get('http://www.baidu.com')
    print(b.page_source)
    b.quit()
    

      

      

    1.3最新chromedriver安装

    phantomjs逐步淡出我们的实现,已经不再被支持,chrome集高并发的优点,且目前也已支持无头浏览器。

    安装chrome

    $ curl https://intoli.com/install-google-chrome.sh | bash  

    查看下载的chrome版本,命令行会有显示,然后根据chrome版本选择相对应的chromedriver

    $ google-chrome --version
    
    Google Chrome 84.0.4147.125

    测试

    $ google-chrome-stable --no-sandbox --headless --disable-gpu --screenshot     https://www.suning.com/ # 在当前路径下生成一张截图。

    下载最新版本的chromedriver,

    https://sites.google.com/a/chromium.org/chromedriver/downloads
    # 解压
    $ unzip chromedriver_linux64.zip
    
    # 测试
    $ ./chromedriver
    
    # 加入环境变量
    

    实际环境中采用的写法,并成功了.

    from selenium import webdriver
    chrome_options = webdriver.ChromeOptions()
    # 使用代理ip
    chrome_options.add_argument("--proxy-server=http://202.20.16.82:10152")
    # 使用headless无界面浏览器模式
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    # 谷歌文档提到需要加上这个属性来规避bug
    chrome_options.add_argument('--disable-gpu')
    # 禁止加载图片
    chrome_options.add_argument('blink-settings=imagesEnabled=false')
    # 设置默认请求头
    chrome_options.add_argument("user-agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'")
    wd = webdriver.Chrome(chrome_options=chrome_options,executable_path='/home/chrome/chromedriver')
    
    wd.get("https://www.163.com")
    
    content = wd.page_source.encode('utf-8')
    print(content)
    
    wd.quit()
    

      

        

    1.3selenium的基本使用

     

    声明浏览器对象

    1 from selenium import webdriver
    2 
    3 browser = webdriver.Chrome()
    4 browser = webdriver.Firefox()

    访问页面

    1 from selenium import webdriver
    2 
    3 browser = webdriver.Chrome(executable_path="D:SeleniumDemo-masterchromedriver.exe")
    4
    5 browser.get("http://www.baidu.com")

    6 print(browser.page_source)

    7 browser.quit() # quit关闭所有并清除缓存,close仅仅关闭当前页

    查找单个元素

     1 from selenium import webdriver
     2 
     3 browser = webdriver.Chrome()
     4 
     5 browser.get("http://www.taobao.com")
     6 input_first = browser.find_element_by_id("q")
     7 input_second = browser.find_element_by_css_selector("#q")
     8 input_third = browser.find_element_by_xpath('//*[@id="q"]')
     9 print(input_first)
    10 print(input_second)
    11 print(input_third)
    12 browser.close()

    查找多个元素

    1 from selenium import webdriver
    2 
    3 
    4 browser = webdriver.Chrome()
    5 browser.get("http://www.taobao.com")
    6 lis = browser.find_elements_by_css_selector('.service-bd li')
    7 print(lis)
    8 browser.close()

    元素交互操作

    对于获取的元素调用交互方法

     1 from selenium import webdriver
     2 
     3 import time
     4 
     5 browser = webdriver.Chrome()
     6 browser.get("http://www.taobao.com")
     7 input_str = browser.find_element_by_id('q')
     8 input_str.send_keys("ipad")
     9 time.sleep(1)
    10 input_str.clear()
    11 input_str.send_keys("MakBook pro")
    12 button = browser.find_element_by_class_name('btn-search')
    13 button.click()

    Frame

    在很多网页中都是有Frame标签,所以我们爬取数据的时候就涉及到切入到frame中以及切出来的问题,通过下面的例子演示
    这里常用的是switch_to.from()和switch_to.parent_frame()

     1 import time
     2 from selenium import webdriver
     3 from selenium.common.exceptions import NoSuchElementException
     4 
     5 browser = webdriver.Chrome()
     6 url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
     7 browser.get(url)
     8 browser.switch_to.frame('iframeResult')
     9 source = browser.find_element_by_css_selector('#draggable')
    10 print(source)
    11 try:
    12     logo = browser.find_element_by_class_name('logo')
    13 except NoSuchElementException:
    14     print('NO LOGO')
    15 browser.switch_to.parent_frame()
    16 logo = browser.find_element_by_class_name('logo')
    17 print(logo)
    18 print(logo.text)
  • 相关阅读:
    GB28181 流媒体几种数据传输模式UDP、TCP(被动、主动)
    LiveGBS
    利用ffmpeg采集纯音频推流到LiveQing实现RTMP、FLV、HLS web直播与录像回放
    LiveQing高性能RTMP、FLV、HLS视频流媒体服务器软件如何自定义修改成自己的服务软件名称
    LiveQing
    LiveQing直播流媒体服务解决直播录像存储、直播录像回看、直播录像计划排班配置
    GB28181流媒体服务LiveGBS前端源码(vue+webpack)
    LiveNVR
    华为、科达、海康、大华等厂家摄像头通过非标方式(RTSP)接入流媒体服务实现WEB直播与录像
    LiveNVR RTSP流媒体服器软件通过按需直播降低企业服务带宽
  • 原文地址:https://www.cnblogs.com/zenan/p/8522261.html
Copyright © 2011-2022 走看看