1、selenium是什么呢?

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。

它可以做什么呢?它可以用几行代码,控制浏览器,做出自动打开、输入、点击等操作,就像是有一个真正的用户在操作一样。

selenium允许让人去手动输入验证码,然后把剩下的操作交给机器。 而对于那些交互复杂、加密复杂的网站,selenium问题简化 ,爬动态网页如爬静态网页一样简单。

安装

pip install selenium # Windows电脑安装selenium

selenium的脚本可以控制所有常见浏览器的操作,在使用之前,需要安装浏览器的驱动。

我推荐的是Chrome浏览器,打开下面的链接,就可以下载Chrome的安装包了,Windows和Mac都有。

国内镜像网站地址:
        http://npm.taobao.org/mirrors/chromedriver/2.38/

设置浏览器引擎

下载chromed浏览器驱动:
    把下载好的chromedriver.exe放到python安装路径的scripts目录中即可,注意最新版本是2.38,并非2.9

和以前一样,使用一个新的Python库,首先要调用它。selenium有点不同,除了调用,还需要设置浏览器引擎。

#本地Chrome浏览器设置方法
from selenium import webdriver  # 从selenium库中调用webdriver库
driver_path = r'E:\chromedriver_win32\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
#设置引擎为Chrome,真实地打开一个Chrome浏览器

2、基本使用

示例一:
from selenium import webdriver  #用来驱动浏览器的
from selenium.webdriver import ActionChains #破解滑动验证码的时候用,可拖动图片
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC        # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait   #等待页面加载某些元素
import time
try:
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    wait = WebDriverWait(driver,10)
    input_tag = wait.until(EC.presence_of_element_located((By.ID,'kw')))
    input_tag.send_keys('美女')
    input_tag.send_keys(Keys.ENTER)
    time.sleep(5)

finally:
    driver.close()
示例二:

from selenium import webdriver  # 用来驱动浏览器的
from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
import time
option = webdriver.ChromeOptions()

# 通过add_argument为配置添加参数
# 此参数用于跳过 "正受到自动测试软件的控制"
option.add_argument('disable-infobars')

driver = webdriver.Chrome(chrome_options=option)

try:
    driver.get('https://china.nba.com/')    # 往NBA官网发送get请求
    wait = WebDriverWait(driver,10)         # 获取等待对象,可等待某个元素10秒
    game = wait.until(EC.presence_of_element_located((By.CLASS_NAME,'nav-schedule')))
# 查找赛程标签并点击
    game.click()
    time.sleep(10)
except:
    driver.close()

3、等待元素被加载

'''
1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证所有元素都能查到,必须等待。

2、等待的方式分两种:

    隐式等待:在browser.get('xxx')前就设置,针对所有元素有效

    显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
'''
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()

#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
browser.implicitly_wait(10)

browser.get('https://www.baidu.com')

input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
print(contents)

browser.close()

隐式等待

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')

input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

#显式等待:显式地等待某个元素被加载
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))

contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents)

browser.close()

显式等待

4、选择器

  1. element和elements
element是查找一个标签
elements是查找所有标签

2、 find_element_by_tag_name

<img><a><P>

此方式可以通过 元素的标签名称 来查找元素,但是一般WEB网站的标签名都是会重复的所有用的并不太方便。

3、 find_element_by_class_name

通过元素的class属性选择

4、 find_element_by_css_selector

(.)表示通过 css 属性来定位元素

find_element_by_css_selector(h1.importane)
#获取所有class值important的h1标签

