爬虫之Selenium库
官方文档: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库相关推荐
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- Python爬虫配置Selenium库+设置无图无头属性
出一个最新windows下配置selenium全环境的教程~ 本文会手把手教你配置环境,并带你写第一个selenium爬虫程序 环境配置 1.安装Selenium库 Python和Anaconda-P ...
- Python3爬虫之Selenium库详解
1.Selenium库的介绍: Selenium库是用来自动化测试的工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染的问题.给浏览器发送指令,使得浏览器做出跳转,点击,下拉等动作,模拟 ...
- python网络爬虫——使用selenium抓取东方财富网上市公司公告
每日公告数量@TOC 一.数据获取与预处理 本文从东方财富网上市公司公告页面获取沪深A股1991-2019年公告数据,按照数据获取的先后顺序,将数据分为以下两个部分一是上市公司公告信息,包括:序号(i ...
- python 模拟浏览器selenium_python爬虫:使用Selenium模拟浏览器行为
前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...
- PYTHON 爬虫笔记七:Selenium库基础用法
知识点一:Selenium库详解及其基本使用 什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium ...
- Selenium库实现推特爬虫
Selenium库实现推特爬虫 最近写了一个推特爬虫程序,目前测试还可以使用. 源码已经放在Github上了 Twitter Crawler,有帮助的话可以点个⭐ 可以获得以下信息 用户名 昵称 发布 ...
- python selenium 进入新标签页_Python 爬虫 | 用selenium实现批改网的自动翻译
今天我们用selenium+chrome来自动写入批改网的作业,老师为了让我们认真的写作业会把复制粘贴的功能给锁了,但这怎么可能难得倒我们学程序的呢,看我写程序自动帮忙写入 目录: 1.准备环境 2. ...
- python 模拟浏览器下载文件-python爬虫:使用Selenium模拟浏览器行为
前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...
最新文章
- Symantec Backup Exec System Recovery还原向导
- react结合ts与mobx环境搭建步骤详解
- 生产订单总目标成本为0
- MFC中STL容器中Vector,List,Map基本用法汇总
- springboot jwt token前后端分离_「转」七个开源的 Spring Boot 前后端分离项目,建议收藏加转载...
- 文件过滤_jmeter(七)-BeanShell对数据过滤保存文件
- 微信小程序入门四: 导航栏样式、tabBar导航栏
- Springboot 使用Mybatis对postgreSQL实现CRUD
- Tensorflow——拟合直线
- 服务器网口显示图像,简单的python3web服务器,可以在浏览器中显示图像
- 工具安装----Clang-format的基本使用
- 图像处理之边缘检测[微分算子、Canny算子和LOG算子]
- Java 提取PDF文档中的图片
- 小程序里说的冷启动和热启动是什么
- 车载网络测试 - 车载以太网 - 网络配置方法
- oracle 抽样_oracle优化手段--统计信息导出和抽样提取数据
- 物联网核心技术M2M的构成、基本特征和应用类别
- 当审稿人给你的意见,你无法修改的时候怎么办哇,真的好绝望?
- 收藏!5款超级好用的小工具推荐,各个都是同类软件中的翘楚
- 《F4+2》β冲刺第二天