Python3爬虫之Selenium库详解
1.Selenium库的介绍:
Selenium库是用来自动化测试的工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染的问题。给浏览器发送指令,使得浏览器做出跳转,点击,下拉等动作,模拟用户(人)自然的访问网页。当我们写爬虫获取网页的时候,如果使用urllib库,Requests库无法获取信息的时候,就使用JavaScript库来解决。
2.安装Selenium库:
使用下面的命令的前提是已经安装了anaconda,并且配置好了环境变量,还需要下载浏览器驱动程序。
使用cmd命令:pip install selenium
3.Selenium库的使用详解:
基本使用
# webdriver是浏览器驱动模块
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# 构造一个浏览器对象,webdriver.浏览器名()
browser = webdriver.Chrome()try:# 使用浏览器对象访问指定urlbrowser.get('https://www.baidu.com')# 通过id=‘kw’找到元素并赋值为一个变量代表这个元素input = browser.find_element_by_id('kw')# 模拟向变量(即元素,关键字输入框)输入字符串'python'input.send_keys('Python')# 模拟向输入框中输入回车input.send_keys(Keys.ENTER)# 设置一个等待对象,设置等待时长wait = WebDriverWait(browser,10)# 等待一个元素被加载出来,这个元素使用located通过id=content_left确定,# 此处可能产生异常,所以用trywait.until(EC.presence_of_element_located((By.ID,'content_left')))# 获取当前访问后的urlprint(browser.current_url)# 获取cookiesprint(browser.get_cookies)# 获取源码print(browser.page_source)
finally:browser.close()
- 声明浏览器对象:
# 导入包
from selenium import webdriver# 构造各种不同的浏览器对象
browser = webdriver.Chrome()
# 火狐浏览器
browser = webdriver.Firfox()
# 微软的Edge浏览器
browser = webdriver.Edge()
# 苹果的Safar()浏览器
browser = webdriver.Safari()
5.访问页面:
from selenium import webdriver
# 访问页面
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()
6.查找元素:
查找单个元素,获取一个输入框或者一个按钮
from selenium import webdriver
# 获取浏览器对象
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
# 通过标准选择器查找
input_first = browser.find_element_by_id('q')
# 通过CSS选择器查找 id=q
input_second = browser.find_element_by_css_selector('#q')
# 通过xpath选择器
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first, input_second, input_third)
browser.close()
<selenium.webdriver.remote.webelement.WebElement (session="0992d450eaa2f99b1944de8fded05f74", element="fdcaf7bb-b1be-4400-b0dd-2ed4ef59db31")> <selenium.webdriver.remote.webelement.WebElement (session="0992d450eaa2f99b1944de8fded05f74", element="fdcaf7bb-b1be-4400-b0dd-2ed4ef59db31")> <selenium.webdriver.remote.webelement.WebElement (session="0992d450eaa2f99b1944de8fded05f74", element="fdcaf7bb-b1be-4400-b0dd-2ed4ef59db31")>
其他的查找方式
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
# 使用通用的方法find_element(查找类型,类型的值)来查找
from selenium import webdriver
from selenium.webdriver.common.by import By# 获取浏览器对象
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first=browser.find_element(By.ID,'q')
print(input_first)
browser.close()
<selenium.webdriver.remote.webelement.WebElement (session="b00073e131b9beabc5ec71defa99f901", element="aa9053a5-216c-4689-9591-b44ea3b433e5")>
7.查找多个元素:
from selenium import webdriverbrowser=webdriver.Chrome()
browser.get('https://www.taobao.com')
# 使用find_elements_by_css_selector查找符合css选择器 条件的所有'.service-bd li'
lis = browser.find_elements_by_css_selector('.service-bd li')
print(input_first)
browser.close()
<selenium.webdriver.remote.webelement.WebElement (session="b00073e131b9beabc5ec71defa99f901", element="aa9053a5-216c-4689-9591-b44ea3b433e5")>
from selenium import webdriver
from selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()
browser.get('https://taobao.com')
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
print(lis)
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
8.元素交互操作:对获取的元素调用交互方法
from selenium import webdriver
import time# 获取浏览器对象
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()
更多操作:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
9.交互动作
将动作附加到动作链中串行执行
from selenium import webdriver
from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
# 切换到frame=iframeResult框架内
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()
更多操作:http://selenium-python.readthedocs.io/api.html#moudule-selenium.webdriver.common.action_chains
10.执行JavaSript
在做一些元素交互动作的时候,可能没有提供API,那么将动作用js实现,然后使用excute_sript方法执行js代码,完成交互动作。
from selenium import webdriverbrowser = webdriver.Chrome()
# 访问url
browser.get('https://www.zhihu.com/explore')
# 执行js脚本,滚动条下拉
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# 执行js脚本,弹出弹框,弹框文本为"To Botton"
browser.execute_script('alert("To Botton")')
- 获取元素信息
获取属性,在使用了find_element_by_id方法后获取到元素后还需要获取到元素中的属性
在使用get_attrbute(‘属性值’)获取属性
from selenium import webdriver
from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
# 获取到id='zh-top-link-togo'的元素
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
获取文本
from selenium import webdriverbrowser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
# 获取指定元素
input = browser.find_element_by_class_name('zh-top-add-question')
print(input.text)
获取ID、位置、标签名、大小
from selenium import webdriverbrowser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
# 获取指定元素
input = browser.find_element_by_class_name('Entry-body')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
b9f26ba9-1484-4e7c-9574-ae9cee0d1314
{'x': 0, 'y': 0}
body
{'height': 3533, 'width': 1019}
12.Frame
Frame 相当于一个独立的网页,可以嵌套,找找到Frame中的元素先要切换到对应的Frame中
才能找到对应的元素
import time
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)
# 切换到指定的Frame
browser.switch_to.frame('google_esf')
# 通过CSS选择器选中元素
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:# 找到指定的元素logo = broser.find_element_by_class_name('logo')
except NoSuchElementException:print('NO LOGO')
# 找不到子Frame的元素,切换到父级Frame
browser.switch_to.parent_frame()
# 找到指定的logo标签
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)
13.等待
网页中有很多ajax请求,当访问网页的时候,有一些元素的ajax请求没有立即的获取到响应数据,
我们可以设置一个等待时间,在等待一段时间后再获取数据。
隐式等待
当使用了隐式等待执行测试的时候,如果WebDriver没有在DOM中找到元素,将继续等待,超出设定的时间后则抛出异常。也就是说,当查找元素并没有立即出现的时候,隐式等待将等待设置好的时间后再在DOM中查找指定的元素,没有找到抛出元素未找到异常,默认的等待时间是0.网速没问题的时候可以不使用。
from selenium import webdriver# 构造浏览器对象
browser = webdriver.Chrome()
# 设置隐式等待
browser.implicitly_wait(10)
# 访问url
browser.get('https://www.zhihu.com/explore')
# 获取指定元素
input = browser.find_element_by_class_name('Entry-body')
print(input)
<selenium.webdriver.remote.webelement.WebElement (session="577e934ba43a91471834dd29543a3642", element="b163a73f-73b5-4c50-b4d6-24fec753e37f")>
显示等待
设置一个最长等待时间和等待条件,如果首次没有获取到元素数据,那么再规定的时间内判断等待条件,如果条件满足就返回,超过时间就抛出异常
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)
# 显式的设置等待条件,知道元素id=q的元素被加载
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
# 设置等待条件
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
# 打印出等待的元素内容
print(input,button)
<selenium.webdriver.remote.webelement.WebElement (session="b826b7dccd84fc7dc95681244799a338", element="906179f9-d0a3-44cf-a736-eb4bbe3bdd52")> <selenium.webdriver.remote.webelement.WebElement (session="b826b7dccd84fc7dc95681244799a338", element="c4a19160-6ca9-4509-be38-08b1e17ac26e")>
其他的元素条件判断
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 指定的元素加载出(传入定位元组,如(By.ID,‘p’))
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_present_in_element 某个元素中包含某文字
text_to_be_present_in_element 某个元素值包含某文件
frame_to_be_aviliable_and_switch_to_it frame加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可以点击
staleness_of 判断一个元素是否仍然在DOM,可以判断页面是否已经刷新
element_to_be_selecte 元素可选择,传入元素对象
element_located_to_be_selected 元素可以选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
element_located_selection_state_to_be 判断指定元组的元素的状态,相等返回True,否则返回FALSE
alert_is_present 是否出现Alert
详细内容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.surpport.expected_conditions
14.前进和后退
import time
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org')
# 后退,返回上一个返回的地址
browser.back()
# 睡眠1s
# 前进,向下一个网址访问
browser.forward()
# 关闭浏览器
browser.close()
- Cookies
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
# 获取cookie
print(browser.get_cookies())
# 加入cookie
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
# 获取cookies
print(browser.get_cookies())
# 删除cookies
browser.delete_all_cookies()
# 获取cookies
print(browser.get_cookies())
[{'domain': 'zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1573480387'}, {'domain': 'zhihu.com', 'expiry': 1605016386, 'httpOnly': False, 'name': 'Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1573480387'}, {'domain': 'www.zhihu.com', 'expiry': 1573481285.453171, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '80f350dcd7c650b07bd7b485fcab5bf7'}, {'domain': 'zhihu.com', 'expiry': 1668088385.453318, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"ACAuYP7CVhCPTklkCj94f8w0j5_BAciF3Q0=|1573480385"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': '8a2f9223-fa7f-4c3d-9d1a-3d05e6c11543'}, {'domain': 'zhihu.com', 'expiry': 1636552385.453258, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'e2f199bf-c180-409b-a9f4-572632edf328'}]
[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': 'name', 'path': '/', 'secure': True, 'value': 'germey'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1573480387'}, {'domain': 'zhihu.com', 'expiry': 1605016386, 'httpOnly': False, 'name': 'Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1573480387'}, {'domain': 'www.zhihu.com', 'expiry': 1573481285.453171, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '80f350dcd7c650b07bd7b485fcab5bf7'}, {'domain': 'zhihu.com', 'expiry': 1668088385.453318, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"ACAuYP7CVhCPTklkCj94f8w0j5_BAciF3Q0=|1573480385"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': '8a2f9223-fa7f-4c3d-9d1a-3d05e6c11543'}, {'domain': 'zhihu.com', 'expiry': 1636552385.453258, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'e2f199bf-c180-409b-a9f4-572632edf328'}]
[]
16.选项卡管理
使用js代码打开选项卡
import time
from selenium import webdriver# 构造一个浏览器对象
browser = webdriver.Chrome()
# 访问url
browser.get('https://www.baidu.com')
# 执行js,打开一个空选项卡
browser.execute_script('window.open()')
# 打印所有的选项卡对象
print(browser.window_handles)
# 切换到第二个选项卡
browser.switch_to_window(browser.window_handles[1])
# 访问url
browser.get('https://www.taobao.com')
# 休眠
time.sleep(1)
# 切换到第一个选项卡
browser.switch_to_window(browser.window_handles[0])
# 第一个选项卡访问url
browser.get('https://python.org')
['CDwindow-BC4327024BBE2556928278A648D41F54', 'CDwindow-4426854BE347916F87A0D359F5171F46']C:\Users\bsm\Anaconda3\lib\site-packages\ipykernel\__main__.py:13: DeprecationWarning: use driver.switch_to.window instead
C:\Users\bsm\Anaconda3\lib\site-packages\ipykernel\__main__.py:19: DeprecationWarning: use driver.switch_to.window instead
17.异常处理
from selenium import webdriver
# 构造浏览器对象
browser = webdriver.Chrome()
# 访问url
browser.get('https://www.baidu.com')
# 查找一个不存在的元素,抛出元素未找到异常
browser.find_element_by_id('hello')
# 给异常添加对应的异常处理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException#构造浏览器对象
browser = webdriver.Chrome()
# 对可能出现的异常使用try...except处理
try:broser.get('https://www.baidu.com')
except TimeoutException:print('Time Out')
try:browser.find_element_by_id('hello')
except NoSuchElementException:print('No Element')
finally:browser.close()
更多异常信息:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
-------------------------------------------------------------------------------------ps:内容为爬虫学习笔记,来源于崔庆才的《python3 网络爬虫实战》
Python3爬虫之Selenium库详解相关推荐
- python爬虫之urllib库详解
python爬虫之urllib库详解 前言 一.urllib库是什么? 二.urllib库的使用 urllib.request模块 urllib.parse模块 利用try-except,进行超时处理 ...
- python爬虫智能解析库详解
文章很长 请耐心阅读 什么是爬虫 爬虫是做什么的?是帮助我们来快速获取有效信息的.然而做过爬虫的人都知道,解析是个麻烦事.比如一篇新闻吧,链接是这个: https://news.ifeng.com/c ...
- Python爬虫之selenium库使用详解
Python爬虫之selenium库使用详解 本章内容如下: 什么是Selenium selenium基本使用 声明浏览器对象 访问页面 查找元素 多个元素查找 元素交互操作 交互动作 执行JavaS ...
- 爬虫笔记:Requests库详解
什么是Requests 之前讲解了爬虫笔记:Urllib库详解发现确实有不方便的地方,比如加一个代理,cookie,发送post请求比较繁琐. Request库能用几句话实现这些. Requests ...
- 爬虫入门之urllib库详解(二)
爬虫入门之urllib库详解(二) 1 urllib模块 urllib模块是一个运用于URL的包 urllib.request用于访问和读取URLS urllib.error包括了所有urllib.r ...
- python3中urllib库_Python--urllib3库详解
Python--urllib3库详解 Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库,许多Python的原生系统已经开始使用urllib3.Urllib3提供了很多pyth ...
- python gpu加速库比matlab快吗_Python之Unittest和Requests库详解
1.按类来执行 import unittest class f1(unittest.TestCase): def setUp(self): pass def tearDown(self): pass ...
- 爬虫解析利器PyQuery详解及使用实践
作者:叶庭云 整理:Lemon 爬虫解析利器 PyQuery详解及使用实践 之前跟大家分享了 selenium.Scrapy.Pyppeteer 等工具的使用. 今天来分享另一个好用的爬虫解析工具 P ...
- python 3.x 爬虫基础---http headers详解
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---Requer ...
最新文章
- Wireshark 过滤 基本语法
- BC30138: 无法在路径“C:\WINDOWS\TEMP\”中创建临时文件: 拒绝访问。
- 046_byte的值在计算机中的表示
- 我的编码习惯 —— API 接口定义
- 13.配置 influxDB 鉴权及 HTTP API 写数据的方法
- 专科 java转go 翱翔之路(四)协议通信 锁,互斥锁 读写锁 条件变量锁 连接mysql 查询
- win2000server IIS和tomcat5多站点配置
- 动态so库的链接:运行时链接和编译时链接
- mysql 导出 没有函数_没有MYSQL FILE函数的CSV导出
- Python--day48--ORM框架SQLAlchemy操作表
- shell编程之awk
- 中国联通最快明年实现2G全面退网;苹果发布iOS 14.3后火速撤回:原因未知;Angular 11.0.0 正式发布|极客头条
- 跨平台 webapp 开发技术之 Hybrid App
- mysql表结构指哪些_gp数据库查看表结构
- c语言编译bss和data,认识bss段和data段
- 如何对销售额进行预测?
- OpenGL ES EGL 名词解释
- 【12c】新特性:Oracle 12c In-Database Archiving 数据库内归档
- 基于 Vue 和 SpringBoot 实现的博客系统(附源码)
- elang 字符处理