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. Java 并发编程-不懂原理多吃亏(送书福利)

    作者 | 加多 关注阿里巴巴云原生公众号,后台回复关键字"并发",即可参与送书抽奖!** 导读:并发编程与 Java 中其他知识点相比较而言学习门槛较高,从而导致很多人望而却步.但 ...

  2. Java学习清单

    转自: csdn/zuochao_2013/article/details/76795164   ·   Java基础部分 *Java基础才是重中之重,只有基础打牢了,学习各种框架才能游刃有余. 1, ...

  3. EasyNetQ笔记

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

  4. Xamarin vs React Native vs Ionic vs NativeScript: Cross-platform Mobile Frameworks Comparison

    CONTENTS Reading time: 14 minutes Cross-platform mobile development has long been a viable alternati ...

  5. react的模型:react是如何工作的?

    1.jsx:语法模型,语句构建模型: 2.组件:集合模型,组件管理: 3.vdom:分层模型.渲染管理模型: 4.flux:管道模型.数据模型,状态管理模型: 整体上是一个UI系统从上到下的构建: f ...

  6. 基于YOLO3对图像加框的函数draw_image()

    def draw_bbox(image, bboxes, class_i, show_label=True): # 将中心点坐标与w,h通过变化为左上角与右下角坐标 bboxes_change = n ...

  7. Java自学-I/O 中文问题

    Java中的编码中文问题 步骤 1 : 编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字. 就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号. 有的棋盘 ...

  8. vim进阶

    输入终端命令:!+命令 sudo保存:w !sudo tee % 显示当前路径::pwd 查看缓冲区::ls 打开缓冲区文件:buffer 2 命令补全:Tab键 :r!date读shell日期到vi ...

  9. D2Admin基本使用

    目录 d2-admin基本使用 1 安装 1.1 全局安装 d2-admin 1.2 创建项目 1.3 启动项目 1.4 注意事项 2 修改框架 title 和 logo 2.1 修改 title 2 ...

  10. Markdown 文件如何实现 chm 文件打包

    需要借助2个工具,下面的链接都有对应的网址 LME和 hhw, 有不清楚的可以下面评论,7*24小时在线解答问题,也可以加博主微信 首先借助 Markdown To CHM(LME) 工具将Markd ...