Day:006(2 ) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

selenium 层级定位

窗口的定位:

对于一个现代的web应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。

有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame中,seelnium webdriver提供了一个switch_to_frame方法,可以很轻松的来解决这个问题。

多层框架或窗口的定位:

  • driver.switch_to.frame()
frame.html 
<html>
<head><meta http-equiv="content-type"
content="text/html;charset=utf-8" /><title>frame</title><script type="text/javascript"
src="https://cdn.jsdelivr.net/npm/jquery@1.1
2.4/dist/jquery.min.js"></script><link href="http://netdna.bootstrapcdn.com/twitterbootstrap/2.3.2/css/bootstrapcombined.min.css"
rel="stylesheet" />
</head><body><div class="row-fluid"><div class="span10 well"><h3>frame</h3><iframe id="f1"
src="inner.html" width="800" , height="600">
</iframe></div></div>
</body>
<script
src="https://cdn.jsdelivr.net/npm/@bootcss/v
3.bootcss.com@1.0.8/dist/js/bootstrap.min.js
"></script></html>
</html>
inner.html 
<html>
<head><meta http-equiv="content-type"
content="text/html;charset=utf-8" /><title>inner</title>
</head>
<body><div class="row-fluid"><div class="span6 well"><h3>inner</h3><iframe id="f2"
src="https://cn.bing.com/" width="700"
height="500"></iframe></div></div>
</body>
</html>
switch_to_frame()
from selenium.webdriver.chrome.service
import Service
from selenium import webdriver
from selenium.webdriver.common.by import By
import os
from time import sleepdef select_frame():# 创建驱动s =
Service(executable_path='./chromedriver.exe')# 创建浏览器driver = webdriver.Chrome(service=s)file_path = 'file:///' +os.path.abspath('./html/outer.html')# 打开网页driver.get(file_path)# 切换framedriver.switch_to.frame('f1')driver.switch_to.frame('f2')# 定位元素,输入要搜索的内容driver.find_element(By.ID,'sb_form_q').send_keys('百战')# 定位按钮,点击搜索driver.find_element(By.ID,'search_icon').click()sleep(3)driver.quit()
if __name__ =='__main__':select_frame()

selenium 处理下拉框

        在爬取数据时,有时数据太多,而官网提供了筛选功能select标签,像这样的数据,我们只需要定位元素,点击即可。

<html><body><select id="ShippingMethod"
onchange="updateShipping(options[selectedIndex]);" name="ShippingMethod"><option value="12.51">UPS NextDay Air ==> $12.51</option><option value="11.61">UPS NextDay Air Saver ==> $11.61</option><option value="10.69">UPS 3 DaySelect ==> $10.69</option><option value="9.03">UPS 2nd DayAir ==> $9.03</option><option value="8.34">UPS Ground==> $8.34</option><option value="9.25">USPSPriority Mail Insured ==> $9.25</option><option value="7.45">USPSPriority Mail ==> $7.45</option><option value="3.20"selected="">USPS First Class ==>$3.20</option></select></body>
</html>
from selenium.webdriver.common.by import By
driver= webdriver.Chrome()
file_path =  'file:///' +
os.path.abspath('drop_down.html')
driver.get(file_path)
time.sleep(2)
m=driver.find_element(By.ID,"ShippingMethod"
)
m.find_element(By.XPATH,"//option[@value='10
.69']").click()
time.sleep(3)
driver.quit()

selenium处理弹窗

        有时,页面可能要弹窗口。只需要去定位弹窗上的“确定”按钮即可

  • switch_to

                焦点集中到页面上的一个警告(提示)

  • accept()

                接受警告提示

切换至弹窗
chrome.switch_to.alert.accept()
chrome.switch_to_alert().accept()  # 过期

代码

html 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>This is a page</title>
</head>
<body><div id = "container"><div style="font: size30px;">Hello,Python Spider</div></div>
</body>
<script>alert('这个是测试弹窗')
</script>
</html>

python

from lib2to3.pgen2 import driver
from selenium.webdriver.chrome.service
import Service
from selenium import webdriver
from time import sleep
import osdef test_windows():# 创建驱动对象s = Service('./chromedriver.exe')# 创建浏览器driver = webdriver.Chrome(service=s)# 访问页面# 设置页面地址file_path = 'file:///' +os.path.abspath('./html/test03.html')driver.get(file_path)sleep(3)# 定位弹出窗口,并点击driver.switch_to.alert.accept()sleep(3)driver.quit()if __name__ =='__main__':test_windows()

 selenium拖拽元素

        要完成元素的拖拽,首先需要指定被拖动的元素和拖动目标元素,然后利用 ActionChains 类来实现,ActionChains用于定制动作。

通过ActionChains对象中的perform()执行动作

代码

html

<!doctype html>
<html lang="en">
<head><meta charset="utf-8"><meta name="viewport"content="width=device-width, initialscale=1"><title>jQuery UI Draggable - Autoscroll</title><link rel="stylesheet" href="http://code.jquery.com/ui/1.12.1/themes/base/jqueryui.css"><style>#draggable, #draggable2, #draggable3 {
width: 100px; 
height: 100px; 
padding: 0.5em;
float: left; 
margin: 0 10px 10px 0; 
}body {font-family: Arial, Helvetica,sans-serif;}table {font-size: 1em;}.ui-draggable, .ui-droppable{
background-position: top;
}</style><script src="https://code.jquery.com/jquery1.12.4.js"></script><script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script><script>$( function() {$( "#draggable" ).draggable({scroll: true });$( "#draggable2" ).draggable({scroll: true, scrollSensitivity: 100 });$( "#draggable3" ).draggable({scroll: true, scrollSpeed: 100 });} );</script></head>
<body><div id="draggable" class="ui-widgetcontent"><p>Scroll set to true, defaultsettings</p>
</div><div id="draggable2" class="ui-widgetcontent"><p>scrollSensitivity set to 100</p>
</div><div id="draggable3" class="ui-widgetcontent"><p>scrollSpeed set to 100</p>
</div>
<div style="height: 5000px; width: 1px;">
</div>
</body>
</html>

