官方文档:https://selenium-python.readthedocs.io/

Selenium:自动化测试工具,支持多种浏览器。爬虫中主要用来解决JavaScript渲染的问题。

一、开始

基本使用

from selenium import webdriver
from selenium.webdriver.common.by import By
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()
try:
browser.get("https://www.baidu.com")
input = browser.find_element_by_id("kw") # 查找id为kw的元素
input.send_keys("Python") # 相当于在输入框输入Python
input.send_keys(Keys.ENTER) # 回车
wait = WebDriverWait(browser, 10)
# 等待id为content_left的元素加载出来
wait.until(EC.presence_of_element_located((By.ID, "content_left")))
print(browser.current_url)
print(browser.get_cookies())
print(browser.page_source)
finally:
browser.close()

声明浏览器对象

from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

访问页面

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
print(browser.page_source)
browser.close()

二、查找元素

单个元素

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
# 查找id为q的元素
input1 = browser.find_element_by_id("q")
# CSS选择器选择元素
input2 = browser.find_element_by_css_selector("#q")
# xpath选择元素
input3 = browser.find_element_by_xpath("//*[@id='q']")
print(input1, input2, input3)
"""
<selenium.webdriver.remote.webelement.WebElement (session="7b4386265c07c8e860a4e57cf7f15e6a", element="0.2418348835793498-1")>
<selenium.webdriver.remote.webelement.WebElement (session="7b4386265c07c8e860a4e57cf7f15e6a", element="0.2418348835793498-1")>
<selenium.webdriver.remote.webelement.WebElement (session="7b4386265c07c8e860a4e57cf7f15e6a", element="0.2418348835793498-1")>
"""
browser.close()

查找方式:

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

通用查找方式:

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
input = browser.find_element(By.ID, "q")
print(input)
browser.close()

多个元素

实际上就是复数的区别。

from selenium import webdriver
from selenium.webdriver.common.by import By browser = webdriver.Chrome()
browser.get("https://www.taobao.com") li = browser.find_elements_by_css_selector(".service-bd li")
print(li)
browser.close()
####################
li = browser.find_elements(By.CSS_SELECTOR, ".service-bd li")
print(li)
browser.close()

查找方式: 

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

三、元素交互操作

对获取的元素调用交互方法。

import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get("https://www.taobao.com")
input = browser.find_element_by_id("q")
input.send_keys("iPhone")
time.sleep(1)
input.clear()
input.send_keys("iPad")
button = browser.find_element_by_class_name("btn-search")
button.click()

更多操作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

四、交互动作

将动作附加到动作链中串行执行。

from selenium import webdriver
from selenium.webdriver import ActionChains browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame("iframeResult")
source = browser.find_element_by_css_selector("#draggable")
target = browser.find_element_by_css_selector("#droppable")
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform() # 执行这个动作

效果:

更多操作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

五、执行JavaScript

实现滚动条下拉:

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
browser.execute_script("window.scrollTo(0, document.body.scrollHeight)")
browser.execute_script("alert('To Bottom')")

六、获取元素信息

获取属性

from selenium import webdriver

browser = webdriver.Chrome()
url = "https://www.zhihu.com/explore"
browser.get(url)
logo = browser.find_element_by_id("zh-top-link-logo")
print(logo)
print(logo.get_attribute("class"))

获取文本值

from selenium import webdriver

browser = webdriver.Chrome()
url = "https://www.zhihu.com/explore"
browser.get(url)
input = browser.find_element_by_class_name("zu-top-add-question")
print(input.text)

获取ID、位置、标签名、大小

from selenium import webdriver

browser = webdriver.Chrome()
url = "https://www.zhihu.com/explore"
browser.get(url)
input = browser.find_element_by_class_name("zu-top-add-question")
print(input.id) # 0.11034585982176792-1
print(input.location) # {'x': 675, 'y': 7}
print(input.tag_name) # button
print(input.size) # {'width': 66, 'height': 32}

Frame

在父级frame查找子元素frame,必须要切换到这个frame里面才能实现。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome()
url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame("iframeResult")
source = browser.find_element_by_css_selector("#draggable")
print(source) # <selenium.webdriver.remote.webelement.WebElement (session="89ada324d9e5476b0fbb4f62392f31df", element="0.4817565418291889-1")>
try:
# 如果在frame里面查找frame外面的元素,很可能会报错
logo1 = browser.find_element_by_class_name("logo")
except NoSuchElementException: # 找不到元素错误
print("No logo") # No logo
browser.switch_to.parent_frame() # 切换到父frame
logo2 = browser.find_element_by_class_name("logo")
print(logo2)
print(logo2.text) # RUNOOB.COM

七、等待

如果某些元素没有加载出来/完成,将会导致一些问题。所以应该设置等待,延长时间,确保元素完全都加载出来后,再进行一些操作,这样就可以避免一些异常出现。

隐式等待(如果网速特别慢,则可以使用)

当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常。换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找DOM,默认的时间是0。

from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get("https://www.zhihu.com/explore")
# 如果网速特别慢,导致类属性值为zu-top-add-question这个元素没有加载出来,将会再等待10s
input = browser.find_element_by_class_name("zu-top-add-question")
print(input)

显式等待(常用)

你指定一个等待条件,再指定一个最长等待时间。显示等待会在最长等待时间内判断这个条件是否成立,如果成立则立即返回;如果不成立则会一直等待,直到等待到最长等待时间,如果还是不满足这个条件,就会抛出异常。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
wait = WebDriverWait(browser, 10) # 10代表最长等待时间
# 使用until传入等待条件
input = wait.until(EC.presence_of_element_located((By.ID, "q"))) # 判断id为q的元素是否出现了
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search"))) # 判断这个元素是否可点击
print(input, button)

