安装与配置selenium

  1. 安装selenium库
pip install selenium
  1. 配置浏览器驱动(本次使用Google Chrome)

    1. 打开Chrome,在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本
    2. 找到对应的chromedriver版本,参考版本选择 | ChromeDriver | Chrome for Developers
    3. 下载版本匹配的chromedriver,将其解压并置于自选路径下,将chromedriver.exe所在路径加入环境变量。
  2. 验证:

    编写并运行以下python文件,若不报错,则基本可认定配置成功:

    from selenium import webdriver
    # Chrome浏览器
    driver = webdriver.Chrome()

编写脚本

本次实现的是在Openstack Dashboard里寻找符合条件的镜像,并将其下载下来。镜像要求是名称以“1_”开头,且配置了qga。

脚本如下:

from selenium import webdriver
from selenium.common import ElementClickInterceptedException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time # 设置 webdriver
options = webdriver.ChromeOptions()
# options.add_argument('--headless') # 无头模式,不打开实际的浏览器窗口
options.add_argument('--ignore-certificate-errors') # 忽略证书错误
driver = webdriver.Chrome(options=options) # OpenStack Horizon登录页面URL
login_url = "https://192.168.0.60/horizon/auth/login/"
image_url = "https://192.168.0.60/horizon/project/images/" may_url = [] username = "your_username"
password = "your_password" def get_images():
try:
# 打开登录页面
driver.get(login_url)
# 等待并找到用户名输入框
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.NAME, "username"))
) # 输入用户名和密码
driver.find_element(By.NAME, "domain").send_keys("default")
driver.find_element(By.NAME, "username").send_keys(username)
driver.find_element(By.NAME, "password").send_keys(password) # 提交表单
driver.find_element(By.XPATH, '//button[@type="submit"]').click() # 确认登录成功,等待某个已知会出现在登录成功后的元素,例如导航栏中的一个元素
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "main_content"))
)
print("登录成功") # 访问镜像页面
driver.get(image_url) all_images = []
processed_image_ids = set() while True:
# 等待页面加载,并确保特定数据行存在
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.TAG_NAME, "tbody"))
) # 确保表格内容已加载,等待特定行内容出现
while True:
rows = driver.find_elements(By.XPATH, "//tbody/tr")
if len(rows)>=3:
break
time.sleep(1) # 获取页面内容
soup = BeautifulSoup(driver.page_source, 'html.parser')
rows = soup.find_all('tr', class_='ng-scope') # 处理每一行数据
for row in rows:
columns = row.find_all('td')
if len(columns) > 2: # 确保有足够的列
name_column = columns[3].find('a').text.strip().rsplit('.', 1)[0]
if name_column.startswith("1_"):
link = columns[3].find('a')['href']
may_url.append("https://192.168.0.60/horizon/" + link) # 检查是否有下一页
try:
next_button = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH,
'//span[@ng-hide="currentPage === numPages"]/a[@ng-click="selectPage(currentPage + 1)"]'))
)
next_button.click() except (ElementClickInterceptedException, TimeoutException) as e:
print(f"Failed to click the next button: {e}")
break for link in may_url:
print(link)
driver.get(link)
WebDriverWait(driver, 20).until(
EC.presence_of_element_located((By.TAG_NAME, "dl"))
) details_soup = BeautifulSoup(driver.page_source, 'html.parser')
properties_div = details_soup.find_all('div', {'ng-repeat': 'prop in ctrl.image.properties'})
# 查找包含名称的元素
name_element = details_soup.find('span', class_='h1 ng-binding')
name_column = name_element.text.strip().rsplit('.', 1)[0] has_qemu_guest_agent = False
for prop in properties_div:
dt = prop.find('dt').text.strip()
dd = prop.find('dd').text.strip()
if dt == "hw_qemu_guest_agent" and dd == "yes":
has_qemu_guest_agent = True
break if has_qemu_guest_agent:
image_id = driver.current_url.split('/')[-1]
if image_id not in processed_image_ids:
all_images.append({'name': name_column, 'id': image_id})
processed_image_ids.add(image_id)
print(f"Name: {name_column}, ID: {image_id}")
with open("images.txt", "w") as file:
for image in all_images:
file.write(f"Name: {image['name']}, ID: {image['id']}\n")
finally:
driver.quit() if __name__ == "__main__":
get_images()

参考资源

  1. Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)_chromedriver 119-CSDN博客
  2. selenium入门超详细教程——网页自动化操作-CSDN博客

