1、selenium是什么呢?

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

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

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

安装

  1. pip install selenium # Windows电脑安装selenium

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

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

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

设置浏览器引擎

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

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

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

2、基本使用

  1. 示例一:
  2. from selenium import webdriver #用来驱动浏览器的
  3. from selenium.webdriver import ActionChains #破解滑动验证码的时候用,可拖动图片
  4. from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
  5. from selenium.webdriver.common.keys import Keys #键盘按键操作
  6. from selenium.webdriver.support import expected_conditions as EC # 和下面WebDriverWait一起用的
  7. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
  8. import time
  9. try:
  10. driver = webdriver.Chrome()
  11. driver.get('https://www.baidu.com')
  12. wait = WebDriverWait(driver,10)
  13. input_tag = wait.until(EC.presence_of_element_located((By.ID,'kw')))
  14. input_tag.send_keys('美女')
  15. input_tag.send_keys(Keys.ENTER)
  16. time.sleep(5)
  17. finally:
  18. driver.close()
  1. 示例二:
  2. from selenium import webdriver # 用来驱动浏览器的
  3. from selenium.webdriver.common.by import By # 按照什么方式查找,By.ID,By.CSS_SELECTOR
  4. from selenium.webdriver.support import expected_conditions as EC # 和下面WebDriverWait一起用的
  5. from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
  6. import time
  7. option = webdriver.ChromeOptions()
  8. # 通过add_argument为配置添加参数
  9. # 此参数用于跳过 "正受到自动测试软件的控制"
  10. option.add_argument('disable-infobars')
  11. driver = webdriver.Chrome(chrome_options=option)
  12. try:
  13. driver.get('https://china.nba.com/') # 往NBA官网发送get请求
  14. wait = WebDriverWait(driver,10) # 获取等待对象,可等待某个元素10秒
  15. game = wait.until(EC.presence_of_element_located((By.CLASS_NAME,'nav-schedule')))
  16. # 查找赛程标签并点击
  17. game.click()
  18. time.sleep(10)
  19. except:
  20. driver.close()

3、等待元素被加载

  1. '''
  2. 1、selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证所有元素都能查到,必须等待。
  3. 2、等待的方式分两种:
  4. 隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
  5. 显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
  6. '''
  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
  4. from selenium.webdriver.common.keys import Keys #键盘按键操作
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
  7. browser=webdriver.Chrome()
  8. #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
  9. browser.implicitly_wait(10)
  10. browser.get('https://www.baidu.com')
  11. input_tag=browser.find_element_by_id('kw')
  12. input_tag.send_keys('美女')
  13. input_tag.send_keys(Keys.ENTER)
  14. contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
  15. print(contents)
  16. browser.close()
  17. 隐式等待
  18. from selenium import webdriver
  19. from selenium.webdriver import ActionChains
  20. from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
  21. from selenium.webdriver.common.keys import Keys #键盘按键操作
  22. from selenium.webdriver.support import expected_conditions as EC
  23. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
  24. browser=webdriver.Chrome()
  25. browser.get('https://www.baidu.com')
  26. input_tag=browser.find_element_by_id('kw')
  27. input_tag.send_keys('美女')
  28. input_tag.send_keys(Keys.ENTER)
  29. #显式等待:显式地等待某个元素被加载
  30. wait=WebDriverWait(browser,10)
  31. wait.until(EC.presence_of_element_located((By.ID,'content_left')))
  32. contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
  33. print(contents)
  34. browser.close()
  35. 显式等待

