Selenium介绍配置
Selenium介绍
selenium是一个web的自动化测试工具,也是爬虫中常用的工具之一,它可以帮助我们处理动态页面、模拟用户行为和执行 JavaScript。
Selenium的特点:
- 动态页面处理:有些网站使用JavaScript动态生成内容,这使得传统的静态爬虫无法有效获取到所需数据。使用Selenium,我们可以驱动真实的浏览器来加载和渲染页面,然后提取需要的数据。
- 用户行为模拟:有时候网站可能对爬虫进行限制,例如要求登录,验证码验证等。通过使用Selenium,我们可以模拟用户操作,例如填写表单,点击按钮,滚动页面等,以通过这些验证步骤并获取数据。
- 多浏览器支持:Selenium 支持多种浏览器,包括Chrome、Firefox、Safari 等。这意味着你可以选择适合你的项目需求和喜好的浏览器,或者使用不同的浏览器进行测试和兼容性验证。
- 元素定位和交互:Selenium提供了丰富的方法来定位和交互页面上的元素,例如通过 ID、Class、XPath 等方式精确定位元素,并进行点击、输入文字等操作。
- 隐式等待和显式等待:Selenium提供了等待机制,可以让我们等待某个条件满足后再执行下一步操作。这对于处理页面加载,异步请求等情况非常有用,可以确保我们在获取到完整的页面内容后再进行元素提取和操作。
需要注意的是,Selenium 作为一个模拟用户行为的工具,在某些情况下可能会被网站识别为爬虫行为。为了避免被封禁或限制,请确保在使用 Selenium 进行爬取时 设置适当的请求频率和延迟。
配置Selenium环境
- 安装模块:
pip install selenium
- 下载谷歌浏览器对应版本的驱动查看谷歌浏览器的版本(建议使用114版本及以下)****谷歌浏览器驱动下载链接: https://registry.npmmirror.com/binary.html?path=chromedriver/
- 将下载的驱动文件放入当前Python解释器路径中(建议)。或者放随意路径下,但是需要配置驱动文件的环境。
Selenium基本使用
Selenium基本使用:
from selenium import webdriver
import time
# 实例化一个谷歌浏览器对象
driver = webdriver.Chrome()# 用实例化的浏览器打开对应的网页
driver.get('https://www.baidu.com/')# 设置窗口最大化
driver.maximize_window()# 对打开的浏览器进行截屏,格式为png,否则会有警告
driver.save_screenshot("baidu.png")
time.sleep(5)# 获取网页的源代码
data = driver.page_source
print(type(data))# 将网页的源代码保存到文件中withopen('baidu.html','w', encoding ='utf-8')asfile:file.write(data)
selenium无头模式
Selenium 的无头模式是指在不显示浏览器界面的情况下运行自动化测试或爬虫任务。传统的 Selenium测试会打开浏览器窗口,并模拟用户在浏览器中的操作。但在某些场景下,我们并不需要实际可视化的浏览器界面,就需要使用 –headless 参数来指定。
无头模式的优势主要体现在以下几个方面:
- 提高性能:由于无头模式没有图形界面,因此它消耗的资源较少,能更高效的执行测试任务。这对于大规模的自动化测试和爬虫任务来说尤为重要。
- 提高稳定性:无头模式不受浏览器窗口大小和位置的限制,避免了因为界面变化导致测试用例失败,同时,它也能够更好的处理JavaScript,AJAX和页面渲染等复杂的网页功能。
- 提升安全性:部分网站可能会有反爬虫机制,检测到浏览器驱动时会进行拦截。无头模式可以隐藏浏览器的存在,减少被检测的风险,提升爬取数据的安全性。
测试案例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 获取操作对象
options = Options()# 操作对象设置为无界面模式
options.add_argument('--headless')# 实例化一个谷歌浏览器对象
driver = webdriver.Chrome(options=options)# 用实例化的浏览器打开对应的网页
driver.get('https://www.baidu.com/')# 获取网页的源代码
data = driver.page_source
# 将网页的源代码保存到文件中withopen('baidu.html','w', encoding='utf-8')asfile:file.write(data)
元素的定位与操作
在Selenium中定位元素一般通过find_element方法来定位单个元素,若存在多个相同元素也可以使用find_elements来获取一组数据。另外在使用Selenium进行元素定位时,必须确保页面加载完成后再定位,否则可能会出现找不到对应元素的情况出现。这里可以使用time.sleep()来实现等待操作。
定位元素方式
1.使用ID定位元素:
element = driver.find_element(By.ID,"element_id")
2.使用XPath定位元素:
element = driver.find_element(By.XPATH,"xpath_expression")
3.使用名称定位元素:
element = driver.find_element(By.NAME,"name")
4.使用类名定位元素:
element = driver.find_element(By.CLASS_NAME,"class_name")
5.使用链接文本定位元素:
element = driver.find_element(By.LINK_TEXT,"link_text")
6.使用部分链接文本定位元素:
element = driver.find_element(By.PARTIAL_LINK_TEXT,"partial_link_text")
7.使用标签名定位元素:
element = driver.find_element(By.TAG_NAME,"tag_name")
8.使用CSS选择器定位元素:
element = driver.find_element(By.CSS_SELECTOR,"css_selector")
元素的常用操作
# element 代表定位到的元素对象
element.click()# 元素进行点击
element.send_keys("hello")# 元素输入文本
element.clear()# 元素清空数据
element submit()# 元素提交表单
百度首页测试案例:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器访问百度首页
driver = webdriver.chrome()
driver.get('https://www.baidu.com/')# 2、定位搜索框的案例,搜索框网页代码如下:# <input id="kw" name="wd" class="s_ipt" value="" maxlength="255"autocomplete="off"># 通过 ID 的方式定位元素
input_element = driver.find_element(By.ID,'kw')# 通过 NAME 定位搜索框元素
input_element = driver.find_element(By.NAME,'wd')# 通过CLASS_NAME定位搜索框
input_element = driver.find_element(By.CLASS_NAME,'s_ipt')# 3、在搜索框中输入搜索内容
input_element.send_keys('美女')# 定位百度首页导航栏的新闻,网页内容如下:# <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a># 通过LINK_TEXT定位新闻的按钮元素(精确搜索)
button_element = driver.find_element(By.LINK_TEXT,'新闻')# 通过PARTIAL_LINK_TEXT定位新闻的按钮元素(模糊搜索)
button_element = driver.find_element(By.PARTIAL_LINK_TEXT,'新')# 通过XPATH定位新闻的按钮元素
button_element = driver.find_element(By.XPATH,'//*[@id="s-top-left"]/a[1]')# 对百度一下的按钮元素进行点击
button_element.click()
定位百度搜索框搜索网页数据
import time
from selenium import webdriver
from selenium.webdriver.common.by import By # 导入元素类型# 1、打开浏览器并方位百度首页
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')# 2、通过ID定位搜索框元素
input_element = driver.find_element(By.ID,'kw')# 3、在搜索框中输入搜索内容
input_element.send_keys('美女')# 4、定位百度一下的按钮元素
button_element = driver.find_element(By.ID,'su')# 5、对百度一下的按钮元素进行点击
button_element.click()# 6、等待搜索结果加载完毕
time.sleep(3)# 7、获取网页源码
data = driver.page_source
# 8、并保存到本地withopen('美女.html','w', encoding='utf-8')asfile:file.write(data)
time.sleep(3)
版权归原作者 ghx_code repository 所有, 如有侵权,请联系我们删除。