1、selenium介绍
    Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。本节中,就让我们来感受一下它的强大之处吧。
    Selenium是调用本地浏览器直接发送请求,这样不管网站运用多么复杂的数据加载算法、加密等手段,都可以通过所见即所得来获取数据,当然这种方式的缺点就是速度比较慢,需要等待浏览器渲染出页面元素。


2、selenium安装,python与selenium版本均选择3.X以上版本
    (1)安装selenium的python支持库,使用命令 pip install selenium
    (2)下载并运行selenium-server服务器,官方下载地址为:http://selenium-release.storage.googleapis.com/3.11/selenium-server-standalone-3.11.0.jar,下载完成后运行java -jar selenium-server-standalone-3.11.0.jar 启动服务,启动成功后的样子:
    python爬虫-selenium使用篇
     
       编码方式:
        from selenium import webdriver
        from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
        browser = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=DesiredCapabilities.CHROME)    #将使用chrome浏览器
        browser.get('https://www.baidu.com';) 

    (3)另外也可以根据你使用的浏览器,Chrome或FireFox等下载对应的driver程序,如chromedriver的下载地址为:https://chromedriver.storage.googleapis.com/index.html?path=2.37/
       编码方式:
        from selenium import webdriver    #导入需要的库文件
        browser = webdriver.Chrome(executable_path="D:\\selenium_server\\chromedriver")    #这里需要指定chromedriver地址
        browser.get('https://www.baidu.com';)    #需要打开的网页

   (4)程序运行后的如下:
    python爬虫-selenium使用篇

到这里为止说明你已经安装成功了。
如果你不能翻墙,无法下载所需的资源,可以到 https://download.csdn.net/download/wollzengji/10360107 这个页面去下载


3、selenium使用
    (1)简单示例
      from selenium import webdriver
   from selenium.webdriver.common.keys import Keys    #提供键盘按键支持
      browser= webdriver.Chrome(executable_path="D:\\selenium_server\\chromedriver")
    browser.get("http://www.python.org";)    #打开页面
    assert "Python" in browser.title    #判断title中是否含有“Python”,如果不含有将抛出异常
    elem = browser.find_element_by_name("q")    #找到元素
    elem.clear()    #清空输入框
    elem.send_keys("pycon")    #在输入框中输入字符
    elem.send_keys(Keys.RETURN)    #提交页面
    browser.close()    #关闭页面quit方法将关闭整个浏览器

    (2)查找元素
        单个元素:
  • 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_elements_by_name
  • 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
示例:
browser.find_element_by_id('loginForm')    #通过id查找元素
browser.find_element_by_name('username')    #通过name来判断,将查找第一个元素,如 <input name="username" type="text" />
browser.find_element_by_xpath("//form[@id='loginForm']")    #通过xpath查找元素,包含 id 属性并且其值为 loginForm 的form元素
browser.find_element_by_link_text('Continue')    #通过链接文本查找元素,如<a href="continue.html">Continue</a>
browser.find_element_by_tag_name('h1')    #通过标签名查找元素,如<h1>Welcome</h1>
browser.find_element_by_class_name('content')    #通过class name查找元素,如<p class="content">Site content goes here.</p>
browser.find_element_by_css_selector('p.content')    #通过CSS选择器查找元素,如<p class="content">Site content goes here.</p>

可以通过browser.find_element_by_id('loginForm').get_attribute("title")    #获取元素属性内容
browser.find_element_by_id('loginForm').text    #获取元素文本
    
    (3)与页面交互
element.clear()    #清空输入框
element.send_keys("some text")    #在输入框中输入文本

from selenium.webdriver.support.ui import Select
select = Select(browser.find_element_by_name('name'))    #找到select元素
select.select_by_index(index)    #根据下标找到具体option
select.select_by_visible_text("text")    #根据文本找到具体option
select.select_by_value(value)    ##根据value找到具体option
select.deselect_all()    #取消选中option
select.all_selected_options #获得选中的option
select.options    #获得所有的option
option.click()    #选中option

browser.find_element_by_id("submit").click()    #提交表单
browser.forward()    #在历史记录中前进
browser.back()    #在历史记录中后退
browser.get_cookies()    #获取所有的cookie
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com';, 'value': 'germey'})    #添加cookie
browser.delete_all_cookies()    #删除所有cookie

browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")    #滚到页面的底部,这里是用了模拟javaScript方法

    (4)等待页面加载完成(Waits)
        现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。
        Selenium Webdriver 提供两种类型的waits - 隐式和显式。 显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再去查找某元素。
    (a)显示等待:
    wait = WebDriverWait(browser, 10)
    imput=wait.until(EC.presence_of_element_located((By.ID, 'tagId')))
  button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
    在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。 WebDriverWait 默认情况下会每500毫秒调用一次ExpectedCondition直到结果成功返回。 ExpectedCondition成功的返回结果是一个布尔类型的true或是不为null的返回值。

可以通过以下元素查找内容
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

 等待条件及其含义
等待条件
含义
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
是否出现警告
(b)隐式等待
    browser.implicitly_wait(10)# 该操作会等待10秒钟以后,在执行后续操作,除非服务器限速,不然推荐使用显示等待


4、资料文件
官方网站:http://www.seleniumhq.org













    

相关文章: