动态渲染页面爬取
我们可以直接使用模拟浏览器运行的方式来实现,这样就可以做到在浏览器中看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面,不用管网页后台的 Ajax 接口到底有哪些参数。
要使用 selenium 必须先安装 chromedriver 驱动 驱动版本要和 chrome 版本一致:
- 首先禁止chorme 自动更新 host 文件配置 127.0.0.1 update.googleapis.com
- 下载一个历史版本的 chrome https://google-chrome.cn.uptodown.com/windows/download/1025823664
- 并下载对应的驱动 https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/119.0.6045.105/win64/chromedriver-win64.zip # 119.0.6045.105 是可以修改成对应的版本号
- 这个可以拿到最新的驱动版本 https://blog.csdn.net/qq_42771102/article/details/142853514
Selenium介绍
Selenium 是一个强大的开源自动化测试工具,主要用于Web应用程序的测试。它支持多种浏览器(如Chrome, Firefox, Safari, Edge等)和操作系统(包括Windows, macOS, Linux等)。Selenium提供了一个名为WebDriver的API,允许开发者通过编写代码来控制浏览器行为,从而实现网页加载、表单填写、按钮点击等操作的自动化。
Selenium 主要用途:
- Web应用测试:Selenium最广泛的应用场景是用于自动化Web应用的功能测试。它可以模拟用户与网站或Web应用之间的交互过程,比如登录、导航到不同页面、提交表单等。
- 跨浏览器兼容性测试:由于Selenium支持多款主流浏览器,因此非常适合用来检查Web应用在不同浏览器环境下的表现是否一致。
- 持续集成(CI)环境:结合Jenkins、Travis CI等持续集成工具使用时,Selenium可以帮助团队自动运行测试用例,并及时反馈结果,提高软件开发效率。
- 爬虫技术:虽然不是其设计初衷,但有些人也会利用Selenium来进行网页数据抓取,特别是当目标网站采用了JavaScript渲染内容时,传统的HTTP请求方式可能无法获取完整信息。
Selenium 组件介绍:
- Selenium WebDriver:这是目前最常用的组件之一,提供了丰富的接口供编程语言调用以操控浏览器。
- Selenium IDE (Integrated Development Environment):一个浏览器插件形式存在的简易记录回放工具,适用于快速创建简单的测试脚本。
- Selenium Grid:允许多台机器并行执行测试任务,提高了大规模测试的效率。
总之,Selenium是一个非常灵活且功能强大的工具集,对于任何需要进行Web自动化的人来说都是不可或缺的好帮手。无论是专业的质量保证工程师还是希望提升工作效率的前端开发者,都可以从中受益。
打开浏览器
def open_browser():browser = webdriver.Chrome()try:browser.get('https://www.baidu.com')# 使用 find_element 方法和 By.IDinput_box = browser.find_element(By.ID, 'kw')# 输入搜索内容input_box.send_keys('街拍')# 点击搜索按钮input_box.send_keys(Keys.ENTER)# 等待页面加载完成wait = WebDriverWait(browser, 10)wait.until(EC.presence_of_element_located((By.ID, 'content_left')))# 打印页面标题print(browser.current_url) # 打印当前页面的 urlprint(browser.get_cookies()) # 打印 cookieprint(browser.page_source) # 打印页面源代码except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器
访问网页
def open_url():browser = webdriver.Chrome()try:browser.get('https://www.baidu.com')# 打印页面标题print(browser.title) # 打印当前页面的标题except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器
查找节点
Selenium 可以驱动浏览器完成各 操作 ,比如填充表单、模拟点击等 Selenium 提供了 系列查找节点的方法,我们可以用这些方法来获取想要的节点,以便下一步执行一些动作或者提取信息# find_element_by_id 方法可以根据 id 属性来查找节点# find_element_by_name 方法可以根据 name 属性来查找节点# find_element_by_xpath 方法可以根据 xpath 表达式来查找节点# find_element_by_link_text 方法可以根据链接文本来查找节点# find_element_by_partial_link_text 方法可以根据部分链接文本来查找节点# find_element_by_tag_name 方法可以根据标签名来查找节点# find_element_by_class_name 方法可以根据类名来查找节点# find_element_by_css_selector 方法可以根据 CSS 选择器来查找节点
def find_element():browser = webdriver.Chrome()try:browser.get('https://www.xiaohongshu.com/user/profile/5768f3576a6a6977158b1e24?xsec_token=&xsec_source=pc_search')# 使用class name 查找头像框avatar = browser.find_element(By.CLASS_NAME,'avatar-wrapper')# 查找里面的<img>标签img = avatar.find_element(By.TAG_NAME,'img')# 获取图片的src属性print(img.get_attribute('src'))# 将图片保存到本地img.screenshot('avatar.png')except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器
查找多个节点
def find_elements():browser = webdriver.Chrome()try:browser.get('https://www.xiaohongshu.com/user/profile/5768f3576a6a6977158b1e24?xsec_token=&xsec_source=pc_search')# 使用class name 查找所有标签channels = browser.find_elements(By.TAG_NAME,'channel')for channel in channels:# 获取每个标签的文本内容print(channel.text)except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器## 等待元素加载完成
动作链
def action_chains():browser = webdriver.Chrome()try:browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')browser.switch_to.frame('iframeResult')source = browser.find_element(By.CLASS_NAME,'ui-draggable')target = browser.find_element(By.CLASS_NAME,'ui-droppable')actions = ActionChains(browser)actions.drag_and_drop(source, target)actions.perform()except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器
执行某些 JavaScript 代码
def execute_js():browser = webdriver.Chrome()try:browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')browser.execute_script('alert("To Bottom")')except Exception as e:print(e)finally:input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器browser.quit() # 确保在最后关闭浏览器#获取节点信息
#get_attribute 方法可以获取节点的属性值
# print(input.id)
#print(input.text)
#print(input.location)
#print(input.tag_name)
#print(input.size)
#调用其 id、location、tag_name、size 属性来获取对应的属性值。
其他的操作
切换Frame
切换到指定的Frame,可以使用 switch_to.frame 方法,参数可以是 frame 元素的 id、name、索引、WebElement 对象。
def switch_frame():
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
try:
logo = browser.find_elements(By.CLASS_NAME,'logo')
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_elements(By.CLASS_NAME,'logo')
print(logo)
input("按回车键关闭浏览器...") # 等待用户输入后关闭浏览器
browser.quit() # 确保在最后关闭浏览器前进和后退
前进和后退操作可以使用 back 和 forward 方法,前进和后退到历史记录中的某一页。
def forward_back():
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()Cookies
可以使用 add_cookie 方法添加 cookie,并使用 get_cookies 方法获取所有 cookie。
def cookies():
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())选项卡管理
可以使用 window_handles 方法获取所有选项卡的句柄,并使用 switch_to.window 方法切换到指定选项卡。
def tab_management():
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1]) # 切换到第二个选项卡
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0]) # 切换到第一个选项卡
browser.get('https://python.org')tab_management()
相关文章:
动态渲染页面爬取
我们可以直接使用模拟浏览器运行的方式来实现,这样就可以做到在浏览器中看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面,不用管网页后台的 Ajax 接口到底…...
C++适配器模式之可插入适配器的实现模式和方法
可插入适配器与Adaptee的窄接口 在C适配器模式中,可插入适配器(Pluggable Adapter)是指适配器类的设计允许在运行时动态地插入不同的Adaptee对象,从而使适配器具有灵活性和可扩展性。这种设计使得适配器不仅限于适配一个特定的Ad…...

