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. redis对象存储(适用于订单系统自动更新)

    启动:redis-server.exe redis.windows.conf连接:redis-cli.exe -h 127.0.0.1 -p 6379 #插入取消的订单列表与时间: redis 127 ...

  2. EasyNetQ笔记

    Each call to Subscribe creates a new queue consumer. If you call Subscribe two times with the same m ...

  3. spring-session(二)与spring-boot整合实战

    前两篇介绍了spring-session的原理,这篇在理论的基础上再实战. spring-boot整合spring-session的自动配置可谓是开箱即用,极其简洁和方便.这篇文章即介绍spring- ...

  4. SQlServer 变量定义 赋值

    declare @id int declare @name char(10) ;注意:char(10)为10位,要是位数小了会让数据出错 set @id=1 select @id=1 select @ ...

  5. angular 监听离开页面执行相关操作

    $scope.$on("$destroy", function() { //...})

  6. datatable转layui表格【偏原理】

    如题这个类负责把datatable转换为layui表格可以显示的内容.适合配合表格url字段的webapi服务端,为其返回响应字符串.代码如下:using System;using System.We ...

  7. c#在sqlserver中使用EF框架

    vs2017,sqlserver2017(localdb)调试通过.在sqlserver中创建数据库d1,表t1如下: 录入数据如下: 在vs新建任意项目,此处以控制台为例.添加数据模型Model1: ...

  8. 【翻译】asp.net core 3.0基本概念

    这篇文章描述了开发asp.net core所需要掌握的基本概念. 原文地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/?vie ...

  9. PIE SDK打开自定义栅格数据

    1. 数据介绍 信息提取和解译的过程中,经常会生成一部分中间临时栅格数据,这些数据在执行完对应操作后就失去了存在的价值,针对这种情况,PIE增加了内存栅格数据集,来协助用户完成对自定义栅格数据的读取和 ...

  10. js 数组去重总结

    es6 set ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. let arr = [1,2,3,4,3,2,3,4,6,7,6]; let unique = ...