判断条件:

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 # frame加载并切换
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 # 是否出现Alert

更多详细内容:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

七、前进后退

import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get("https://www.baidu.com/")
browser.get("https://www.sogou.com/")
browser.get("https://cn.bing.com/")
browser.back()
time.sleep(1)
browser.forward()
time.sleep(1)
browser.close()

八、Cookies

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
print(browser.get_cookies())
browser.add_cookie({"domain": "www.zhihu.com", "value": "pd"})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

九、标签页(窗口)切换

import time
from selenium import webdriver browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.execute_script("window.open()")
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get("https://www.sogou.com/")
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get("https://cn.bing.com/")
browser.close()

十、异常处理

from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.find_element_by_id("hello")
browser.close()
"""
Traceback (most recent call last):
File "E:/LearnPython/spider/request.py", line 3, in <module>
browser = webdriver.Chrome()
File "C:\Python3\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 81, in __init__
desired_capabilities=desired_capabilities)
File "C:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 157, in __init__
self.start_session(capabilities, browser_profile)
File "C:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "C:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "C:\Python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created
from disconnected: received Inspector.detached event
(Session info: chrome=73.0.3683.86)
(Driver info: chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),platform=Windows NT 6.1.7601 SP1 x86_64)
"""

发生异常

捕获异常:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome()
try:
browser.get("https://www.baidu.com")
except TimeoutException:
print("Timeout")
try:
browser.find_element_by_id("hello")
except NoSuchElementException:
print("NoSuchElement")
finally:
browser.close()

详细文档:https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

爬虫之Selenium库的更多相关文章

  1. Python爬虫之selenium库使用详解

    Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...

  2. Python爬虫之Selenium库的基本使用

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Fire ...

  3. python爬虫 Selenium库学习

    一.自动化测试工具,支持多种浏览器,解决JS渲染问题 二.安装 pip3 install Selenium 三.操作介绍(因为是学习别人的课程为了尊重知识产权,部分代码就不显示了) 1驱动浏览器 br ...

  4. python爬虫---selenium库的用法

    python爬虫---selenium库的用法 selenium是一个自动化测试工具,支持Firefox,Chrome等众多浏览器 在爬虫中的应用主要是用来解决JS渲染的问题. 1.使用前需要安装这个 ...

  5. python爬虫笔记----4.Selenium库(自动化库)

    4.Selenium库 (自动化测试工具,支持多种浏览器,爬虫主要解决js渲染的问题) pip install selenium 基本使用 from selenium import webdriver ...

  6. Python爬虫-- selenium库

    selenium库 selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(S ...

  7. PYTHON 爬虫笔记七:Selenium库基础用法

    知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...

  8. 网络爬虫之Selenium模块和Xpath表达式+Lxml解析库的使用

    实际生产环境下,我们一般使用lxml的xpath来解析出我们想要的数据,本篇博客将重点整理Selenium和Xpath表达式,关于CSS选择器,将另外再整理一篇! 一.介绍: selenium最初是一 ...

  9. python爬虫---从零开始(六)Selenium库

    什么是Selenium库: 自动化测试工具,支持多种浏览器.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera ...

随机推荐

  1. 利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全)

    利用JFreeChart生成区域图 (5) (转自 JSP开发技术大全) 14.5 利用JFreeChart生成区域图 通过JFreeChart插件只能生成普通效果的区域图,利用工厂类ChartFac ...

  2. Coolite Toolkit介绍

    Coolite Toolkit非常棒的控件   Coolite Toolkit介绍 Coolite Toolkit 是一个支持ASP.NET AJAX的Web控件. Coolite Toolkit是基 ...

  3. A brief preview of the new features introduced by OpenGL 3.3 and 4.0

    A brief preview of the new features introduced by OpenGL 3.3 and 4.0   The Khronos Group continues t ...

  4. bzoj 1783: [Usaco2010 Jan]Taking Turns【贪心+dp】

    不知道该叫贪心还是dp 倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值.先手显然是取最大的,当后手取到比先手大的时候就交换 #include<iostream> ...

  5. robotframework - Run标签

    1.下面是Run标签的截图 2.Run 标签上的按钮和输入框的作用: 1) Execution Profile:选择运行方式,里面有 pybot.jybot 和 custom script.其中我们默 ...

  6. 慕课网JavaScript函数1-20 作业:函数的基础封装

    1-20 作业 小伙伴们,掌握了JavaScript的语法.流程控制语句以及函数,接下来让我们运用所学知识完成如gif图所示的效果——计算自己出生那天是该年当中的第几天. gif效果图如下: 任务描述 ...

  7. java自学-方法

    上节介绍了流程控制语句,一个复杂的业务逻辑会由很多java代码组成,包含许多功能.比如说购物业务,就包含选商品.下单.支付等功能,如果这些功能的代码写到一起,就会显得很臃肿,可读性非常不好.java提 ...

  8. magento “Model collection resource name is not defined” 错误

    问题出现于使用Grid时,解决方案.在使用的Model处添加 public function _construct() { parent::_construct(); $this->_init( ...

  9. nodejs安装node-rsa遇到的问题及解决

    nodejs第一次使用,故碰到一些小白问题: 1.使用 npm install node-rsa -S 2.封装rsa import NodeRSA from 'node-rsa'; const rs ...

  10. [ Luogu 4917 ] 天守阁的地板

    \(\\\) \(Description\) 定义二元函数\(F(x,y)\)表示,用 \(x\times y\) 的矩形不可旋转的铺成一个任意边长的正方形,所需要的最少的矩形个数. 现在\(T\)组 ...