安装与配置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获5000万美元新投资 成为远程桌面行业独角兽

    加利福尼亚州圣何塞,2021 年 1 月 27 日 - 下一代远程访问和远程支持领域的新兴领导者 Splashtop Inc. 完成了新一轮的 5000 万美元融资,其估值已超过了 10 亿美元的独角 ...

  2. 解决”将公司Linux服务器上的脚本导出到windows上打开串行的“问题

    目录 一.前期准备 二.回车转换 一.前期准备 1.在linux服务器上写一个简单的脚本. [root@node5 ~]# vim linux脚本.sh [root@node5 ~]# cat lin ...

  3. 基于webapi的websocket聊天室(番外二)

    我比较好奇的是webapi服务器怎么处理http请求和websocket请求.有了上一篇番外的研究,这里就可以试着自己写个非常简易的webapi服务器来接收这两种请求. 效果 http请求 消息打印 ...

  4. 部署springboot+vue项目文档(若依ruoyi项目部署步骤)

    摘自:https://blog.csdn.net/Dreamboy_w/article/details/104389797 部署springboot+vue项目文档(若依ruoyi项目部署步骤)一:部 ...

  5. mvn install:install-file -Dfile=D:\Clipper1.jar -DgroupId=de.lighti -DartifactId=Clipper -Dversion=6.4.2 -Dpackaging=jar

    mvn install:install-file -Dfile=D:\Clipper1.jar -DgroupId=de.lighti -DartifactId=Clipper -Dversion=6 ...

  6. SpringMVC在返回JSON数据时出现406错误解决方案

    在SpringMVC框架的使用中常常会使用@ResponseBody注解,修饰"处理器"(Controller的方法),这样在处理器在返回完毕后,就不走逻辑视图,而是将返回的对象转 ...

  7. jquery加载页面时触发事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【昇腾开发全流程】AscendCL开发板模型推理

    前言 学会如何安装配置华为云ModelArts.开发板Atlas 200I DK A2. 并打通一个Ascend910训练到Ascend310推理的全流程思路. 在本篇章,我们继续进入推理阶段! 推理 ...

  9. 领域驱动设计(Domain-Driven Design,简称DDD)【简介 个人学习笔记】

    找到了第 1 篇资料:领域驱动设计详解:是什么.为什么.怎么做? - 知乎 找到了第 2 篇资料:领域驱动架构(DDD)建模中的模型到底是什么? - 知乎 找到了第 3 篇资料:一文看懂DDD 领域驱 ...

  10. js 求任意两数之间的和

    知识点:函数的传参,函数的返回值 函数的传参 函数的参数包括以下两种类型: 1.形参:在定义函数时,声明的参数变量仅在函数内部可见: 2.实参:在调用函数时,实际传入的值. 示例 我们在定义函数的时候 ...