每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)
1. 第 N 个泰波那契数(easy) 1. 题目链接:1137. 第 N 个泰波那契数 2. 题目描述 3.题目分析 这题我们要求第n个泰波那契Tn的值,很明显的使用动态规划算法。 4.动态规划算法流程 1. 状态表示: 根据题目的要求及公…...

Hash table类算法【leetcode】
哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n),但如果使用哈希…...

windows实现VNC连接ubuntu22.04服务器
最近弄了一个700块钱的mini主机,刷了ubuntu22.04系统,然后想要在笔记本上通过VNC连接,这样就有了一个linux的开发环境。最后实现的过程为: 安装vnc服务器 安装 VNC 服务器软件: sudo apt update sudo apt install t…...
中国电信星辰大模型:软件工厂与文生视频技术的深度解析
在科技日新月异的今天,人工智能(AI)技术正以惊人的速度改变着我们的生活和工作方式。作为这一领域的领军企业之一,中国电信凭借其强大的研发实力和深厚的技术积累,推出了星辰大模型,旨在为用户带来更加智能、高效、便捷的服务体验。本文将重点介绍中国电信星辰大模型中的…...

项目实战:基于Vue3实现一个小相册
相册的示例效果图 注意看注释... 要实现图片的相册效果,图片命名可以像{img1.jpg,img2.jpg,img3.jpg}类似于这种的命名方式。 CSS部分: <style>/* 伪元素选择器,用于在具有clear_ele类的元素内部的末尾添加一个新的元素 */.clear_ele:…...
macOS安装nvm node
macOS安装nvm macOS安装nvm创建 nvm 工作目录配置环境变量使用 nvm查看可用的 Node.js 版本安装特定版本 macOS安装nvm brew install nvm创建 nvm 工作目录 mkdir ~/.nvm配置环境变量 vim ~/.zshrc# nvm export NVM_DIR"$HOME/.nvm" [ -s "/opt/homebrew/opt…...
解决整合Django与Jinja2兼容性的问题
提问 解决整合Django与Jinja2时遇到了一些兼容性问题。已经按照常规步骤在我的settings.py中配置了Jinja2作为模板引擎,同时保留了Django默认的模板设置。然而尝试同时使用Django和Jinja2时,系统报错提示我没有指定模板。如果我尝试移除Django的默认模板…...
Elasticsearch面试内容整理-高级特性
Elasticsearch 提供了一系列高级特性,这些特性可以极大地增强其搜索、分析和管理能力,使得它在大数据场景中表现出色。以下是 Elasticsearch 的一些重要高级特性: 近实时搜索(Near Real-Time Search) Elasticsearch 的一个关键特性是 近实时搜索(NRT),这意味着数据写入…...
linux通过手工删除文件卸载oracle 11g rac的具体步骤
在linux操作系统中,有些时候我们自己学习和测试会临时搭建的oracle rac。事情完成后,我们想回收资源,需要去卸载oracle rac。为了快速卸载oracle rac,今天我们介绍下如何通过手工删除文件的方式来完成工作(操作都需要在…...

【ArcGISPro】根据yaml构建原始Pro的conda环境
使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…...

刷题笔记15
问题描述 小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这…...

【LeetCode热题100】队列+宽搜
这篇博客是关于队列宽搜的几道题,主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …...

【阵列信号处理】相干信号和非相干信号生成
文章目录 一、总结二、知识点相干(coherent)和非相干(incoherent)信号相干信号生成代码 相关信号(correlated signal)相关信号生成代码 正交信号定义 本文记录博主的科研日记。如果对博主的其他文章感兴趣&…...
React 组件生命周期
React 组件生命周期 React 组件生命周期是React框架中一个核心概念,它描述了一个组件从创建到销毁的过程。理解组件生命周期对于高效开发React应用至关重要,因为它允许开发者在一个组件的不同阶段执行特定的逻辑。本文将详细介绍React组件的生命周期方法,并解释它们在组件的…...

Kylin Server V10 下基于Sentinel(哨兵)实现Redis高可用集群
一、什么是哨兵模式 Redis Sentinel 是一个分布式系统,为 Redis 提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress)这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线信息,并使用投票协议(agreement protocols)来决定是否执行…...

07-Making a Bar Chart with D3.js and SVG
课程链接 Curran的课程,通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom,根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据,可以使用通义千问,关于LinearScale与BandScale不懂的地方也可以在通义千…...
硅谷甄选前端项目环境配置笔记
此教程来自于尚硅谷 文章目录 **此教程来自于尚硅谷**硅谷甄选运营平台一、搭建后台管理系统模板1.1项目初始化1.1.1环境准备1.1.2初始化项目 1.2项目配置一、eslint配置1.1vue3环境代码校验插件1.2修改.eslintrc.cjs配置文件1.3.eslintignore忽略文件1.4运行脚本 二、配置**pr…...

6.7机器学习期末复习题
空间 样本空间 就是属性的所有可能情况,包括了一切可能出现或不可能出现的所有样本情况 版本空间&假设空间 假设空间就是在样本空间的基础上,给所有属性都加了一个通配符,表示任意即可;以及加上了一个空集,表示…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...

数据可视化交互
目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 一、安装 pyecharts 二、下载数据 三、实验任务 实验 1:AQI 横向对比条形图 代码说明: 运行结果: 实验 2:AQI 等级分布饼图 实验 3:多城市 AQI…...