Python爬虫——Selenium 浏览器交互与异常处理

540 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

1、控制浏览器

Selenium 可以控制浏览器执行想要的动作,如前进、后退、点击、刷新、输入文本等。

代码实例(当前 selenium 版本:3.9)

import time

from selenium import webdriver
# 浏览器对象
browser = webdriver.Chrome()
# 浏览器访问网站
browser.get('https://www.baidu.com')

# 定位输入框
input_kw = browser.find_element_by_id('kw')

time.sleep(2)

# 输入'王维家'
input_kw.send_keys('王维家')

time.sleep(2)

# 清除掉输入框的文本
input_kw.clear()

time.sleep(2)

# 重新输入
input_kw.send_keys('毛不易')

# 定位 “百度一下”,并点击,提交搜索,执行搜索操作
button = browser.find_element_by_id('su')
button.click()

# 用于提交表单,如搜索框内输入关键字之后的“回车”操作,也可以执行搜索操作
# input_kw.submit()

time.sleep(2)

# 滚动条拉到底部
js_bottom = "document.documentElement.scrollTop=100000"
browser.execute_script(js_bottom)

time.sleep(2)

# 定位“下一页”按钮标签,并点击
nextPage = browser.find_element_by_xpath('//a[@class="n"]')
nextPage.click()

time.sleep(2)

# 回到上一页面,后退操作
browser.back()
time.sleep(2)

# 使浏览器历史记录前进一步,前进操作
browser.forward()

time.sleep(2)

# 刷新浏览器当前页面
browser.refresh()

time.sleep(2)

# 关闭浏览器
browser.quit()

上面代码控制浏览器进行的操作:

  1. 控制浏览器打开百度
  2. 在搜索框输入 “王维家”
  3. 清除掉搜索框的文本
  4. 重新输入“毛不易”
  5. 定位 “百度一下”,并点击,提交搜索,执行搜索操作
  6. 将网页的滚动条拉到底部
  7. 点击“下一页”按钮
  8. 执行浏览器回退操作,回到上一步
  9. 执行浏览器前进操作,和上一步相反
  10. 刷新浏览器当前页面
  11. 关闭浏览器

注意:

  • click() 方法是Selenium WebDriver提供的操作鼠标的方法,其作用是单击已经定位到的节点。

  • .forward() 和 back() 方法表示浏览器前进和后退的功能

  • double_click(),其作用是双击已经定位到的节点。

  • 程序运行中间执行了多次阻塞操作 time.sleep(2)

2、异常处理

在使用Selenium的时候,可能会遇到一些异常,例如超时(TimeoutException)、节点未找到(NoSuchElementException)等。一旦出现此类异常,程序便会停止运行。为了让程序不停止运行我们可以使用 try except 语句来捕获各种异常,对异常进行处理。

模拟节点未找到异常

from selenium import webdriver

# 声明浏览器对象,并访问网站
browser = webdriver.Chrome()
url = "https://www.baidu.com"
browser.get(url)
# 查找节点
element1 = browser.find_element_by_link_text("大地图")

控制台提示的错误信息:

QQ截图20220815171437.png

使用 try except 语句来捕获异常

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = "https://www.baidu.com"

browser.get(url)
try:
    element1 = browser.find_element_by_link_text("大地图")
except NoSuchElementException:
    print("没有找到节点")

执行结果:使用 try except 语句来捕获异常后,程序就不会中断了。

没有找到节点

官方文档中对更对异常类的详细介绍