python 

import os
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChainschrome =webdriver.Chrome(executable_path='./tools/chromedriver.exe')
file =f'file:///{os.path.abspath("./html/scroll.html")}'
chrome.get(file)div1 =chrome.find_element_by_id('draggable')
div2 =chrome.find_element_by_id('draggable2')
div3 =chrome.find_element_by_id('draggable3')
print(div1)
print(div2)
print(div3)
sleep(2)ac1 =ActionChains(chrome).drag_and_drop(div1,div2)
ac1.perform()
sleep(2)ac2 =ActionChains(chrome).drag_and_drop_by_offset(div3,10,10)
for i in range(5):ac2.perform()sleep(1)sleep(3)
chrome.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第3章 存储系统(2)

3.3 主存储器与CPU连接 3.3.1 连接原理 现代计算机的MAR和MDR都在CPU内部。 (1)主存储器通过数据总线,地址总线,控制总线与CPU连接。 (2)数据传输率数据总线宽度*总线频率。 (4)控制总线(读写线)控制读写操作。 3.3.2 主存的扩展 数据总线宽度等于存储字长 1.位扩展法【增加…

离线数据同步工具DataX

目录 1.应用场景2.类似的数据同步工具3.DataX 与 Canal 有什么区别 DataX是阿里巴巴开源的一款数据同步工具&#xff0c;使用Java语言开发的。它提供了从各类数据源读取数据以及向各类数据源写入数据的功能&#xff0c;支持包括MySQL、Oracle、SQLServer、PostgreSQL、HDFS、HB…

2024/4/6 HarmonyOS学习笔记-图片组件

Image组件 1、作用&#xff1a; 渲染并展示图片&#xff0c;支持本地和网络图片。 Image($r(‘app.media.logo’)).width(78).height(78) 2、图片数据源 &#xff08;1&#xff09;string数据源&#xff1a; 适用于网络图片和本地图片 使用网络图片时需要在module.json5文…

STL、Vector和Set的讲解和例题分析

STL STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;是C标准库的一部分&#xff0c;它提供了一系列通用的编程组件&#xff0c;包括容器、迭代器、算法和函数对象等。STL是C中实现泛型编程的核心&#xff0c;它允许程序员使用模板编写与数…

Java-Web过滤器

文章目录 1.基本介绍1.为什么需要过滤器&#xff1f;2.基本介绍3.过滤器的基本原理 2.快速入门1.文件目录2.环境配置创建maven项目&#xff0c;导入依赖 3.代码实现1.login.jsp2.LoginCheck.java3.ManagerFilter.java编写过滤规则4.配置web.xml告诉tomcat5.admin.jsp 3.Filter的…

springboot如何切换内置web服务器?

切换内置web服务器 这是没有引入web依赖的服务 这是引入web依赖的服务 由此可知默认是tomcat服务器 那么如何切换内置服务器 只要有对应服务器的坐标即可自动切换&#xff0c;先排除tomcat再引入依赖&#xff0c;比如切换成jetty服务器 <dependency><groupId>org…

rabbitmq的消息确认机制和消息持久化机制分别是如何实现的?

RabbitMQ的消息确认机制和消息持久化机制是确保消息可靠传输和存储的重要功能。下面是它们各自的工作原理的简要说明&#xff1a; 1、消息确认机制 RabbitMQ的消息确认机制主要用于确保消息从生产者发送到队列&#xff0c;以及从队列发送到消费者时都能够被正确处理和确认。这…

飞腾银河麒麟(ARM架构)离线安装MySql8.0.28版本

下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 解压后上传到服务器(或者直接上传到服务器用tar -zxvf xxx.tar命令解压) 卸载mariadb 卸载命令&#xff1a;yum remove mariadb-server mariadb 检查是否还有未删除的包&#xff1a; rpm -…