(#)表示通过 id 属性来定位元素

<p id="intro">This is a paragraph of introduction.</p>

find_element_by_css_selector(#"intro")

通过属性选择器

<a title="W3School Home" href="http://w3school.com.cn">W3School</a>

find_element_by_css_selector('a[title][href]')

通过后代选择器

#choose_car option    含空格的,后面的元素不必是前面元素的直接子元素,只要在父元素的里面
#choose_car > option  含>键的,    后面的元素必须是前面元素的直接子元素
#ul > ol > li > em                可以是很多级的父子关系

通过组合型

#food  > span , p                  选择id 为food的所有span子元素和所有的p(包括非food的子元素)
#food > span , #food > p            选择id为food的所有span子元素和所有p子元素
#food  > *                                 选择id为food的所有子元素

兄弟节点的选择(平级关系)

#food + div      只选择id为food紧跟后面的div
#food ~div       选择id为food后面的div或div们,只需要在id的后面,不需要紧跟
方法二  根据元素的属性及属性值来选择元素 :

*[style]  选择所有有stype属性的元素

p[spec=len2]   选择spec属性值只等于len2的p元素

yp[spec='len2 len3' ]    选择spec属性值只等于len2 len3的p元素   有空的值一定要加引号

p[spec*='len2']             选择spec属性值包含len2的p元素

p[spec^='len2']            选择spec属性值以len2开头的p元素

p[spec&='len2']           选择spec属性值以len2结尾的p元素

p[class=special][name=p1]    选择class值等于special,并且name值等于p1的p元素

p:nth-child(1)              选择第一个p元素

p:nth-last-child(1)              选择倒数第一个p元素(要保证最后一个元素是p)

5、find_element_by_id

通过元素id选择

6、find_element_by_link_text

通过链接文本多去超链接

7、find_element_by_partial_link_text

通过链接的部分文本获取超链接

8、find_element_by_name

通过元素的name属性选择

from selenium import webdriver
from selenium.webdriver import ActionChains
import time

option = webdriver.ChromeOptions()

option.add_argument('disable-infobars')

# 通过add_argument为配置添加参数
# 此参数用于跳过 "正受到自动测试软件的控制"
driver = webdriver.Chrome(chrome_options=option)

driver.get('https://qzone.qq.com/')
driver.implicitly_wait(10)

# 1、find_element_by_link_text  通过全局文本去找
driver.switch_to.frame('login_frame')
login_clike = driver.find_element_by_link_text('帐号密码登录').click()

# 2、find_element_by_id 通过id去找
user = driver.find_element_by_id('u')
user.send_keys('1394551891')
pwd = driver.find_element_by_id('p')
pwd.send_keys('zxczxc')

# 3、find_element_by_class_name  根据属性名查找
login = driver.find_element_by_class_name('btn').click()

# 让光标悬浮在个人中心
action = ActionChains(driver).move_to_element(driver.find_element_by_id('slideBlock')).perform()

# 4、find_element_by_partial_link_text  通过局部文本去找
login_tag = driver.find_element_by_partial_link_text('登')
login_tag.click()

# 6、find_element_by_css_selector 根据属性选择器查找
login_btn = driver.find_element_by_css_selector('.btn-login')
login_btn.click()

# 7、find_element_by_tag_name  根据标签名查找
a_s = driver.find_elements_by_tag_name('a')
    for a in a_s:
        # 打印字数超过10位的文本
        if len(a.text) > 10:
            print(a.tex

9、find_element_by_xpath("xpath")

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行查找。

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

选区节点

表达式 描述
节点的名字 选取此节点中的所有子节点
/ 从根节点选取
// 选取当前节点文档中的任意一个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
from selenium import webdriver

'''
<html><head>
  <base href="http://example.com/">
  <title>Example website</title>
 </head>
 <body>
  <div id="images">
   <a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>
   <a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>
   <a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>
   <a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>
   <a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>
  </div>
</body></html>
'''

from selenium import webdriver
driver = webdriver.Chrome()
try:
    driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
    driver.implicitly_wait(3)

    # 获取当html标签内的所有子节点
    html = driver.find_element_by_xpath('html')
    # 查找html中所有的a标签
    a_s = html.find_elements_by_tag_name('a')
    print(len(a_s))

    # 从根节点开始查找html元素
    html = driver.find_element_by_xpath('./html')
    print(html.tag_name)

    # 查找html元素子节点内的body标签,注意只能从根开始查找
    body = driver.find_element_by_xpath('html/body')
    print(body.tag_name)

    # 从当前文档内全局查找,找所有的img标签
    imgs = driver.find_elements_by_xpath('//img')
    for img in imgs:
        print(img.get_attribute('src'))

    #查找html元素下的所有a的节点
    a_tag_s = driver.find_elements_by_xpath('html//a')
    for a in a_tag_s:
        print(a.get_attribute('href'))
finally:
    driver.close()

3获取标签属性(了解)

标签属性 描述
id 标签id
tag_name 标签名
size 标签大小
location 标签高宽
from selenium import webdriver
from selenium.webdriver.common.by import By     # 按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait   # 等待页面加载某些元素
from time import sleep

browser = webdriver.Chrome()

try:
    browser.get('https://www.baidu.com/s?wd=美女')

    wait = WebDriverWait(browser,10)
    img_tag = wait.until(EC.presence_of_element_located((By.CLASS_NAME,'op-img-address-link-imgs')))

    #获取标签属性
    print(img_tag.get_attribute('src'))

# 获取标签ID,位置,名称,大小(了解)
    print(img_tag.id)
    print(img_tag.location)
    print(img_tag.tag_name)
    print(img_tag.size)

    # 获取页面上图片长宽 大小
    print(img_tag.size['height'], img_tag.size['width'])
    print(img_tag.location['x'], img_tag.location['y'])

finally:
    browser.close()

元素交互操作

点击清除

from selenium import webdriver  #用来驱动浏览器
from selenium.webdriver.common.keys import Keys     #键盘按键操作
import time

#获取驱动浏览器配置信息对象,可对其信息进行修改
option = webdriver.ChromeOptions()
# 通过add_argument为配置添加参数
# 此参数用于跳过 "正受到自动测试软件的控制"
option.add_argument('disable-infobars')

driver = webdriver.Chrome(chrome_options=option)

try:
    driver.get('https://www.jd.com')
    driver.implicitly_wait(10)

    input_tag = driver.find_element_by_id('key')
    input_tag.send_keys('大炮')
    search_button = driver.find_element_by_class_name('button').click()
    time.sleep(1)

    #清空
    input_tag = driver.find_element_by_class_name('text')
    input_tag.clear()
    input_tag.send_keys('哇哈哈哈')
    input_tag.send_keys(Keys.ENTER)

except Exception:

    driver.close()

Action Chains

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By     #按照上面方式查找,By.ID,By.css_SELECTOR
from selenium.webdriver.common.keys import Keys     #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait       #等待页面加载某些元素
import time

driver = webdriver.Chrome()
driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
wait = WebDriverWait(driver,3)
# driver.implicitly_wait(3)     使用隐式等待

try:
    driver.switch_to.frame('iframeResult')      ##切换到iframeResult
    sourse = driver.find_element_by_id('draggable')
    target = driver.find_element_by_id('droppable')

    # 方式一:基于同一个动作链串行执行
    # actions = ActionChains(driver)#拿到动作链对象
    # actions.drag_and_drop(sourse,target)#把动作放到动作链中,准备串执行
    # actions.perform()

    # 方式二:不同的动作链,每次移动的位移都不同
    ActionChains(driver).click_and_hold(sourse).perform()
    distance = target.location['x'] - sourse.location['x']

    track = 0
    while track < distance:
        ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
        track += 2

    ActionChains(driver).release().perform()
finally:
    driver.close()

在交互动作比较难实现的时候可以自己写JS(万能方法 )

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

try:
    browser = webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('alert("hello world")')   #打印警告
finally:
    browser.close()

frame的切换

frame相当于一个单独的网页,在父frame里是无法直接看到字frame的元素的,必须switch_to_frame切换到该frame下,才能进一步查找

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By     #按照上面方式找,By.ID,BY.css_SELECTOR
from selenium.webdriver.common.keys import Keys     #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait       #等待页面加载元素

try:
    browser = webdriver.Chrome()
    browser.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
    browser.switch_to.frame('iframeResult') #切换到id为iframeResult的farme
    tag1 = browser.find_element_by_id('droppable')
    print(tag1)

    # tag2=browser.find_element_by_id('textareaCode') #报错,在子frame里无法查看到父frame的元素
    browser.switch_to.frame()   #切回父frame,就可以查到了
    tag2 = browser.find_element_by_id('textareaCode')
    print(tag2)
except:
    browser.close()

模拟浏览器的前进后退

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
driver.get('https://www.taobao.com')
driver.get('https://www.sina.com.cn')

driver.back()
time.sleep(2)
driver.forward()
driver.close()

选项卡管理

#选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:ctrl+t等,最通用的就是js的方式
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get_cookie('https://baidu.com')
driver.execute_script('window.open()')

print(driver.window_handles)        #获取所有的选项卡
driver.switch_to_window(driver.window_handles[1])
driver.get('https://www.taobao.com')
time.sleep(1)
driver.switch_to_window(driver.window_handles[0])
driver.get('https://www.sina.com.cn')

异常处理

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

try:
    driver = webdriver.Chrome()
    driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    driver.switch_to_frame('iframssseResult')
except TimeoutException as e:
    print(e)
except NoSuchFrameException as e:
    print(e)
finally:
    driver.close()

Selenium XPath的更多相关文章

  1. Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium

    Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...

  2. 爬虫 selenium+Xpath 爬取动态js页面元素内容

    介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如 ...

  3. selenium+xpath 文本信息定位

    selenium中根据父子.兄弟.相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点.定位一个节点的哥 ...

  4. Selenium+Java(四)Selenium Xpath元素定位

    前言 关于Selenium元素定位,这是最后一篇博客. Xpath定位可以实现的功能 Selenium+Java(三)Selenium元素定位中讲的定位方式也可以实现,具体要用那种定位方式要根据自己的 ...

  5. python+selenium+xpath 爬取天眼查工商基本信息

    # -*- coding:utf-8 -*-# author: kevin# CreateTime: 2018/8/16# software-version: python 3.7 import ti ...

  6. 自动化测试基础篇--Selenium Xpath定位

    摘自https://www.cnblogs.com/sanzangTst/p/7458056.html 学习 什么是xpath? XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言 ...

  7. selenium+xpath在不同层级的写法

    总结:定位虽然用Inndex定位最快,但是定位最好不要用浏览器自带定位xpath,尽量不要用Index,否则写的UI自动化脚本的定位元素,需要重新维护.代价太大. 一:不在同一层级,可以用[./..] ...

  8. Selenium - Xpath 使用方法

    由于最新版火狐不在支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/下载49版本以下的火狐就可以增加Firebug等扩展了 ...

  9. selenium - xpath - 定位

    前言: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. 看这里介绍:w3school 首先来看一下xpath常用的语法: 一.xpath ...

随机推荐

  1. HTML禁用Flash文件右键

    在项目中遇到一个需求,由于制作Flash的同事没有做禁用Flash文件右键功能!而Flash文件比较多,一个个改不太现实,于是要求用在网页显示的时候禁用Flash右键功能!未禁用之前! 禁用之前: 禁 ...

  2. pyqt 调用QT设计师创建的对话框

    一.实验环境 1.Windows7x64_SP1 2.anaconda2.5.0 + python2.7(anaconda集成,不需单独安装) 3.pyinstaller3.0 二.实验步骤 2.1 ...

  3. pyqt中pyrcc和pyuic的使用

    一.pyrcc的使用 1.1 作用 将资源文件转换成py文件,并在主程序引入 1.2 资源文件编写说明 新建resource.qrc,代码如下: <!DOCTYPE RCC><RCC ...

  4. Oracle之PL/SQL

    基础语法 [declare --定义部分] begin --执行部分 [exception --异常处理部分] end; 其中,定义部分以declare开始,该部分是可选的;执行部分以begin开始, ...

  5. 容斥原理--计算并集的元素个数 URAL 1091

    在计数时,必须注意没有重复,没有遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计 ...

  6. git 用 diff 来检查改动

    用 diff 来检查改动 项目的开发是由无数个微小的改动组成的.了解项目开发过程的关键就是要搞清楚每一个改动.当然你可以使用 “git status” 命令或更简单的 “git log” 命令来打印出 ...

  7. QT 随笔目录

    [1]基础部分 <信号和槽机制> <信号与槽知识点> <QString 与 string转换> <QT 继承QWidget && 继承QDia ...

  8. Java匹马行天下之JavaSE核心技术——反射机制

    Java反射机制 一.什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及 ...

  9. Notes:Unit Testing

    UnitTesting shanzm 右键-->在新标签页中打开图片,即可查看原图,图片超乎你想像的大!

  10. PHP RSA签名

    /** * RSA签名 * @param $data 待签名数据 * @param $private_key 私钥字符串 * return 签名结果 */function rsaSign($data, ...