先简单介绍一下selenium吧。
你可以通过selenium来控制你的浏览器,可以实现文本填入、点击、双击、鼠标滚动、网站信息爬取、可以代替人工做一些大量且重复的工作。
浅说一下应用场景吧:
比如抢火车票、自动点赞、网站信息爬取、游戏脚本、期待的商品信息更新、催我更新等等~
怎么样,是不是有些迫不及待了。
本博客会尽量写得比较详细,是对新手十分友好的,如果你觉得能帮助到你,麻烦点赞收藏加关注一下吧。废话不多说,开整!
首先第一步——安装驱动:
我们要从官网下载驱动,比如你使用的的谷歌浏览器,那么你就要使用谷歌浏览器的驱动,找到对应版本,下载解压,复制路径,调用,实例化......
很多人都被这一步吓到了从而连第一步都没有迈开(我也经历过)
别担心。我发现一个特别有用的库,一个库就可以省掉以上一堆操作,详见我另外一篇博客:selenium的基本操作——入门篇(环境配置)_晋升阁的博客-CSDN博客
假如你是谷歌浏览器,这里以百度为例:
先用上诉方法使用驱动,将驱动实例化为“driver”
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
就这三行代码就可以使用自动化驱动啦,是不是很简单
接下来开始学习一些基本操作,比如点击、文本输入、键盘键入,文本获取等。但是学习基本操作有个前提,就是你得告诉你的程序你要点击哪里,文本输入到哪里,获取哪里的文本。
定位的方法有很多种,我将教大家一种通用的定位方法——xpath定位,详见我的另一篇博客:
selenium的几种常用定位方式——基础篇(快速上手)_晋升阁的博客-CSDN博客
基本操作一:
为了方便理解,以下统一使用xpath定位
主要的七种对浏览器的操作
方法作用text文本内容size属性值的大小send_keys()文本输入clear()清除文本信息click()点击get_attribute()获取属性值
点击:
可以点击按钮、文本、超链接等,只需定位准确即可。假设我的xpath路径为“//td/tr/a”
只需在定位的后面加上.click() 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').click()
表示我要点击xpath路径为"//td/tr/a"的位置(可以是按钮、文本、超链接等)
文本输入:
将你想输入的文本信息填入你的定位处,假设我想填入‘hello’,我的xpath路径为“//td/tr/a”
只需在定位的后面加上.send_keys(""),括号内填入“hello” 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').send_keys("hello")
清除文本信息:
假设输入框中有文本信息“hello”,我的xpath路径为“//td/tr/a”,可以通过.clear()方法来清除
只需在定位的后面加上.clear() 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').clear()
获取文本信息:
假设网站中有一段文字,我们可以定位到这段文字使用.text 方法来获取这段文本信息,我的xpath路径为“//td/tr/a”
只需在定位的后面加上.text 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').text
不过此时我们仍获取不到任何东西,我们需要定义变量来实例化这段代码并且打印出来才能直观地看到我们获取的文本。很简单,如下所示:
response = driver.find_element_by_xpath('//td/tr/a').text
print = (response)
学到这一步,恭喜你,你已经能爬取绝大部分的网站信息了!!
获取属性值:
get_attribute(‘textContent’)#获取元素标签的内容(文本信息)
get_attribute('innerHTML')#获取元素内的全部HTML
get_attribute('outerHTML')#获取包含选中元素的HTML
小结:
driver.find_element_by_xpath('//td/tr/a').click()#点击
driver.find_element_by_xpath('//td/tr/a').text#获取文本信息
driver.find_element_by_xpath('//td/tr/a').send_keys("hello")#将文本信息输入输入框
driver.find_element_by_xpath('//td/tr/a').clear()#清除输入框中的文本信息
get_attribute(‘textContent’)#获取元素标签的内容(文本信息)
get_attribute('innerHTML')#获取元素内的全部HTML
get_attribute('outerHTML')#获取包含选中元素的HTML
基本操作二:
有界面启动和无界面启动
这行我只讲无界面启动,因为通常都是有界面启动(包括我后面教都是有界面启动),无界面启动很少用的上,但是知道的人不多。
方式一:
start_option = webdriver.ChromeOptions()
start_option.add_argument('--headless')
start_option.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=start_option)
方式二:
start_option = webdriver.ChromeOptions()
start_option.headless = True
browser = webdriver.Chrome(options=start_option)
无界面启动的优点是省去了一些杂乱的启动画面,相当于在后台运行操作你的浏览器。缺点是不利于编译和维护等,只适用于独立下载的浏览器驱动
基本操作三:
等待方式
前言:当我们打开一个网页时,有些元素并不是一次性加载全的,如果这个时候让程序去找你给的xpath位置就会报错,那么我们可以让程序等待一会,等待元素全部加载完成我们再去对其进行操作
强制等待:
强制等待需要的是一个python的内置库,不需要下载,直接调用即可。
我们可以直接调用time内置库下的sleep方法,如下所示:
import time #将python的内置库“time”导入进来
time.sleep(1) #使程序沉睡1秒
但是这样强制性等待过于死板,显然不符合我们高效的需求,于是selenium里面提供了两种等待方式来解决所需元素还未加载出来的问题
隐式等待:
隐式等待将告诉Web驱动程序在它报错之前等待一定的时间。默认设置为0。一旦我们设置了时间,Web驱动程序将在抛出异常之前等待该时间。设置隐式等待可以用selenium的implicitly_wait()方法
假设需要等待的时长为10秒,如下所示:
driver.implicitly_wait(10)
隐式等待是全局生效的,隐式等待值的设置对 WebDriver 的整个生命周期有效,所以只要设置一次即可,不需要像time.sleep() 在每个地方都进行设置。
显式等待:
显示等待会查找是否有name名为“kw”的元素,判断是否有name名为“kw”的元素。若是有,则执行下一步;若是没有,则等待0.5秒继续查找,直到超过了设置的最大时长然后报错。如下所示:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.baidu.com/?tn=49055317_28_hao_pg'
driver.get(url)
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME, 'kw')))
print('yes')
finally:
print('no')
driver.quit()
显示等待类似于if语句,我个人不太喜好使用显示等待,感觉不如if语句来得实在。
小结:
import time #将python的内置库“time”导入进来
time.sleep(1) #使程序沉睡1秒
driver.implicitly_wait(10)#隐式等待,有完整生命周期,故只需设置一次
#显示等待,可用if代替
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.baidu.com/?tn=49055317_28_hao_pg'
driver.get(url)
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME, 'kw')))
print('yes')
finally:
print('no')
driver.quit()
好啦,以上就是本期博客全部内容。这些已经可以完成selenium的大部分操作了,有兴趣的小伙伴还可以尝试去爬取网站信息哦,之后我还会写多窗口切换、内嵌iframe网站控制、网络爬虫等等。
喜欢我的内容的麻烦点赞关注加收藏哦谢谢
版权归原作者 晋升阁 所有, 如有侵权,请联系我们删除。