zoukankan      html  css  js  c++  java
  • selenium模块 phantomJs 谷歌无可视界面

    参考微博:

    什么是selenium

      一款基于浏览器自动化的模块

    什么是浏览器自动化

      通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中,根据设定好的行为动作完成自动化的操作

    和爬虫的关联

      模拟登陆

      获取动态数据

    #演示程序
    
    from selenium import webdriver
    from time import sleep
    
    # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
    driver = webdriver.Chrome(r'./chromedriver.exe')
    # 用get打开百度页面
    driver.get("http://www.baidu.com")
    # 查找页面的“设置”选项,并进行点击
    driver.find_elements_by_link_text('设置')[0].click()
    sleep(2)
    # # 打开设置后找到“搜索设置”选项,设置为每页显示50条
    driver.find_elements_by_link_text('搜索设置')[0].click()
    sleep(2)
    
    # 选中每页显示50条
    m = driver.find_element_by_id('nr')
    sleep(2)
    m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
    m.find_element_by_xpath('.//option[3]').click()
    sleep(2)
    
    # 点击保存设置
    driver.find_elements_by_class_name("prefpanelgo")[0].click()
    sleep(2)
    
    # 处理弹出的警告页面   确定accept() 和 取消dismiss()
    driver.switch_to_alert().accept()
    sleep(2)
    # 找到百度的输入框,并输入 美女
    driver.find_element_by_id('kw').send_keys('美女')
    sleep(2)
    # 点击搜索按钮
    driver.find_element_by_id('su').click()
    sleep(2)
    # 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
    driver.find_elements_by_link_text('美女_百度图片')[0].click()
    sleep(3)
    
    # 关闭浏览器
    driver.quit()

    selenium如何获取动态加载数据

      环境的安装:pip install selenium

      基本使用流程

        1.from selenium import webdriver

        2.结合着某一款浏览器驱动程序实例化一个浏览器对象  bro=webdriver.Chrome(executable_path='./chromedriver.exe') 

        3.下载浏览器驱动:http://chromedriver.storage.googleapis.com/index.html   将下载的驱动放在对应爬虫项目的文件夹里面

          3.1查看驱动和浏览器版本的映射系:http://blog.csdn.net/huilan_same/article/details/51896672

        4.通过get发起请求: bro.get(url='http://125.35.6.84:81/xk/') 

        5.通过xpath或者bs4  获取当前页面的源码数据

    page_text=bro.page_source
    
    soup=BeautifulSoup(page_text,'lxml')
    
    dl_list=soup.select('#gzlist > li > dl')
    
    for dl in dl_list:
        print(dl.string)

        编写自动化操作代码

    #low版爬取药监局的数据
    from
    bs4 import BeautifulSoup #引入webdriver from selenium import webdriver #实例化浏览器对象,参数executable_path bro=webdriver.Chrome(executable_path='./chromedriver.exe') #发起一个请求 bro.get(url='http://125.35.6.84:81/xk/') #获取当前浏览器页面的源码数据 page_text=bro.page_source soup=BeautifulSoup(page_text,'lxml') dl_list=soup.select('#gzlist > li > dl') for dl in dl_list: print(dl.string)

    selenium的详细用法

      1.实例化浏览器(参数为浏览器的驱动) bro = webdriver.Chrome(executable_path='./chromedriver.exe') 

      2.通过get发起请求 bro.get('https://www.taobao.com/') 

      3.通过find系列定位标签 search_input = bro.find_element_by_id('q') 

        find_element_by_id

        find_element_by_xpath

      4.执行js代码execute_script,滚动刷新 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') 

      5.点击按钮事件 btn.click() 

      6.退出浏览器 bro.quit() 

    from selenium import webdriver
    from time import sleep
    #实例化一个浏览器对象
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    bro.get('https://www.taobao.com/')
    #在淘宝首页搜索框中录入一个商品名称
    search_input = bro.find_element_by_id('q') #find系列的函数是用作于定位标签
    #向定位到的标签中录入一个商品名称
    search_input.send_keys('华为')
    sleep(2)
    
    #如何执行js代码,滚动刷新
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(2)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(2)
    
    
    btn = bro.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
    btn.click()
    sleep(2)
    
    bro.quit()

    执行动作链 from selenium.webdriver import ActionChains 

    1.实例化一个动作连对象,且将浏览器对象作为参数传递到该对象的构造方法中 action = ActionChains(bro) 

    2.action.click_and_hold, action.click_and_hold(div_tag) 

    3.action.move_by_offset(x,y).perform() action.move_by_offset(17,0).perform() 

    4.action.release action.release() 

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from time import sleep
    #实例化浏览器
    bro = webdriver.Chrome(executable_path='./chromedriver.exe')
    #发起请求
    bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    
    bro.switch_to.frame('iframeResult')#如果定位的标签存在于iframe标签之下,则必须执行该操作后,在进行标签定位
    div_tag = bro.find_element_by_id('draggable')
    
    #如何使用动作连
    #实例化一个动作连对象,且将浏览器对象作为参数传递到该对象的构造方法中
    action = ActionChains(bro)
    #
    action.click_and_hold(div_tag)
    
    for i in range(5):
        #偏移的大小
        action.move_by_offset(17,0).perform()
        sleep(0.5)
    动作释放
    action.release()
    #退出浏览器
    bro.quit()

    模拟登陆qq空间

    1.bro.switch_to.frame('iframe_id') bro.switch_to.frame('login_frame') 

    2.send_keys('input标签里面添加数据') bro.find_element_by_id('u').send_keys('用户名') 

    3.page_source  获取页面数据 page_text=bro.page_source 

    #模拟登陆qq空间
    from selenium import webdriver
    from lxml import etree
    from time import sleep
    #实例化浏览器
    bro=webdriver.Chrome(executable_path='./chromedriver.exe')
    #发起请求
    bro.get('https://qzone.qq.com/')
    #定位标签,并点击
    bro.switch_to.frame('login_frame')
    bro.find_element_by_id('switcher_plogin').click()
    #定位标签,添加数据seed_keys
    bro.find_element_by_id('u').send_keys('用户名')
    bro.find_element_by_id('p').send_keys('密码')
    bro.find_element_by_id('login_button').click()
    
    sleep(2)
    #获取页面数据
    page_text=bro.page_source
    #使用etree获取数据
    tree=etree.HTML(page_text)
    data= tree.xpath('//*[@id="feed_478881649_311_0_1560636904_0_1"]/div[1]//text()')
    
    print(data)
    sleep(3)
    #退出浏览器
    bro.quit()

    selenium的识别与规避  

      识别:现在不少大网站有对selenium采取了监测机制,window.navigator.webdriver的值为 undefined。而使用selenium访问则该值为true

      规避:在启动Chromedrever之前,为Chrome开启实验性功能参数,完整代码如下

    1.#Chrome开启实验性功能参数
    from
    selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation'])
    2.#浏览器实例化后,需要添加参数options
    bro=webdriver.Chrome(executable_path='./chromedriver.exe',options=option)

     谷歌无头浏览器操作:代码如下

    1.

    from selenium.webdriver.chrome.options import Options
    # 创建一个参数对象,用来控制chrome以无界面模式打开
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    2.

    #添加参数chrome_options
    bro=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)

    3.截屏操作: bro.save_screenshot('1.png') 

    #如何设置浏览器无可视化界面
    from selenium.webdriver.chrome.options import Options
    # 创建一个参数对象,用来控制chrome以无界面模式打开
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    
    url = 'https://bj.meituan.com/'
    
    #添加参数chrome_options
    bro=webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options)
    bro.get(url) sleep(
    2) bro.get(url) sleep(2)
    #截屏操作 bro.save_screenshot(
    '1.png') print(bro.page_source)

     phantomJs:就是一款无可视化界面的浏览器,现在也无人维护,一般都使用谷歌无头浏览器

    1.实例化phantomJs

    from selenium import webdriver
    # phantomjs路径
    path = r'PhantomJS驱动路径'
    browser = webdriver.PhantomJS(path)

    2.其他操作和谷歌浏览器都一样

    3.截屏操作 browser.save_screenshot(r'phantomjsshow.png') 

    from selenium import webdriver
    import time
    
    # phantomjs路径
    path = r'PhantomJS驱动路径'
    browser = webdriver.PhantomJS(path)
    
    # 打开百度
    url = 'http://www.baidu.com/'
    browser.get(url)
    
    time.sleep(3)
    
    browser.save_screenshot(r'phantomjsaidu.png')
    
    # 查找input输入框
    my_input = browser.find_element_by_id('kw')
    # 往框里面写文字
    my_input.send_keys('美女')
    time.sleep(3)
    #截屏
    browser.save_screenshot(r'phantomjsmeinv.png')
    
    # 查找搜索按钮
    button = browser.find_elements_by_class_name('s_btn')[0]
    button.click()
    
    time.sleep(3)
    
    browser.save_screenshot(r'phantomjsshow.png')
    
    time.sleep(3)
    
    browser.quit()

     总结:

    - selenium:基于浏览器自动化的模块.
    -浏览器自动化操作:通过脚本程序或者python代码,这组程序或者代码表示一些行为动作,selenium可以让这些行为动作映射到浏览器中,根据设定好的行为动作完成自动化的操作.
    - phantomJs:一款无头浏览器,由于现在已经停止维护,所以使用谷歌无头浏览器代替
    - selenium和爬虫之间的关联:
    - 便捷的获取动态加载的数据
    - 实现模拟登录
    - 缺点:
    - 爬取数据的效率低
    - 环境部署繁琐
    - 部署selenium环境
          - pip install selenium
    - 部署浏览器的环境
          - 下载安装对应的浏览器
    - 编码流程:
    - 导包
        -  from selenium import webdriver 

    - 创建一个浏览器对象,且在创建的过程中需要使用浏览器的驱动程序
        -  bro=webdriver.Chrome(executable_path='./chromedriver.exe') 

    - 使用get方法进行请求发送
        -  bro.get('https://qzone.qq.com/') 

    - 指定其他的行为动作对应的代码

    - 关闭浏览器
        -  bro.quit() 

    - 行为动作:
    - 标签定位:find系列的函数
        -  bro.switch_to.frame('iframeResult')#如果定位的标签存在于iframe标签之下,则必须执行该操作后,在进行标签定位 
    - 节点交互:
    - 点击:click()
    - send_keys('xxx')
    - 执行js:
    - excute_script('jsCode')
    - 动作链:
    - 导包:from selemium.webdriver import ActionChians
    - 创建一个动作链对象:action = ActionChians(bro)
    - 调用动作链对象中封装的属性和方法:
    - action.click_and_hold(ele)
    - move_by_offset(x,y)
    - perform():立即执行动作链
    - release()
    - page_source:返回当前浏览器显示页面的全部页面源码数据
    - 无头的设置 phantomJs 谷歌无头浏览器

    - selenium规避监测

    - 截图:save_screenshot('./1.png')
  • 相关阅读:
    FZU 2105 (线段树)
    HDU 4903 (模拟+贪心)
    Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
    HDU 3308 (线段树区间合并)
    POJ 3667(线段树区间合并)
    线段树题集 (cf版)
    HDU 4902 (牛叉的线段树)
    20150204--JS巩固与加强2-01
    20150203+JS巩固与加强1-02
    20150203+JS巩固与加强1-01
  • 原文地址:https://www.cnblogs.com/l1222514/p/11042470.html
Copyright © 2011-2022 走看看