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

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

一、开始

基本使用

from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support importexpected_conditions as ECfrom selenium.webdriver.support.wait importWebDriverWaitbrowser=webdriver.Chrome()try:browser.get("https://www.baidu.com")input= browser.find_element_by_id("kw")  #查找id为kw的元素input.send_keys("Python")                 #相当于在输入框输入Pythoninput.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 importwebdriverbrowser=webdriver.Chrome()
browser=webdriver.Firefox()
browser=webdriver.Edge()
browser=webdriver.PhantomJS()
browser= webdriver.Safari()

访问页面

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

二、查找元素

单个元素

from selenium importwebdriverbrowser=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

View Code

通用查找方式:

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

多个元素

实际上就是复数的区别。

from selenium importwebdriverfrom selenium.webdriver.common.by importBybrowser=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

View Code

三、元素交互操作

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

importtimefrom selenium importwebdriverbrowser=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 importwebdriverfrom selenium.webdriver importActionChainsbrowser=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 importwebdriverbrowser=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 importwebdriverbrowser=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 importwebdriverbrowser=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 importwebdriverbrowser=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 importwebdriverfrom selenium.common.exceptions importNoSuchElementExceptionbrowser=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 importwebdriverbrowser=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 importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.support.ui importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions as ECbrowser=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

七、前进后退

importtimefrom selenium importwebdriverbrowser=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 importwebdriverbrowser=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())

九、标签页(窗口)切换

importtimefrom selenium importwebdriverbrowser=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 importwebdriverbrowser=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_sessionresponse = self.execute(Command.NEW_SESSION, parameters)File "C:\Python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in executeself.error_handler.check_response(response)File "C:\Python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_responseraise 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 importwebdriverfrom selenium.common.exceptions importTimeoutException, NoSuchElementExceptionbrowser=webdriver.Chrome()try:browser.get("https://www.baidu.com")exceptTimeoutException:print("Timeout")try:browser.find_element_by_id("hello")exceptNoSuchElementException:print("NoSuchElement")finally:browser.close()

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

转载于:https://www.cnblogs.com/believepd/p/10657953.html

爬虫之Selenium库相关推荐

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

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

  2. Python爬虫配置Selenium库+设置无图无头属性

    出一个最新windows下配置selenium全环境的教程~ 本文会手把手教你配置环境,并带你写第一个selenium爬虫程序 环境配置 1.安装Selenium库 Python和Anaconda-P ...

  3. Python3爬虫之Selenium库详解

    1.Selenium库的介绍: Selenium库是用来自动化测试的工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染的问题.给浏览器发送指令,使得浏览器做出跳转,点击,下拉等动作,模拟 ...

  4. python网络爬虫——使用selenium抓取东方财富网上市公司公告

    每日公告数量@TOC 一.数据获取与预处理 本文从东方财富网上市公司公告页面获取沪深A股1991-2019年公告数据,按照数据获取的先后顺序,将数据分为以下两个部分一是上市公司公告信息,包括:序号(i ...

  5. python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

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

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

  7. Selenium库实现推特爬虫

    Selenium库实现推特爬虫 最近写了一个推特爬虫程序,目前测试还可以使用. 源码已经放在Github上了 Twitter Crawler,有帮助的话可以点个⭐ 可以获得以下信息 用户名 昵称 发布 ...

  8. python selenium 进入新标签页_Python 爬虫 | 用selenium实现批改网的自动翻译

    今天我们用selenium+chrome来自动写入批改网的作业,老师为了让我们认真的写作业会把复制粘贴的功能给锁了,但这怎么可能难得倒我们学程序的呢,看我写程序自动帮忙写入 目录: 1.准备环境 2. ...

  9. python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

最新文章

  1. Symantec Backup Exec System Recovery还原向导
  2. react结合ts与mobx环境搭建步骤详解
  3. 生产订单总目标成本为0
  4. MFC中STL容器中Vector,List,Map基本用法汇总
  5. springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...
  6. 文件过滤_jmeter(七)-BeanShell对数据过滤保存文件
  7. 微信小程序入门四: 导航栏样式、tabBar导航栏
  8. Springboot 使用Mybatis对postgreSQL实现CRUD
  9. Tensorflow——拟合直线
  10. 服务器网口显示图像,简单的python3web服务器,可以在浏览器中显示图像
  11. 工具安装----Clang-format的基本使用
  12. 图像处理之边缘检测[微分算子、Canny算子和LOG算子]
  13. Java 提取PDF文档中的图片
  14. 小程序里说的冷启动和热启动是什么
  15. 车载网络测试 - 车载以太网 - 网络配置方法
  16. oracle 抽样_oracle优化手段--统计信息导出和抽样提取数据
  17. 物联网核心技术M2M的构成、基本特征和应用类别
  18. 当审稿人给你的意见,你无法修改的时候怎么办哇,真的好绝望?
  19. 收藏!5款超级好用的小工具推荐,各个都是同类软件中的翘楚
  20. 《F4+2》β冲刺第二天

热门文章

  1. Nagios监控HP硬件状态
  2. ubuntu下查看apache的日志
  3. 模拟grid点击事件
  4. Java:批量插入、修改数据到数据库中的用法
  5. springmvc json结合
  6. 结构型模式:Decorator 装饰模式
  7. C++多继承的二义性
  8. [导入]在asp.net中实现观察者模式,或有更好的方法(续)
  9. 「雅礼集训 2018 Day2」农民
  10. drf版本控制 和django缓存,跨域问题,