模型训练----apex库报错IndexError: tuple index out of range

问题描述 在训练模型的过程中遇到了apex库的报错IndexError: tuple index out of range导致无法训练。在github查询后找到了解决方法 问题解决 需要修改/apex-master/apex/amp/utils.py这个文件的代码 从93行开始修改 if x in cache:cached_x cache[x]next_functions_ava…

【UE Niagara】蓝图获取粒子数据

目录 效果 步骤 一、创建粒子 二、创建蓝图接收Niagara参数 效果 步骤 一、创建粒子 1. 新建一个Niagara发射器&#xff0c;使用Empty模板&#xff0c;打开后先添加“Spawn Rate”模块&#xff0c;这里设置粒子生成速率为0.7 在“Initialize Particle”模块中设置粒子颜色…

Linux中的符号链接和硬链接

ln -s 是在Linux系统中用来创建符号链接&#xff08;symbolic link&#xff09;的命令。符号链接也称为软链接&#xff0c;它是一个特殊的文件&#xff0c;对另一个文件或目录建立了一个符号连接&#xff0c;类似于Windows系统中的快捷方式。 ln -s 命令的作用&#xff1a; 创…

【PostgreSql】只删除整个数据库的表(不删除数据库)

目录 查询数据库所有的表&#xff08;假设表都在public模式下&#xff09;清空数据库下所有的表 环境&#xff1a;windows数据库&#xff1a;postgresql 前提&#xff1a; 此方法用来删除数据库所有的表&#xff0c;不包括保存的函数语句、查询语句等&#xff08;可适用于需要…

Eland上传bge-base-zh-v1.5向量化模型到ElasticSearch中

最近需要做一些向量检索&#xff0c;试试ES 一、准备 系统&#xff1a;MacOS 14.3.1 ElasticSearch&#xff1a;8.13.2 Kibana&#xff1a;8.13.2 本地单机环境&#xff0c;无集群&#xff0c;也不基于Docker BGE是一个常见的文本转向量的模型&#xff0c;在很多大模型RAG应…

MobX 中 runInAction 的威力:构建原子性状态更新

"原子性状态更新"这个词可以很好地概括 runInAction 的核心功能,即将一组相关的状态更新作为一个整体,要么全部成功,要么全部失败。这种特性对于复杂的异步操作和状态管理非常重要。可以帮助我们构建更加可靠和可预测的 React 应用程序。 怎么理解原子性操作 "…

华为OD技术面试-爬楼计数(动态规划)

背景 2024-03-16 华为od 技术面试&#xff0c;记录题目和模型 题目 分析 入门级的 动态规划算法&#xff0c;直接写就行了 缓存递归 代码 DZs {} def climbStairs(n):if n<0:return 0if DZs.get(n, 0)>0 :return DZs[n]if n2:jf 2elif n1:jf 1;else:jf1 climb…

Oozie工作流管理系统设计与实践:面试经验与必备知识点解析

本文将深入探讨Oozie的工作流设计、实践技巧,以及面试必备知识点与常见问题解析,助你在面试中展现出深厚的Oozie技术功底。 一、Oozie工作流管理系统基础 1.Oozie简介与安装配置简述Oozie的发展历程、主要功能、适用场景,以及如何下载、安装、配置Oozie(包括环境变量设置、…

vue2+codemirror实现在线编辑java代码(一 配置)

使用vue2+codemirror实现java代码回显和编辑功能。 效果图如下: 1、安装 vue-codemirror // 指定安装4.x版本 // 目前最新版本6.x,仅支持Vue3.0 npm i vue-codemirror@4.x --save// codemirror 需要与 vue-codemirror 同时安装 npm i codemirror@5.x --save 2、引入配置文…

javaee前后端交互

1.选择Java Enterprise创建项目 2.勾选Web Profile 3.项目名称 4.创建包和类 5.继承HttpServlet并重写方法doGet和doPost 6.在web.xml里添加代码 7.点击Add Configuration,进去后点击加号 8.选择选项 9.调整如图&#xff0c;后选择Deployment进入 10.点击加号选择第一个 11.…

练习4-10 找出最小值

本题要求编写程序&#xff0c;找出给定一系列整数中的最小值。 输入格式&#xff1a; 输入在一行中首先给出一个正整数n&#xff0c;之后是n个整数&#xff0c;其间以空格分隔。 输出格式&#xff1a; 在一行中按照“min 最小值”的格式输出n个整数中的最小值。 输入样例…

异常java

异常的两种处理方式 捕获异常&#xff0c;记录异常并响应合适的信息给用户捕获异常尝试重新修复 自定义运行时异常 定义一个异常类继承RunTimeException重写构造器通过throw new异常类&#xff08;xxx&#xff09;来创建异常对象并抛出 public class ExceptionTest2 { public…