4、选择器

  1. element和elements
  1. element是查找一个标签
  2. 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 属性来定位元素

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

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

  1. <p id="intro">This is a paragraph of introduction.</p>
  2. find_element_by_css_selector(#"intro")

通过属性选择器

  1. <a title="W3School Home" href="http://w3school.com.cn">W3School</a>
  2. find_element_by_css_selector('a[title][href]')

通过后代选择器

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

通过组合型

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

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

  1. #food + div 只选择id为food紧跟后面的div
  1. #food ~div 选择id为food后面的div或div们,只需要在id的后面,不需要紧跟
  1. 方法二 根据元素的属性及属性值来选择元素
  2. *[style] 选择所有有stype属性的元素
  3. p[spec=len2] 选择spec属性值只等于len2p元素
  4. yp[spec='len2 len3' ] 选择spec属性值只等于len2 len3p元素 有空的值一定要加引号
  5. p[spec*='len2'] 选择spec属性值包含len2p元素
  6. p[spec^='len2'] 选择spec属性值以len2开头的p元素
  7. p[spec&='len2'] 选择spec属性值以len2结尾的p元素
  8. p[class=special][name=p1] 选择class值等于special,并且name值等于p1p元素
  9. p:nth-child(1) 选择第一个p元素
  10. 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属性选择

  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. import time
  4. option = webdriver.ChromeOptions()
  5. option.add_argument('disable-infobars')
  6. # 通过add_argument为配置添加参数
  7. # 此参数用于跳过 "正受到自动测试软件的控制"
  8. driver = webdriver.Chrome(chrome_options=option)
  9. driver.get('https://qzone.qq.com/')
  10. driver.implicitly_wait(10)
  11. # 1、find_element_by_link_text 通过全局文本去找
  12. driver.switch_to.frame('login_frame')
  13. login_clike = driver.find_element_by_link_text('帐号密码登录').click()
  14. # 2、find_element_by_id 通过id去找
  15. user = driver.find_element_by_id('u')
  16. user.send_keys('1394551891')
  17. pwd = driver.find_element_by_id('p')
  18. pwd.send_keys('zxczxc')
  19. # 3、find_element_by_class_name 根据属性名查找
  20. login = driver.find_element_by_class_name('btn').click()
  21. # 让光标悬浮在个人中心
  22. action = ActionChains(driver).move_to_element(driver.find_element_by_id('slideBlock')).perform()
  23. # 4、find_element_by_partial_link_text 通过局部文本去找
  24. login_tag = driver.find_element_by_partial_link_text('登')
  25. login_tag.click()
  26. # 6、find_element_by_css_selector 根据属性选择器查找
  27. login_btn = driver.find_element_by_css_selector('.btn-login')
  28. login_btn.click()
  29. # 7、find_element_by_tag_name 根据标签名查找
  30. a_s = driver.find_elements_by_tag_name('a')
  31. for a in a_s:
  32. # 打印字数超过10位的文本
  33. if len(a.text) > 10:
  34. print(a.tex

9、find_element_by_xpath("xpath")

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

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

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

选区节点

表达式 描述
节点的名字 选取此节点中的所有子节点
/ 从根节点选取
// 选取当前节点文档中的任意一个节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
  1. from selenium import webdriver
  2. '''
  3. <html><head>
  4. <base href="http://example.com/">
  5. <title>Example website</title>
  6. </head>
  7. <body>
  8. <div id="images">
  9. <a href="image1.html">Name: My image 1 <br><img src="image1_thumb.jpg"></a>
  10. <a href="image2.html">Name: My image 2 <br><img src="image2_thumb.jpg"></a>
  11. <a href="image3.html">Name: My image 3 <br><img src="image3_thumb.jpg"></a>
  12. <a href="image4.html">Name: My image 4 <br><img src="image4_thumb.jpg"></a>
  13. <a href="image5.html">Name: My image 5 <br><img src="image5_thumb.jpg"></a>
  14. </div>
  15. </body></html>
  16. '''
  17. from selenium import webdriver
  18. driver = webdriver.Chrome()
  19. try:
  20. driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
  21. driver.implicitly_wait(3)
  22. # 获取当html标签内的所有子节点
  23. html = driver.find_element_by_xpath('html')
  24. # 查找html中所有的a标签
  25. a_s = html.find_elements_by_tag_name('a')
  26. print(len(a_s))
  27. # 从根节点开始查找html元素
  28. html = driver.find_element_by_xpath('./html')
  29. print(html.tag_name)
  30. # 查找html元素子节点内的body标签,注意只能从根开始查找
  31. body = driver.find_element_by_xpath('html/body')
  32. print(body.tag_name)
  33. # 从当前文档内全局查找,找所有的img标签
  34. imgs = driver.find_elements_by_xpath('//img')
  35. for img in imgs:
  36. print(img.get_attribute('src'))
  37. #查找html元素下的所有a的节点
  38. a_tag_s = driver.find_elements_by_xpath('html//a')
  39. for a in a_tag_s:
  40. print(a.get_attribute('href'))
  41. finally:
  42. driver.close()

3获取标签属性(了解)

标签属性 描述
id 标签id
tag_name 标签名
size 标签大小
location 标签高宽
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By # 按照什么方式查找,By.ID,By.CSS_SELECTOR
  3. from selenium.webdriver.support import expected_conditions as EC
  4. from selenium.webdriver.support.wait import WebDriverWait # 等待页面加载某些元素
  5. from time import sleep
  6. browser = webdriver.Chrome()
  7. try:
  8. browser.get('https://www.baidu.com/s?wd=美女')
  9. wait = WebDriverWait(browser,10)
  10. img_tag = wait.until(EC.presence_of_element_located((By.CLASS_NAME,'op-img-address-link-imgs')))
  11. #获取标签属性
  12. print(img_tag.get_attribute('src'))
  13. # 获取标签ID,位置,名称,大小(了解)
  14. print(img_tag.id)
  15. print(img_tag.location)
  16. print(img_tag.tag_name)
  17. print(img_tag.size)
  18. # 获取页面上图片长宽 大小
  19. print(img_tag.size['height'], img_tag.size['width'])
  20. print(img_tag.location['x'], img_tag.location['y'])
  21. finally:
  22. browser.close()

元素交互操作

点击清除

  1. from selenium import webdriver #用来驱动浏览器
  2. from selenium.webdriver.common.keys import Keys #键盘按键操作
  3. import time
  4. #获取驱动浏览器配置信息对象,可对其信息进行修改
  5. option = webdriver.ChromeOptions()
  6. # 通过add_argument为配置添加参数
  7. # 此参数用于跳过 "正受到自动测试软件的控制"
  8. option.add_argument('disable-infobars')
  9. driver = webdriver.Chrome(chrome_options=option)
  10. try:
  11. driver.get('https://www.jd.com')
  12. driver.implicitly_wait(10)
  13. input_tag = driver.find_element_by_id('key')
  14. input_tag.send_keys('大炮')
  15. search_button = driver.find_element_by_class_name('button').click()
  16. time.sleep(1)
  17. #清空
  18. input_tag = driver.find_element_by_class_name('text')
  19. input_tag.clear()
  20. input_tag.send_keys('哇哈哈哈')
  21. input_tag.send_keys(Keys.ENTER)
  22. except Exception:
  23. driver.close()

Action Chains

  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By #按照上面方式查找,By.ID,By.css_SELECTOR
  4. from selenium.webdriver.common.keys import Keys #键盘按键操作
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
  7. import time
  8. driver = webdriver.Chrome()
  9. driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
  10. wait = WebDriverWait(driver,3)
  11. # driver.implicitly_wait(3) 使用隐式等待
  12. try:
  13. driver.switch_to.frame('iframeResult') ##切换到iframeResult
  14. sourse = driver.find_element_by_id('draggable')
  15. target = driver.find_element_by_id('droppable')
  16. # 方式一:基于同一个动作链串行执行
  17. # actions = ActionChains(driver)#拿到动作链对象
  18. # actions.drag_and_drop(sourse,target)#把动作放到动作链中,准备串执行
  19. # actions.perform()
  20. # 方式二:不同的动作链,每次移动的位移都不同
  21. ActionChains(driver).click_and_hold(sourse).perform()
  22. distance = target.location['x'] - sourse.location['x']
  23. track = 0
  24. while track < distance:
  25. ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform()
  26. track += 2
  27. ActionChains(driver).release().perform()
  28. finally:
  29. driver.close()

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

  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
  4. from selenium.webdriver.common.keys import Keys #键盘按键操作
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
  7. try:
  8. browser = webdriver.Chrome()
  9. browser.get('https://www.baidu.com')
  10. browser.execute_script('alert("hello world")') #打印警告
  11. finally:
  12. browser.close()

frame的切换

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

  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. from selenium.webdriver.common.by import By #按照上面方式找,By.ID,BY.css_SELECTOR
  4. from selenium.webdriver.common.keys import Keys #键盘按键操作
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.support.wait import WebDriverWait #等待页面加载元素
  7. try:
  8. browser = webdriver.Chrome()
  9. browser.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
  10. browser.switch_to.frame('iframeResult') #切换到id为iframeResult的farme
  11. tag1 = browser.find_element_by_id('droppable')
  12. print(tag1)
  13. # tag2=browser.find_element_by_id('textareaCode') #报错,在子frame里无法查看到父frame的元素
  14. browser.switch_to.frame() #切回父frame,就可以查到了
  15. tag2 = browser.find_element_by_id('textareaCode')
  16. print(tag2)
  17. except:
  18. browser.close()

模拟浏览器的前进后退

  1. import time
  2. from selenium import webdriver
  3. driver = webdriver.Chrome()
  4. driver.get('https://www.baidu.com')
  5. driver.get('https://www.taobao.com')
  6. driver.get('https://www.sina.com.cn')
  7. driver.back()
  8. time.sleep(2)
  9. driver.forward()
  10. driver.close()

选项卡管理

  1. #选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:ctrl+t等,最通用的就是js的方式
  2. from selenium import webdriver
  3. import time
  4. driver = webdriver.Chrome()
  5. driver.get_cookie('https://baidu.com')
  6. driver.execute_script('window.open()')
  7. print(driver.window_handles) #获取所有的选项卡
  8. driver.switch_to_window(driver.window_handles[1])
  9. driver.get('https://www.taobao.com')
  10. time.sleep(1)
  11. driver.switch_to_window(driver.window_handles[0])
  12. driver.get('https://www.sina.com.cn')

异常处理

  1. from selenium import webdriver
  2. from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
  3. try:
  4. driver = webdriver.Chrome()
  5. driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
  6. driver.switch_to_frame('iframssseResult')
  7. except TimeoutException as e:
  8. print(e)
  9. except NoSuchFrameException as e:
  10. print(e)
  11. finally:
  12. 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. IDEA 常用命令

    1.快捷键 Alt + Enter 导入包,自动修正代码 Ctrl + Y 删除光标所在行 Ctrl + D 复制光标所在行,插入光标位置下面 Ctrl + Alt + L 格式化代码 Ctrl + ...

  2. C++:const

    const const是C++提供的一个强大的关键字,const的用法非常多,但总的来说,const的作用只有一个:保证被修饰的内容不会被程序所修改. const基本用法 对一个类型的对象使用cons ...

  3. 自动化部署Ruby on Rails应用(docker + jenkins)

    docker安装参考链接docker官网jenkins中文官网 我的博客网站已经迁移到了https://johnnyting.github.io/,如果有兴趣的可以关注下.下面文章格式可能有点乱,可以 ...

  4. Prometheus 告警分配到指定接收组

    Prometheus 告警分配到指定接收组 route属性用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配. 主要处理流程:1. 接收到Alert,根据labels判断属于 ...

  5. golang--生成某区间的随机数

    import ( "crypto/rand" "fmt" "math" "math/big" ) func main() ...

  6. Postman安装使用

    下载链接:https://www.getpostman.com/downloads/ 选择下载的版本 postman基础功能介绍 collection在postman里面相当于一个文件夹,可以把同一个 ...

  7. WPF 精修篇 管理资源字典

    原文:WPF 精修篇 管理资源字典 样式太多  每个界面可能需要全局的样式 有没有肯能 WPF 中的样式 像Asp.net中 的CSS一样管理那 有的 有资源字典 BurshDictionary &l ...

  8. C# static readonly 修饰符初始化变量

    同事问了一个问题,readonly和static啥区别? 我就写了个demo运行了下: /*** * 验证初始化次数:static只初始化一次,无论多少用户访问,在内存中只有一份 * readonly ...

  9. .net core启用 autoMapper

    启用 autoMapper   autoMapper 基于约定的对象映射器 目录 安装包 添加服务 书写映射关系 安装包   需要安装两个包:AutoMapper和AutoMapper.Extensi ...

  10. spring容器的功能扩展

    容器的扩展功能主要实现为: org.springframework.context.support.AbstractApplicationContext.refresh() public void r ...