Selenium在爬虫中的应用

Selenium 是一个用于 Web 应用程序测试的工具,它可以模拟用户与浏览器的交互,支持多种语言和浏览器。

引言

Selenium 是一个用于 Web 应用程序测试的工具,也可以用来爬取动态加载的数据和模拟用户操作。Selenium 的特点是开源免费、跨平台跨浏览器、灵活多样和易于扩展。Selenium 在爬虫中的应用场景有:

  • 爬取需要登录的网站,如社交网站、电商网站等。
  • 爬取需要执行 JavaScript 代码的网站,如动态渲染的网站、单页面应用等。
  • 爬取需要模拟用户操作的网站,如点击按钮、填写表单、滑动验证码等。
  • 爬取需要处理弹窗、框架、多窗口等复杂页面的网站。

一、环境安装 

通过pip命令在PyCharm终端安装Selenium库

pip install selenium

需要注意的是同时还要下载浏览器驱动程序,不同的浏览器有不同的驱动程序,不同浏览器版本也有相应的驱动程序,需要甄别,如果浏览器版本与驱动程序版本不匹配则在运行代码时会报错。

我目前用的是chrome浏览器和对应的驱动程序,不想自己找的小伙伴可以参考我的,我会把分享链接放在文章尾部,需要的自取。

二、页面导航与操作

安装工作准备好了以后就可以开始使用Selenium了,还是老规矩,想在PyCharm中使用第三方库首先需要导包,然后创建一个chrome浏览器对象。

from selenium import webdriver
driver = webdriver.Chrome() # 创建一个 Chrome 浏览器对象

 然后,可以用driver.get(url)方法去访问一个页面,如:

driver.get("https://www.baidu.com") # 访问百度首页

也可以使用driver.maxsize_window()方法最大化浏览器窗口,或者用driver.set_window_size(width,height)方法设置浏览器窗口大小,如:

driver.maximize_window() # 最大化浏览器窗口
driver.set_window_size(800, 600) # 设置浏览器窗口的宽度为 800 像素,高度为 600 像素

还可以使用driver.find_element_by...方法实现元素定位,如:

input_box = driver.find_element_by_id("kw") # 定位百度首页的输入框,id 为 "kw"
search_button = driver.find_element_by_id("su") # 定位百度首页的搜索按钮,id 为 "su"

除此之外还有别的定位方法,如driver.find_element_by_name、driver.find_element_by_class_name、driver.find_element_by_css_selector、driver.find_element_by_xpath等

找到元素之后,还可以用element.click()方法点击元素,用element.send_keys()输入文本,如:

input_box.send_keys("Selenium") # 在输入框中输入 "Selenium"
search_button.click() # 点击搜索按钮

以上就是在爬虫中常用的Selenium操作。

三、元素定位与提取

学会了Selenium基本操作后,就该开始定位元素和提取了。

Selenium 定位页面元素的原理是通过元素的特征来找到它在页面中的位置,这些特征可以是元素的 id、name、class、css、xpath 等属性。Selenium 提供了一系列的 driver.find_element_by...方法来根据不同的属性来定位元素,如:

element = driver.find_element_by_id("id") # 根据 id 属性定位元素
element = driver.find_element_by_name("name") # 根据 name 属性定位元素
element = driver.find_element_by_class_name("class") # 根据 class 属性定位元素
element = driver.find_element_by_css_selector("css") # 根据 css 选择器定位元素
element = driver.find_element_by_xpath("xpath") # 根据 xpath 表达式定位元素

 其中,css选择器和xpath表达式是两种比较灵活和强大的定位方法,他们可以根据元素的标签、属性、层级、关系来定位元素,如:

element = driver.find_element_by_css_selector("div#content > p:nth-child(2)") # 根据 css 选择器定位 id 为 content 的 div 标签下的第二个 p 标签
element = driver.find_element_by_xpath("//div[@id='content']/p[2]") # 根据 xpath 表达式定位 id 为 content 的 div 标签下的第二个 p 标签

 定位到元素后,可以使用 element.get_attribute("attribute")方法来获取元素的属性值,如:

href = element.get_attribute("href") # 获取元素的 href 属性值
src = element.get_attribute("src") # 获取元素的 src 属性值

也可以使用 element.text 属性来获取元素的文本内容,如:

text = element.text # 获取元素的文本内容

如果元素的文本内容是动态加载的,可以使用 element.get_attribute("textContent") 方法来获取,如:

text = element.get_attribute("textContent") # 获取元素的文本内容,包括动态加载的

四、页面等待与超时处理

页面等待和超时处理是 Selenium 中的一个重要概念,它可以解决页面加载速度和元素出现时间的不确定性,避免因为元素未找到而导致的测试失败。Selenium 提供了三种等待方式:

  • 强制等待:使用 time.sleep(seconds) 方法,让程序暂停指定的秒数,不管页面是否加载完成,也不管元素是否出现,这种方式简单粗暴,但是效率低下,不推荐使用,如:
    import time
    time.sleep(10) # 让程序暂停 10 秒
    
  • 隐式等待:使用 driver.implicitly_wait(seconds) 方法,设置一个全局的等待时间,让程序在每次查找元素时,如果元素不存在,就等待指定的秒数,直到元素出现或者超时,这种方式简单方便,但是不够灵活,如:

    driver.implicitly_wait(10) # 设置隐式等待时间为 10 秒
    
  • 显式等待:使用 WebDriverWait 类和 expected_conditions 模块,设置一个局部的等待时间和一个等待条件,让程序在每次查找元素时,如果元素满足等待条件,就立即返回,否则就等待指定的秒数,直到元素满足条件或者超时,这种方式灵活高效,推荐使用,如:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "id"))) # 设置显式等待时间为 10 秒,等待条件为元素 id 为 "id" 的元素出现