记一次使用python的selenium库爬取动态页面内容的经历的更多相关文章

  1. Python:利用 selenium 库抓取动态网页示例

    前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...

  2. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

  3. selenium自动化测试爬取动态页面大全

    目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常   这里之讲解用法,安 ...

  4. [python爬虫] Selenium定向爬取海量精美图片及搜索引擎杂谈

    我自认为这是自己写过博客中一篇比较优秀的文章,同时也是在深夜凌晨2点满怀着激情和愉悦之心完成的.首先通过这篇文章,你能学到以下几点:        1.可以了解Python简单爬取图片的一些思路和方法 ...

  5. [python爬虫] Selenium定向爬取PubMed生物医学摘要信息

    本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方 ...

  6. Python 爬虫实例(8)—— 爬取 动态页面

    今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...

  7. phantomjs+selenium实现爬取动态网址

    之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...

  8. 【Python成长之路】Python爬虫 --requests库爬取网站乱码(\xe4\xb8\xb0\xe5\xa)的解决方法【华为云分享】

    [写在前面] 在用requests库对自己的CSDN个人博客(https://blog.csdn.net/yuzipeng)进行爬取时,发现乱码报错(\xe4\xb8\xb0\xe5\xaf\x8c\ ...

  9. [python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  10. 看我怎么扒掉CSDN首页的底裤(python selenium+phantomjs爬取CSDN首页内容)

    这里只是学习一下动态加载页面内容的抓取,并不适用于所有的页面. 使用到的工具就是python selenium和phantomjs,另外调试的时候还用了firefox的geckodriver.exe. ...

随机推荐

  1. 使用 Splashtop 启用员工远程访问

    使员工进行远程工作似乎是一项耗时.不安全且昂贵的任务.但是,借助 Splashtop,您可以快速.轻松.安全地使您的员工从任何位置以最高 价值远程访问其工作站. ​ 如何使用 Splashtop 启用 ...

  2. 用 C 语言开发一门编程语言 — 语法解析器

    目录 文章目录 目录 前文列表 编程语言的本质 词法分析 语法分析 使用 MPC 解析器组合库 安装 快速入门 实现波兰表达式的语法解析 波兰表达式 正则表达式 代码实现 前文列表 <用 C 语 ...

  3. Ubuntu Snap 简述

    Ubuntu Snaps Ubuntu Snaps 是 Ubuntu 的母公司 Canonical 于 2016 年 4 月发布 Ubuntu16.04 LTS(LongTermSupport,长期支 ...

  4. pageoffice6 版本实现在线打开word 文件禁止保存、禁止另存、禁止打印的需求

    在实际项目需求中,有时需要限制用户的保存.另存.打印文件操作,实现此效果只需在OnPageOfficeCtrlInit或AfterDocumentOpened事件中调用js设置PageOffice控件 ...

  5. 基于webapi的websocket聊天室(四)

    上一篇实现了多聊天室.这一片要继续改进的是实现收发文件,以及图片显示. 效果 问题 websocket本身就是二进制传输.文件刚好也是二进制存储的. 文件本身的传输问题不太,但是需要传输文件元数据,比 ...

  6. Python作图三维等高面

    技术背景 对于等高线,大家都是比较熟悉的,因为日常生活中遇到的山体和水面,都可以用一系列的等高线描绘出来.而等高面,顾名思义,就是在三维空间"高度一致"的曲面.当然了,在二维平面上 ...

  7. salesforce零基础学习(一百三十九)Admin篇之Begins/Contains/Starts With 是否区分大小写

    本篇参考: https://help.salesforce.com/s/articleView?id=sf.customize_functions_begins.htm&type=5 http ...

  8. shell脚本入门学习

    1 参考 [尚硅谷]Shell脚本从入门到实战_哔哩哔哩_bilibili 本文为上面链接的课程学习记录. 2 基础 shell脚本需要shell解释器进行执行,shell解释器就是一个应用程序,有多 ...

  9. Java中编译异常与运行异常的区别

    编译期异常和运行期异常的区别 编译期异常和运行期异常的区别如下 异常处理要求不同:编译期异常(也称为检测异常checked Exception)要求在代码中显式地处理(使用try-catch或者thr ...

  10. nodejs加jq来实现下载word文档

    先看效果 浏览器上: 下载的效果: 第一步是自己先搭建前端页面把自己写的结构数据全部传到后端 下面就是整个的结构 结构分析后端拿到数据后端解析: 第一层菜单层: { role: '分析报告', //顶 ...