爬虫(三)selenium

运行环境:

selenium==4.7.2

1. Selenium 安装

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接在浏览器中运行,就像真实用户所做的一样。Selenium测试可以在Windows、Linux和Macintosh上的Internet Explorer、Chrome和Firefox中运行。其他测试工具都不能覆盖如此多的平台。使用Selenium和在浏览器中运行测试还有很多其他好处。

selenium安装首先要看Google浏览器的版本,点击谷歌浏览器右上的三个点 → \rightarrow 帮助 → \rightarrow 关于 Google Chrome,即可看到下面的版本号。
在这里插入图片描述
版本号只需要看前两位即可,比如我这里只需要记住版本号是 108.0 就行,然后到这里去下载对应版本号前两位的驱动,比如这里我下载两个 108.0 的驱动都行。
在这里插入图片描述
然后将下载的压缩包解压,得到 chromedriver.exe 就是我们要使用的驱动文件。

2. Selenium 基本功能

2.1 初始化浏览器

# 这里的executable_path是上面下载的浏览器驱动的路径
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

# 浏览器跳转到的网址
driver.get("https://www.baidu.com")

driver.quit()

2.2 其他功能

方法描述
driver.page_source获取当前页面的所有源码
driver.current_url获取当前页面的URL
driver.close()关闭当前标签页,如果只有一个标签页则关闭整个浏览器
driver.quit()关闭整个浏览器
driver.forward()页面前进
driver.back()页面前进
driver.save_screenshot(img_name)页面截图,并保存到 img_name
driver.maximize_window()最大化窗口
driver.minimize_window()最小化窗口
driver.fullscreen_window()全屏窗口,相当于按下F11
driver.minimize_window()最小化窗口
driver.get(url)跳转到URL
driver.switch_to.new_window('tab')如果是参数是 'tab',则打开一个新的标签页;如果是 'window',打开一个新的窗口
driver.current_window_handle获取当前窗口的句柄
driver.window_handles获取当前浏览器的所有窗口的句柄
driver.switch_to.window(param)切换到param对应的窗口

3. 查找元素

selenium既然是模拟浏览器,那么肯定也能对浏览器进行一些点击或者输入内容的操作了,当需要进行点击等操作时,第一个操作其实是找到点击或输入的元素,由此,下面我介绍集中常用的元素查询方式。

3.1 八大定位方法

在selenium4中,像 find_element_by_id 这种方法都被移除了,不建议使用,换为了 find_element 方法以及 find_elements 方法。两个方法其实用途都是差不多的,只不过前面一个方法只返回查询到的第一个元素,后一个方法会返回查询到的所有元素。在使用这两种方法时,首先需要在第一个参数中注明是依据什么进行查询,第二个参数才是需要进行查询的内容,具体描述如下。

查询方式描述
find_element(By.ID, 'kw')返回 id=kw 的元素
find_element(By.NAME, 'kw')返回 name=kw 的元素
find_element(By.CLASS_NAME, 'kw')返回 class=kw 的元素
find_element(By.TAG_NAME, 'div')HTML有许多的标签,如 div,span 等,返回标签为 div 的元素
find_element(By.LINK_TEXT, '新闻')Link表示包含有属性 href = “https://www.xxxxxxx.com” 的元素,可以通过linktext定位,linktext是页面上展示的文字
find_element(By.PARTIAL_LINK_TEXT, '新')可通过部分的linktext进行查询
find_element(By.XPATH, '/html/body/script[5]')通过Xpath语法进行查询
find_element(By.CSS_SELECTOR, '#www-home-right > div.www-home-silde')可通过部分的linktext进行查询

上述查询方式中,Xpath查询需要一点Xpath语法基础,可以看我的上一篇文章进行学习,CSS查询方式的话符号 . 代表 class, 符号 # 代表 id,符号 > 代表下一级子元素。

具体每个方法查询的地方如下图所示
在这里插入图片描述
下面是示例代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯')
# 点击id=su的元素(即搜索)
driver.find_element(By.ID, 'su').click()
# 获取当前窗口的句柄
a=driver.current_window_handle