五、网页截图与页面交互

Selenium 对网页进行截图的方法是使用 driver.save_screenshot(filename) 方法,将当前页面的截图保存为指定的文件名,如:

driver.save_screenshot("screenshot.png") # 将当前页面的截图保存为 screenshot.png 文件

Selenium 与页面进行交互的方法是使用 driver.execute_script(script, *args) 方法,执行 JavaScript 代码,可以实现一些 Selenium 本身无法实现的功能,如:

driver.execute_script("window.alert('Hello, Selenium!')") # 执行 JavaScript 代码,弹出一个对话框
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") # 执行 JavaScript 代码,滚动到页面底部
driver.execute_script("return document.title") # 执行 JavaScript 代码,返回页面的标题

Selenium 切换窗口的方法是使用 driver.switch_to.window(handle) 方法,切换到指定的窗口句柄,可以实现在多个窗口或标签页之间切换,如:

current_handle = driver.current_window_handle # 获取当前窗口句柄
all_handles = driver.window_handles # 获取所有窗口句柄
for handle in all_handles:
    if handle != current_handle:
        driver.switch_to.window(handle) # 切换到另一个窗口

六、Cookie 和会话管理

Cookie 是一种存储在浏览器中的小型数据,可以用来记录用户的偏好、身份、状态等信息。会话是指用户与 Web 应用程序的一次交互过程,通常通过 Cookie 来维持。Selenium 管理 Cookie 和会话的方法是使用 driver.get_cookies()driver.add_cookie()driver.delete_cookie()driver.delete_all_cookies() 等方法,如:

cookies = driver.get_cookies() # 获取所有的 Cookie
driver.add_cookie({"name": "username", "value": "admin"}) # 添加一个 Cookie
driver.delete_cookie("username") # 删除一个 Cookie
driver.delete_all_cookies() # 删除所有的 Cookie

Selenium 实现自动化登录和保持登录状态的方法是使用 driver.get(url)driver.find_element_by_...()element.send_keys()element.click() 等方法,模拟用户的登录操作,并保存登录后的 Cookie,如:

driver.get("https://www.example.com/login") # 访问登录页面
username = driver.find_element_by_id("username") # 定位用户名输入框
password = driver.find_element_by_id("password") # 定位密码输入框
login = driver.find_element_by_id("login") # 定位登录按钮
username.send_keys("admin") # 输入用户名
password.send_keys("123456") # 输入密码
login.click() # 点击登录
cookies = driver.get_cookies() # 获取登录后的 Cookie

然后,可以使用 driver.add_cookie() 方法,将登录后的 Cookie 添加到其他页面,实现保持登录状态,如:

driver.get("https://www.example.com/profile") # 访问个人资料页面
for cookie in cookies:
    driver.add_cookie(cookie) # 添加登录后的 Cookie
driver.refresh() # 刷新页面

七、处理弹窗和对话框

弹窗和对话框是 Web 应用程序中常见的一种交互方式,它们可以用来显示一些信息、提示、警告、错误等,或者要求用户输入一些数据、选择一些选项、确认一些操作等。Selenium 处理弹窗和对话框的方法是使用 driver.switch_to.alert 方法,切换到弹窗对象,然后使用 alert.textalert.accept()alert.dismiss()alert.send_keys() 等方法,如:

alert = driver.switch_to.alert # 切换到弹窗对象
text = alert.text # 获取弹窗的文本内容
alert.accept() # 接受弹窗,相当于点击确定按钮
alert.dismiss() # 关闭弹窗,相当于点击取消按钮
alert.send_keys("Selenium") # 在弹窗中输入 "Selenium"

八、页面切换与框架处理

页面切换和框架是 Web 应用程序中常用的一种布局方式,它们可以在一个页面中嵌套或打开另一个页面。Selenium 处理页面切换和框架的方法是使用 driver.switch_to 属性对象,它提供了以下几个方法:

  • driver.switch_to.frame(reference):切换到指定的框架(frame或iframe)中,可以根据 id、name、index 或 WebElement 对象来定位框架,如:
    driver.switch_to.frame("frame1") # 根据 id 或 name 切换到 frame1
    driver.switch_to.frame(0) # 根据 index 切换到第一个框架
    driver.switch_to.frame(driver.find_element_by_xpath("//iframe")) # 根据 WebElement 对象切换到 iframe
    
  • driver.switch_to.parent_frame():从子框架切换回父框架,如果当前已是主文档,则无效果,如:
    driver.switch_to.parent_frame() # 从子框架切换回父框架
    
  • driver.switch_to.default_content():从任意框架切换回主文档,如:
    driver.switch_to.default_content() # 从任意框架切换回主文档
    
  • driver.switch_to.window(handle):切换到指定的窗口或标签页,可以根据窗口句柄来定位,如:
    current_handle = driver.current_window_handle # 获取当前窗口句柄
    all_handles = driver.window_handles # 获取所有窗口句柄
    for handle in all_handles:
        if handle != current_handle:
            driver.switch_to.window(handle) # 切换到另一个窗口或标签页
    

Selenium爬虫实战将会在后两天更新,请持续关注!

PS:结尾的浏览器与驱动版本相匹配,若无需要不要更新浏览器,否则会报错驱动版本与浏览器版本不匹配!!!

-----------------------------------------------     分      隔      符     -------------------------------------------------------

浏览器:

链接:https://pan.baidu.com/s/1g_PPc5ejoyvSifoWD0EcQA?pwd=2580 
提取码:2580

浏览器驱动:

链接:https://pan.baidu.com/s/1tEFu3-9xXIkoGqHiPYwRJA?pwd=2580 
提取码:2580

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会爬虫的闲鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值