今天小编来讲讲selenium
,我们大致会讲这些内容
selenium
简介与安装selenium
简介与安装页面元素的定位 浏览器的控制 鼠标的控制 键盘的控制 设置元素的等待 获取 cookies
调用 JavaScript
selenium
🎜页面元素的定位🎜🎜🎜🎜浏览器的控制🎜🎜🎜🎜鼠标的控制🎜🎜🎜🎜键盘的控制🎜🎜🎜🎜设置元素的等待🎜🎜🎜🎜获取
cookies
🎜🎜🎜🎜调用JavaScript
🎜🎜🎜🎜selenium
进阶🎜🎜
selenium
的简介与安装selenium
的简介与安装
selenium
是最广泛使用的开源Web UI自动化测试套件之一,它所支持的语言包括C++
、Java
、Perl
、PHP
、Python
和Ruby
,在数据抓取方面也是一把利器,能够解决大部分网页的反爬措施,当然它也并非是万能的,一个比较明显的一点就在于是它速度比较慢,如果每天数据采集的量并不是很高,倒是可以使用这个框架。那么说到安装,可以直接使用pip
selenium
是最广泛使用的开源Web UI自动化测试套件之一,它所支持的语言包括C++
、Java
、Perl
、PHP
、Python
和Ruby
,在数据抓取方面也是一把利器,能够解决大部分网页的反爬措施,当然它也并非是万能的,一个比较明显的一点就在于是它速度比较慢,如果每天数据采集的量并不是很高,倒是可以使用这个框架。那么说到安装,可以直接使用pip
在安装
pip install selenium🎜与此同时呢,我们还需要安装一个浏览器驱动,不同的浏览器需要安装不同的驱动,这边小编主要推荐的以下这两个🎜
Firefox
浏览器驱动: geckodriverFirefox
浏览器驱动:geckodriver
Chrome
浏览器驱动:chromedriver
selenium
+chromedriver
比较多,所以这里就以Chrome
浏览器为示例,由于要涉及到chromedriver
的版本需要和浏览器的版本一致,因此我们先来确认一下浏览器的版本是多少?看下图chromedriver
Chrome
浏览器驱动: chromedriver
硒
+chromedriver
比较多,所以这里就以Chrome
浏览器为示例,由于要涉及到chromedriver
的版本需要和浏览器的版本一致,因此浏览我们先来确认一下浏览器的版本是多少?下图
chromedriver
,当然也对应自己电脑的操作系统🎜🎜🎜🎜🎜🎜页面元素的定位
在谈到页面元素的定位时,小编默认读者朋友具备了最最基本的前端知识,例如HTML
,CSS
等
ID标签的定位
HTML
当中,ID属性是唯一标识一个元素的属性,因此在selenium
当中,通过ID来进行元素的定位也作为首选,我们以百度首页为例,搜索框的HTML
代码如下,其ID为“kw”,而“百度一下”这个按钮的ID为“su”,我们用Python
脚本通过ID的标签来进行元素的定位driver.find_element_by_id("kw") driver.find_element_by_id("su")
NAME标签的定位
HTML
当中,Name属性和ID属性的功能基本相同,只是Name属性并不是唯一的,如果遇到没有ID标签的时候,我们可以考虑通过Name标签来进行定位,代码如下driver.find_element_by_name("wd")
Xpath定位
Xpath
方式来定位几乎涵盖了页面上的任意元素,那什么是Xpath
呢?Xpath
是一种在XML
和HTML
文档中查找信息的语言,当然通过Xpath
路径来定位元素的时候也是分绝对路径和相对路径。/
来表示,相对路径是以//
来表示,而涉及到Xpath
路径的编写,小编这里偷个懒,直接选择复制/粘贴的方式,例如针对下面的HTML
代码<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Test</title> </head> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> </html>
Xpath
来进行页面元素的定位,代码如下driver.find_element_by_xpath('//*[@id="kw"]')
className标签定位
class
属性来定位元素,尤其是当我们看到有多个并列的元素如list
表单,class
用的都是共用同一个,如:driver.find_element_by_class_name("classname")
class
属性来定位元素,该方法返回的是一个list
列表,而当我们想要定位列表当中的第n个元素时,则可以这样来安排driver.find_elements_by_class_name("classname")[n]
find_elements_by_class_name()
方法而不是find_element_by_class_name()
方法,这里我们还是通过百度首页的例子,通过className
标签来定位搜索框这个元素driver.find_element_by_class_name('s_ipt')
CssSelector()
方法定位
Selenium
官网当中是更加推荐CssSelector()
方法来进行页面元素的定位的,原因在于相比较于Xpath
定位速度更快,Css
定位分为四类:ID值、Class
属性、TagName
值等等,我们依次来看ID方式来定位
TagName
的值,另外一种则是不加,代码如下driver.find_element_by_css_selector("#id_value") # 不添加前面的`TagName`值 driver.find_element_by_css_selector("tag_name.class_value") # 不添加前面的`TagName`值
TagName
的值非常的冗长,中间可能还有空格,那么这当中的空格就需要用点“.”来替换driver.find_element_by_css_selector("tag_name.class_value1.calss_value2.class_value3") # 不添加前面的`TagName`值
我们仍然以百度首页的搜索框为例,它的HTML
代码如下
CssSelector
的.class()
方式来实现元素的定位的话,Python
代码该这样来实现,和上面Xpath()
的方法一样,可以稍微偷点懒,通过复制/粘贴的方式从开发者工具当中来获取元素的位置代码如下
driver.find_element_by_css_selector('#kw')
linkText()方式来定位
这个方法直接通过链接上面的文字来定位元素,案例如下
通过linkText()
方法来定位“地图”这个元素,代码如下
driver.find_element_by_link_text("地图").click()
浏览器的控制
修改浏览器窗口的大小
set_window_size()
这个方法来修改浏览器窗口的大小,代码如下# 修改浏览器的大小 driver.set_window_size(500, 900)
同时还有maxmize_window()
方法是用来实现浏览器全屏显示,代码如下
# 全屏显示 driver.maximize_window()
浏览器的前进与后退
前进与后退用到的方法分别是forward()
和back()
,代码如下
# 前进与后退 driver.forward() driver.back()
浏览器的刷新
刷新用到的方法是refresh()
,代码如下
# 刷新页面 driver.refresh()
除了上面这些,webdriver
的常见操作还有
关闭浏览器: get()
清除文本: clear()
单击元素: click()
提交表单: submit()
模拟输入内容: send_keys()
我们可以尝试着用上面提到的一些方法来写段程序
from selenium import webdriver from time import sleep driver = webdriver.Chrome(executable_path="chromedriver.exe") driver.get("https://www.baidu.com") sleep(3) driver.maximize_window() sleep(1) driver.find_element_by_xpath('//*[@id="s-top-loginbtn"]').click() sleep(3) driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__userName"]').send_keys('12121212') sleep(1) driver.find_element_by_xpath('//*[@id="TANGRAM__PSP_11__password"]').send_keys('testtest') sleep(2) driver.refresh() sleep(3) driver.quit()
output
鼠标的控制
鼠标的控制都是封装在ActionChains
类当中,常见的有以下几种
引入action_chains类 from selenium.webdriver.common.action_chains import ActionChains # 右击 ActionChains(driver).context_click(element).perform() # 双击 ActionChains(driver).double_click(element).perform() # 拖放 ActionChains(driver).drag_and_drop(Start, End).perform() # 悬停 ActionChains(driver).move_to_element(Above).perform() # 按下 ActionChains(driver).click_and_hold(leftclick).perform() # 执行指定的操作
键盘的控制
webdriver
中的Keys()
类,提供了几乎所有按键的方法,常用的如下
# 删除键 driver.find_element_by_id('xxx').send_keys(Keys.BACK_SPACE) # 空格键 driver.find_element_by_id('xxx').send_keys(Keys.SPACE) # 回车键 driver.find_element_by_id('xxx').send_keys(Keys.ENTER) # Ctrl + A 全选内容 driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'a') # Ctrl + C/V 复制/粘贴内容 driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'c') driver.find_element_by_id('xxx').send_keys(Keys.CONTROL, 'v')
其他的一些键盘操作
向上箭头: Keys.ARROW_UP
向下箭头: Keys.ARROW_DOWN
向左/向右箭头: Keys.ARROW_LEFT
/Keys.ARROW_RIGHT
Shift键: Keys.SHIFT
F1键: Keys.F1
元素的等待
有显示等待和隐式等待两种
显示等待
TimeoutException
),需要用到的是WebDriverWait()
方法,同时配合until
和not until
方法WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
其中的参数:
timeout: 最长超时时间,默认以秒为单位 poll_frequency: 检测的时间间隔,默认是0.5s ignored_exceptions: 指定忽略的异常,默认忽略的有 NoSuchElementException
这个异常
我们来看下面的案例
driver = webdriver.Chrome() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally: driver.quit()
隐式等待
主要使用的是implicitly_wait()
来实现
browser = webdriver.Chrome(path) # 隐式等待3秒 browser.implicitly_wait(3)
获取Cookie
Cookie
是用来识别用户身份的关键,我们通常也是通过selenium
先模拟登录网页获取Cookie
,然后再通过requests
携带Cookie
来发送请求。webdriver
提供了cookies
的几种操作,我们挑选几个常用的来说明
get_cookies()
:以字典的形式返回当前会话中可见的cookie
信息get_cookies(name)
: 返回cookie
字典中指定的的cookie
信息add_cookie(cookie_dict)
: 将cookie
添加到当前会话中
下面看一个简单的示例代码
driver=webdriver.Chrome(executable_path="chromedriver.exe") driver.get(url=url) time.sleep(1) cookie_list=driver.get_cookies() cookies =";".join([item["name"] +"=" + item["value"] + "" for item in cookie_list]) session=requests.session() headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', 'cookie': cookies } response=session.get(url=url,headers=headers) soup=BeautifulSoup(response.text,'lxml')
调用JavaScript
webdriver
当中可以使用execut_script()
方法来实现JavaScript
的执行,下面我们来看一个简单的例子from selenium import webdriver import time bro=webdriver.Chrome(executable_path='./chromedriver') bro.get("https://www.baidu.com") # 执行js代码 bro.execute_script('alert(10)') time.sleep(3) bro.close()
除此之外,我们还可以通过selenium
执行JavaScript
来实现屏幕上下滚动
from selenium import webdriver bro=webdriver.Chrome(executable_path='./chromedriver') bro.get("https://www.baidu.com") # 执行js代码 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
selenium
进阶
selenium
启动的浏览器,会非常容易的被检测出来,通常可以通过window.navigator.webdriver
的值来查看,如果是true
则说明是使用了selenium
模拟浏览器,如果是undefined
则通常会被认为是正常的浏览器。window.navigator.webdriver
最后返回的值driver.execute_script( 'Object.defineProperties(navigator,{webdriver:{get:()=>false}})' )
JavaScript
程序已经通过读取window.navigator.webdriver
知道你使用的是模拟浏览器了。所以我们有两种办法来解决这个缺陷。在Chrome当中添加实验性功能参数
代码如下
from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches',['enable-automation']) driver=Chrome(options=option)
调用chrome当中的开发工具协议的命令
Chrome
浏览器在打开页面,还没有运行网页自带的JavaScript
代码时,先来执行我们给定的代码,通过execute_cdp_cmd()
方法,driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ })
当然为了更好隐藏指纹特征,我们可以将上面两种方法想结合
from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) driver = webdriver.Chrome(options=options, executable_path='./chromedriver') driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ }) driver.get(url)
stealth.min.js
文件来实现隐藏selenium
模拟浏览器的特征,这个文件之前是给puppeteer
用的,使得其隐藏浏览器的指纹特征,而让Python
使用时,需要先导入这份JS
文件import time from selenium.webdriver import Chrome option = webdriver.ChromeOptions() option.add_argument("--headless") # 无头浏览器需要添加user-agent来隐藏特征 option.add_argument('user-agent=.....') driver = Chrome(options=option) driver.implicitly_wait(5) with open('stealth.min.js') as f: js = f.read() driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": js }) driver.get(url)
以上是技巧 | Python爬虫利器Selenium从入门到进阶的详细内容。更多信息请关注PHP中文网其他相关文章!

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Python在现实世界中的应用包括数据分析、Web开发、人工智能和自动化。1)在数据分析中,Python使用Pandas和Matplotlib处理和可视化数据。2)Web开发中,Django和Flask框架简化了Web应用的创建。3)人工智能领域,TensorFlow和PyTorch用于构建和训练模型。4)自动化方面,Python脚本可用于复制文件等任务。

Python在数据科学、Web开发和自动化脚本领域广泛应用。1)在数据科学中,Python通过NumPy、Pandas等库简化数据处理和分析。2)在Web开发中,Django和Flask框架使开发者能快速构建应用。3)在自动化脚本中,Python的简洁性和标准库使其成为理想选择。

Python的灵活性体现在多范式支持和动态类型系统,易用性则源于语法简洁和丰富的标准库。1.灵活性:支持面向对象、函数式和过程式编程,动态类型系统提高开发效率。2.易用性:语法接近自然语言,标准库涵盖广泛功能,简化开发过程。

Python因其简洁与强大而备受青睐,适用于从初学者到高级开发者的各种需求。其多功能性体现在:1)易学易用,语法简单;2)丰富的库和框架,如NumPy、Pandas等;3)跨平台支持,可在多种操作系统上运行;4)适合脚本和自动化任务,提升工作效率。

可以,在每天花费两个小时的时间内学会Python。1.制定合理的学习计划,2.选择合适的学习资源,3.通过实践巩固所学知识,这些步骤能帮助你在短时间内掌握Python。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

SublimeText3汉化版
中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具