# 打开一个新的标签页
driver.switch_to.new_window('tab')
driver.get("https://www.baidu.com")
driver.find_element(By.LINK_TEXT, '新闻').click()

# 切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
# 切换到搜索香克斯的窗口
driver.switch_to.window(a)
time.sleep(3)

driver.quit()

3.2 查找相对元素

这是selenium4新增加的方法,相对定位器,这种定位器是从人肉眼的角度来区分位置。该定位器使用的方法如下:

方法描述
above()查找该元素上面的元素
below()查找该元素下面的元素
to_left_of()查找该元素上面的元素
to_right_of()查找该元素上面的元素
near()查找该元素附近的元素

比如以下的百度首页,我查询视频所在元素的右边元素,那么我们查找到的就不止有其右边的三个元素,还有下面相对其偏右的所有元素。

在这里插入图片描述
拿上图做例子,示例代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name
from selenium.webdriver.support.relative_locator import locate_with


s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
# 可以在locate_with中使用上面的八大定位方法
ele2 = driver.find_elements(locate_with(By.TAG_NAME, 'a').to_right_of(link))
print(ele1[1].text)
print(ele2[4].text)

driver.quit()

输出如下

网盘
开年元首外交传递中国声音

3.3 键盘事件

send_keys() 方法能够想指定元素输入字符串,其实,除此之外还可以输入更多的键盘操作。

键盘事件描述
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(Enter)
send_keys(Keys.CONTROL,'a')全选(Ctrl+A)
send_keys(Keys.CONTROL,'c')复制(Ctrl+C)
send_keys(Keys.CONTROL,'x')剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v')粘贴(Ctrl+V)
send_keys(Keys.F1)键盘 F1

由此,上面的搜索我们完全可以不用单独查询搜索的元素并点击,只需要在输入后加个回车键即可,更改后如下:

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)

time.sleep(3)
driver.quit()

4. 元素方法

当使用 find_elements() 方法后,得到的是一个个的 WebElement 对象组成的列表,这些对象肯定是无法直接使用的,这里我来介绍下这些对象所具有的方法以及属性。

方法或属性描述
click()点击当前元素
get_attribute(name)获取对象属性比如 name 可以为 class,name,id等,如果 name='outerHTML' 则返回整个HTML元素
screenshot(file)获取当前元素的截图,保存为png
send_keys(value)给当前元素模拟输入
text获取当前元素的文本内容
tag_name获取当前元素的标签名
size获取当前元素的大小
rect获取一个包含当前元素大小和位置的字典
parent获取当前元素的父节点
location获取当前元素的位置
id获取当前元素的id

示例如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
print('ele[1]为:{}'.format(ele1[1]))
print('ele[1]HTML格式为:{}'.format(ele1[1].get_attribute('outerHTML')))
print('ele[1]的class属性为:{}'.format(ele1[1].get_attribute('class')))
print('ele[1]文本为:{}'.format(ele1[1].text))
print('ele[1]位置为:{}'.format(ele1[1].location))

driver.quit()

输出结果为:

ele[1]为:<selenium.webdriver.remote.webelement.WebElement (session=“136a0261d244743418c7035dfca659d7”, element=“a8ed04b4-57c0-4540-b74b-c6c40b822b1d”)>
ele[1]HTML格式为:<a href=“https://pan.baidu.com?from=1026962h” target=“_blank” class=“mnav c-font-normal c-color-t”>网盘</a>
ele[1]的class属性为:mnav c-font-normal c-color-t
ele[1]文本为:网盘
ele[1]位置为:{‘x’: 341, ‘y’: 19}

5. JS执行

javascript是可以独以运行的脚本,可以不使用selenium的方法,进行页面元素的点击、输入、拖拽等等操作,像如果对js使用很熟练,那么也就完全不需要管上面的定位方式。全部可以使用js来实现页面元素的各种操作。

像滚动条拖拽是没法用元素定位操作的,只能使用js,比如我们使用搜索页面搜索后,将滚动条拖到底。

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)
time.sleep(3)
# 一般距离顶部10000的距离都已经见底了
driver.execute_script('document.documentElement.scrollTop=10000')

time.sleep(5)
driver.quit()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值