PythonSelenium自动化实现网页操控

Written by

in

文章目录
  • Selenium 是一个用于 Web 应用程序测试的工具,支持多种浏览器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心组件,用于控制浏览器行为并执行自动化操作。元素定位是通过各种方式(如 ID、Class Name、XPath 等)在网页上找到特定元素。
  • Selenium 可以用于自动化测试,减少人工测试的工作量。Selenium 可以用于抓取动态加载的数据,这些数据通常无法通过简单的 HTTP 请求获取。Selenium 支持多种浏览器,确保应用在不同浏览器上的一致性。
  • 当网页内容是通过 JavaScript 动态加载时,Selenium 是抓取这些数据的理想工具。当需要模拟复杂的用户交互(如点击、输入、滚动等)时,Selenium 非常有用。在需要频繁进行回归测试或跨浏览器测试时,Selenium 是首选工具。
  • 安装 Selenium 库和浏览器驱动(如 ChromeDriver)。打开浏览器、导航到 URL、定位元素、点击、输入等。处理弹出窗口、等待元素加载、执行 JavaScript 等。处理元素未找到、超时等异常情况。
  • from selenium import webdriver ​ url = ‘https://www.baidu.com’ ​ # 创建浏览器操作对象 browser = webdriver.Chrome() ​ # 打开网页 browser.get(url) # 获取源码(同requests.text) print(browser.page_source) input(‘用户按下回车键退出’) # 退出 browser.quit()
  • 元素定位首先要找到它们,WebDriver 提供很多定位元素的方法: 定位方式 By 标识符 示例 ID By.ID find_element(By.ID, "kw") Name 属性 By.NAME find_element(By.NAME, "wd") Class name By.CLASS_NAME find_element(By.CLASS_NAME, "s_ipt") 标签名 By.TAG_NAME find_elements(By.TAG_NAME, "input") 链接文本 By.LINK_TEXT find_element(By.LINK_TEXT, "新闻") 部分链接文本 By.PARTIAL_LINK_TEXT find_element(By.PARTIAL_LINK_TEXT, "新") CSS 选择器 By.CSS_SELECTOR find_element(By.CSS_SELECTOR, "#su") XPath By.XPATH find_element(By.XPATH, '//input[@id="su"]') 代码演示:selenium 的元素定位 from selenium import webdriver # 定位元素,必须要导入By from selenium.webdriver.common.by import By ​ url = ‘https://www.baidu.com’ ​ # 创建浏览器操作对象 browser = webdriver.Chrome() ​ # 打开网页 browser.get(url) ​ # 通过id获取输入框 res1 = browser.find_element(By.ID,’kw’) print(res1) ​ # 通过name获取输入框 res2 = browser.find_element(By.NAME,’wd’) print(res2) ​ # 通过XPath获取输入框 res3 = browser.find_element(By.XPATH,”//*/input[@id=’kw’]”) print(res3) print(res1==res2 and res2==res3)# True ​ # 通过类名获取输入框 res4 = browser.find_element(By.CLASS_NAME,”s_ipt”) ​ # 通过css选择器来获取输入框 res5 = browser.find_element(By.CSS_SELECTOR,”#kw”) print(res3==res4 and res4==res5)# True ​ # 通过通过链接文本获取标签 res6 = browser.find_element(By.LINK_TEXT,”新闻”) ​ # 通过部分链接文本获取标签 res7 = browser.find_element(By.PARTIAL_LINK_TEXT,”闻”) print(res6==res7)# True ​ # 通过标签名,并且由复数的形式获取a标签 res8 = browser.find_elements(By.TAG_NAME,”a”) print(res8) ​ input(‘用户按下回车键退出~’) # 退出 browser.quit()
  • 获取元素属性 .get_attribute('class'),获取元素文本 .text,获取标签名.tag_name。
  • from selenium import webdriver from selenium.webdriver.common.by import By ​ # 创建浏览器操作对象 browser = webdriver.Chrome() ​ url = “https://www.baidu.com” # 打开网页 browser.get(url) ​ # 获取到新闻文本的a链接(通过链接文本内容) a = browser.find_element(By.LINK_TEXT,”新闻”) ​ # 获取href a_href = a.get_attribute(‘href’) print(f”href:{a_href}”) # 结果:href:http://news.baidu.com/ ​ # 获取class a_class = a.get_attribute(‘class’) print(f”class:{a_class}”) # 结果:class:mnav c-font-normal c-color-t ​ # 获取文本内容 a_text = a.text print(a_text) # 结果:新闻 ​ # 获取标签名称 a_tag_name = a.tag_name print(a_tag_name) # 结果:a
  • 点击、send_keys()、后退操作、前进操作、模拟 JS 滚动、执行 JS 代码、获取网页代码 page_source、退出。 selenium 元素交互 from selenium import webdriver from selenium.webdriver.common.by import By import time ​ # 创建浏览器操作对象 browser = webdriver.Chrome() # 将窗口最大化 # browser.maximize_window() ​ url = ‘https://www.baidu.com’ # 打开浏览器 browser.get(url) ​ # 获取输入框 get_input = browser.find_element(By.ID,”kw”) # 输入周杰伦 get_input.send_keys(‘周杰伦’) ​ # 获取点击按钮 get_button = browser.find_element(By.CSS_SELECTOR,”input[type=’submit’]”) # 执行点击操作 get_button.click() ​ def scoll(): # 这里要进行等待,否则后面的滑动页面没有反应,目的是等待页面加载 time.sleep(2) # 执行滑动 js = ‘document.documentElement.scrollTop=100000’ browser.execute_script(js) def next_page(): scoll() time.sleep(2) # 获取下一页按钮 next_button = browser.find_element(By.PARTIAL_LINK_TEXT,”下一页”) # 执行点击操作 next_button.click() for i in range(3): next_page() # 导航操作 browser.back() # 回退 time.sleep(2) browser.forward() # 前进 input(‘回车键退出程序~’) browser.quit()
  • 12306 注册下拉框功能实现 # 导入模块 import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select # 专门处理下拉框 ​ # 目标网站 url = ‘https://kyfw.12306.cn/otn/regist/init’ ​ # 创建浏览器操作对象 browser = webdriver.Chrome() ​ # 打开网页 browser.get(url) ​ # 获取下拉框对象 get_selector = browser.find_element(By.ID,’cardType’) # 实例化Selectors对象 selector = Select(get_selector) time.sleep(2) # 使用value来选定 # selector.select_by_value(‘B’) # 使用索引来选择 selector.select_by_index(5) input(‘回车键退出程序~’) browser.quit()
  • 目标 开发一个爬虫程序,从苏宁易购网站抓取口红商品信息,并保存为 CSV 文件。 目标网址 苏宁易购(Suning.com) 要求 商品信息采集:实现苏宁易购平台特定商品(口红)信息的自动化采集,支持多页数据连续采集。 用户交互模拟:实现浏览器自动化操作,模拟真实用户搜索行为,处理页面动态加载内容。 数据存储与分析:结构化存储商品信息,支持后续数据分析处理,提供可扩展的数据存储方案。 需求 商品信息包括:商品名、评论数、价格、店铺名、详情页链接。 页面结构分析 通过分析,每个商品都是一个 <li> 标签,这一页的所有数据都在一个 <ul> 标签里面。 实现思路分析 打开网站 输入内容(口红) 点击搜索 拖动滚轮到底部 爬取数据 / 解析数据 翻页处理 实现代码: # 导入模块 import time from selenium import webdriver from selenium.webdriver.common.by import By import csv # 目标网站 url = ‘https://www.suning.com/’ # 创建浏览器操作对象 browser = webdriver.Chrome() browser.maximize_window() # 打开网页 browser.get(url) # 获取输入框对象 input_element = browser.find_element(By.ID,”searchKeywords”) # 执行输入 input_element.send_keys(‘口红’) time.sleep(1) # 获取点击按钮 button_element = browser.find_element(By.ID,”searchSubmit”) # 执行点击 button_element.click() time.sleep(1) # 下滑 def drop_down(): time.sleep(6) for x in range(1,12,2): time.sleep(1) j = x / 9 js = f’document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}’ browser.execute_script(js) # 获取数据 def get_info(): # 先执行下拉 drop_down() # 构建字典 info_dict = { ‘商品名称’:””, ‘商品价格’:””, ‘评论数’:””, ‘店铺名称’:””, ‘详情链接’:””, ‘图片url’:”” } # 获取每一个盒子 list_box = browser.find_elements(By.CLASS_NAME,”product-box “) if list_box: for box in list_box: # 获取商品名称 title = box.find_element(By.CSS_SELECTOR,”.title-selling-point > a”).text info_dict[‘商品名称’] = title # 获取商品价格 price = box.find_element(By.CSS_SELECTOR,”.def-price”).text info_dict[‘商品价格’] = price # 获取评论数 comment = box.find_element(By.CSS_SELECTOR,”.info-evaluate > a”).text info_dict[‘评论数’] = comment # 获取店铺名称 dianpu = box.find_element(By.CSS_SELECTOR,”.store-stock > a”).text info_dict[‘店铺名称’] = dianpu # 获取详情链接 detail_url = box.find_element(By.CSS_SELECTOR,”.title-selling-point > a”).get_attribute(‘href’) info_dict[‘详情链接’] = detail_url # 获取图片url photo_url = box.find_element(By.CSS_SELECTOR,”.sellPoint > img”).get_attribute(‘src’) info_dict[‘图片url’] = photo_url csv_writer.writerow(info_dict) print(info_dict) else: print(‘没有获取到所有盒子’) flag = True i = 1 with open(‘苏宁易购_口红.csv’,’w’,newline=”,encoding=’utf-8′) as f: field_list = [‘商品名称’,’商品价格’,’评论数’,’店铺名称’,’详情链接’,’图片url’] csv_writer = csv.DictWriter(f,fieldnames=field_list) csv_writer.writeheader() while flag: try: print(f’正在获取第{i}页内容’) # 调用获取内容函数 get_info() # # 获取下一页按钮 # next_page_btn = browser.find_element(By.ID,”nextPage”) # # 执行点击下一页 # next_page_btn.click() # 翻页 browser.execute_script(‘document.querySelector(“#nextPage”).click()’) time.sleep(2) # 等待页面加载 i += 1 except Exception as e: flag = False print(‘已经是最后一页了’) input(‘回车键结束’) browser.quit() 以上就是Python Selenium自动化实现网页操控的详细内容,更多关于Python Selenium网页操作的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python利用Selenium实现全网页截图 Python利用Selenium进行网页自动化与动态内容抓取操作 Python Selenium网页自动化利器使用详解 学习Python selenium自动化网页抓取器 Python中使用 Selenium 实现网页截图实例
  • 目录
    • 1 什么是 Selenium 自动化
    • 2 为什么要使用 Selenium 自动化
    • 3 什么时候使用 Selenium 自动化
    • 4 如何使用 Selenium 自动化
      • 安装与配置
      • 下载浏览器驱动(如 ChromeDriver)
    • 5 selenium 的基本使用
      • 6 Selenium 元素定位
        • 7 访问元素信息
          • 8 元素信息获取
            • 9 交互操作
              • 10 案例练习
                • 11 案例实战

                  Selenium 是一个用于 Web 应用程序测试的工具,支持多种浏览器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心组件,用于控制浏览器行为并执行自动化操作。元素定位是通过各种方式(如 ID、Class Name、XPath 等)在网页上找到特定元素。

                  Selenium 可以用于自动化测试,减少人工测试的工作量。Selenium 可以用于抓取动态加载的数据,这些数据通常无法通过简单的 HTTP 请求获取。Selenium 支持多种浏览器,确保应用在不同浏览器上的一致性。

                  当网页内容是通过 JavaScript 动态加载时,Selenium 是抓取这些数据的理想工具。当需要模拟复杂的用户交互(如点击、输入、滚动等)时,Selenium 非常有用。在需要频繁进行回归测试或跨浏览器测试时,Selenium 是首选工具。

                  安装 Selenium 库和浏览器驱动(如 ChromeDriver)。打开浏览器、导航到 URL、定位元素、点击、输入等。处理弹出窗口、等待元素加载、执行 JavaScript 等。处理元素未找到、超时等异常情况。

                  安装 Selenium 库

                  pip install selenium==4.5.0

                  将浏览器驱动程序的路径添加到系统环境变量中。

                  注意:不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器驱动程序之前,先查看当前浏览器的版本号。

                  查看 Chrome 浏览器版本

                  单击 Chrome 浏览器右上角的图标打开 “自定义及控制 Google Chrome” 菜单,在该菜单中选择 “帮助”→“关于 Google Chrome” 打开关于 Chrome 页面。

                  访问 chromedriver 官网

                  根据 Chrome 浏览器的版本号,到 chromedriver官网 官方网站或者到 最新最全的外网

                  chromedriver驱动网站与Chrome浏览器版本对应的chromedriver的下载列表,下载对应版本的 ChromeDriver。

                  下载 chromedriver

                  单击与浏览器相应版本的 ChromeDriver 链接,进入下载页面,下载 ZIP 格式的压缩包到本地,解压后得到 chromedriver.exe。

                  WebDriver 的配置

                  将 WebDriver 配置到系统环境变量后,程序中再次使用 WebDriver 时,就不需要重复指定 WebDriver 的执行路径了。

                  from selenium import webdriver
                  ​
                  url = 'https://www.baidu.com'
                  ​
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  ​
                  # 打开网页
                  browser.get(url)
                  # 获取源码(同requests.text)
                  print(browser.page_source)
                  input('用户按下回车键退出')
                  # 退出
                  browser.quit()

                  元素定位首先要找到它们,WebDriver 提供很多定位元素的方法:

                  定位方式 By 标识符 示例
                  ID By.ID find_element(By.ID, "kw")
                  Name 属性 By.NAME find_element(By.NAME, "wd")
                  Class name By.CLASS_NAME find_element(By.CLASS_NAME, "s_ipt")
                  标签名 By.TAG_NAME find_elements(By.TAG_NAME, "input")
                  链接文本 By.LINK_TEXT find_element(By.LINK_TEXT, "新闻")
                  部分链接文本 By.PARTIAL_LINK_TEXT find_element(By.PARTIAL_LINK_TEXT, "新")
                  CSS 选择器 By.CSS_SELECTOR find_element(By.CSS_SELECTOR, "#su")
                  XPath By.XPATH find_element(By.XPATH, '//input[@id="su"]')

                  代码演示:selenium 的元素定位

                  from selenium import webdriver
                  # 定位元素,必须要导入By
                  from selenium.webdriver.common.by import By
                  ​
                  url = 'https://www.baidu.com'
                  ​
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  ​
                  # 打开网页
                  browser.get(url)
                  ​
                  # 通过id获取输入框
                  res1 = browser.find_element(By.ID,'kw')
                  print(res1)
                  ​
                  # 通过name获取输入框
                  res2 = browser.find_element(By.NAME,'wd')
                  print(res2)
                  ​
                  # 通过XPath获取输入框
                  res3 = browser.find_element(By.XPATH,"//*/input[@id='kw']")
                  print(res3)
                  print(res1==res2 and res2==res3)# True
                  ​
                  # 通过类名获取输入框
                  res4 = browser.find_element(By.CLASS_NAME,"s_ipt")
                  ​
                  # 通过css选择器来获取输入框
                  res5 = browser.find_element(By.CSS_SELECTOR,"#kw")
                  print(res3==res4 and res4==res5)# True
                  ​
                  # 通过通过链接文本获取标签
                  res6 = browser.find_element(By.LINK_TEXT,"新闻")
                  ​
                  # 通过部分链接文本获取标签
                  res7 = browser.find_element(By.PARTIAL_LINK_TEXT,"闻")
                  print(res6==res7)# True
                  ​
                  # 通过标签名,并且由复数的形式获取a标签
                  res8 = browser.find_elements(By.TAG_NAME,"a")
                  print(res8)
                  ​
                  input('用户按下回车键退出~')
                  # 退出
                  browser.quit()

                  获取元素属性 .get_attribute('class'),获取元素文本 .text,获取标签名.tag_name

                  from selenium import webdriver
                  from selenium.webdriver.common.by import By
                  ​
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  ​
                  url = "https://www.baidu.com"
                  # 打开网页
                  browser.get(url)
                  ​
                  # 获取到新闻文本的a链接(通过链接文本内容)
                  a = browser.find_element(By.LINK_TEXT,"新闻")
                  ​
                  # 获取href
                  a_href = a.get_attribute('href')
                  print(f"href:{a_href}")
                  # 结果:href:http://news.baidu.com/
                  ​
                  # 获取class
                  a_class = a.get_attribute('class')
                  print(f"class:{a_class}")
                  # 结果:class:mnav c-font-normal c-color-t
                  ​
                  # 获取文本内容
                  a_text = a.text
                  print(a_text)
                  # 结果:新闻
                  ​
                  # 获取标签名称
                  a_tag_name = a.tag_name
                  print(a_tag_name)
                  # 结果:a

                  点击、send_keys()、后退操作、前进操作、模拟 JS 滚动、执行 JS 代码、获取网页代码 page_source、退出。

                  selenium 元素交互

                  from selenium import webdriver
                  from selenium.webdriver.common.by import By
                  import time
                  ​
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  # 将窗口最大化
                  # browser.maximize_window()
                  ​
                  url = 'https://www.baidu.com'
                  # 打开浏览器
                  browser.get(url)
                  ​
                  # 获取输入框
                  get_input = browser.find_element(By.ID,"kw")
                  # 输入周杰伦
                  get_input.send_keys('周杰伦')
                  ​
                  # 获取点击按钮
                  get_button = browser.find_element(By.CSS_SELECTOR,"input[type='submit']")
                  # 执行点击操作
                  get_button.click()
                  ​
                  def scoll():
                      # 这里要进行等待,否则后面的滑动页面没有反应,目的是等待页面加载
                      time.sleep(2)
                      # 执行滑动
                      js = 'document.documentElement.scrollTop=100000'
                      browser.execute_script(js)
                  def next_page():
                      scoll()
                      time.sleep(2)
                      # 获取下一页按钮
                      next_button = browser.find_element(By.PARTIAL_LINK_TEXT,"下一页")
                      # 执行点击操作
                      next_button.click()
                  for i in range(3):
                      next_page()
                  # 导航操作
                  browser.back()  # 回退
                  time.sleep(2)
                  browser.forward() # 前进
                  input('回车键退出程序~')
                  browser.quit()

                  12306 注册下拉框功能实现

                  # 导入模块
                  import time
                  from selenium import webdriver
                  from selenium.webdriver.common.by import By
                  from selenium.webdriver.support.ui import Select  # 专门处理下拉框
                  ​
                  # 目标网站
                  url = 'https://kyfw.12306.cn/otn/regist/init'
                  ​
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  ​
                  # 打开网页
                  browser.get(url)
                  ​
                  # 获取下拉框对象
                  get_selector = browser.find_element(By.ID,'cardType')
                  # 实例化Selectors对象
                  selector = Select(get_selector)
                  time.sleep(2)
                  # 使用value来选定
                  # selector.select_by_value('B')
                  # 使用索引来选择
                  selector.select_by_index(5)
                  input('回车键退出程序~')
                  browser.quit()

                  目标

                  开发一个爬虫程序,从苏宁易购网站抓取口红商品信息,并保存为 CSV 文件。

                  目标网址

                  苏宁易购(Suning.com)

                  要求

                  • 商品信息采集:实现苏宁易购平台特定商品(口红)信息的自动化采集,支持多页数据连续采集。
                  • 用户交互模拟:实现浏览器自动化操作,模拟真实用户搜索行为,处理页面动态加载内容。
                  • 数据存储与分析:结构化存储商品信息,支持后续数据分析处理,提供可扩展的数据存储方案。

                  需求

                  商品信息包括:商品名、评论数、价格、店铺名、详情页链接。

                  页面结构分析

                  通过分析,每个商品都是一个 <li> 标签,这一页的所有数据都在一个 <ul> 标签里面。

                  实现思路分析

                  • 打开网站
                  • 输入内容(口红)
                  • 点击搜索
                  • 拖动滚轮到底部
                  • 爬取数据 / 解析数据
                  • 翻页处理

                  实现代码:

                  # 导入模块
                  import time
                  from selenium import webdriver
                  from selenium.webdriver.common.by import By
                  import csv
                  
                  # 目标网站
                  url = 'https://www.suning.com/'
                  
                  # 创建浏览器操作对象
                  browser = webdriver.Chrome()
                  
                  browser.maximize_window()
                  # 打开网页
                  browser.get(url)
                  
                  # 获取输入框对象
                  input_element = browser.find_element(By.ID,"searchKeywords")
                  # 执行输入
                  input_element.send_keys('口红')
                  time.sleep(1)
                  
                  # 获取点击按钮
                  button_element = browser.find_element(By.ID,"searchSubmit")
                  # 执行点击
                  button_element.click()
                  time.sleep(1)
                  # 下滑
                  def drop_down():
                      time.sleep(6)
                      for x in range(1,12,2):
                          time.sleep(1)
                          j = x / 9
                          js = f'document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}'
                          browser.execute_script(js)
                  # 获取数据
                  def get_info():
                      # 先执行下拉
                      drop_down()
                      # 构建字典
                      info_dict = {
                          '商品名称':"",
                          '商品价格':"",
                          '评论数':"",
                          '店铺名称':"",
                          '详情链接':"",
                          '图片url':""
                      }
                      # 获取每一个盒子
                      list_box = browser.find_elements(By.CLASS_NAME,"product-box ")
                      if list_box:
                          for box in list_box:
                              # 获取商品名称
                              title = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").text
                              info_dict['商品名称'] = title
                              # 获取商品价格
                              price = box.find_element(By.CSS_SELECTOR,".def-price").text
                              info_dict['商品价格'] = price
                              # 获取评论数
                              comment = box.find_element(By.CSS_SELECTOR,".info-evaluate > a").text
                              info_dict['评论数'] = comment
                              # 获取店铺名称
                              dianpu = box.find_element(By.CSS_SELECTOR,".store-stock > a").text
                              info_dict['店铺名称'] = dianpu
                              # 获取详情链接
                              detail_url = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").get_attribute('href')
                              info_dict['详情链接'] = detail_url
                              # 获取图片url
                              photo_url = box.find_element(By.CSS_SELECTOR,".sellPoint > img").get_attribute('src')
                              info_dict['图片url'] = photo_url
                              csv_writer.writerow(info_dict)
                              print(info_dict)
                      else:
                          print('没有获取到所有盒子')
                  flag = True
                  i = 1
                  with open('苏宁易购_口红.csv','w',newline='',encoding='utf-8') as f:
                      field_list = ['商品名称','商品价格','评论数','店铺名称','详情链接','图片url']
                      csv_writer = csv.DictWriter(f,fieldnames=field_list)
                      csv_writer.writeheader()
                      while flag:
                          try:
                              print(f'正在获取第{i}页内容')
                              # 调用获取内容函数
                              get_info()
                              # # 获取下一页按钮
                              # next_page_btn = browser.find_element(By.ID,"nextPage")
                              # # 执行点击下一页
                              # next_page_btn.click()
                              # 翻页
                              browser.execute_script('document.querySelector("#nextPage").click()')
                              time.sleep(2)  # 等待页面加载
                              i += 1
                          except Exception as e:
                              flag = False
                              print('已经是最后一页了')
                              input('回车键结束')
                              browser.quit()

                  以上就是Python Selenium自动化实现网页操控的详细内容,更多关于Python Selenium网页操作的资料请关注风君子博客其它相关文章!

                  您可能感兴趣的文章:

                  • Python利用Selenium实现全网页截图
                  • Python利用Selenium进行网页自动化与动态内容抓取操作
                  • Python Selenium网页自动化利器使用详解
                  • 学习Python selenium自动化网页抓取器
                  • Python中使用 Selenium 实现网页截图实例

                  站内搜索