当前位置: 首页 > news >正文

Selenium网页的滚动

网页滚动功能实现

网页的滚动
如果需要对网页进行滑动操作,可以借助浏览器对象调用execute_script()方法来执行js语句,从而实现网页中的滚动下滑操作。

使用js语法实现网页滚动:

# 根据x轴和y轴的值来定向滚动对应数值的距离
window.scrollTo(横向x轴的值,竖向y轴的值)# 当前页面x轴的值为0,y轴移动到底部
window.scrollTo(0,document.body.scrollHeight)# 页面滚动到固定的位置
document.documentElement.scrollTop=数值

使用案例

import time
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://www.baidu.com')# 通过ID定位搜索框元素
input_element = driver.find_element(By.ID, 'kw')# 在搜索框中输入搜索内容
input_element.send_keys('美女')# 定位百度一下的按钮元素
button_element = driver.find_element(By.ID, 'su')# 对百度一下的按钮元素进行点击
button_element.click()# 滑动网页前需要等待一段时间,否则不会生效
time.sleep(2)# 利用js来滚动对应数值的距离
driver.execute_script('window.scrollTo(0,1000)')# 拖动滚动条至底部
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')# 拖动滚动条到指定位置
driver.execute_script('document.documentElement.scrollTop=6000')# 等待搜索结果加载完毕
time.sleep(3)

当当网图书页分析

采集当当图书网中的书籍的相关信息,其中主要筛选书名和价格。
网页链接:
http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1

网页分析:
如果想要抓取网站中的数据信息,需要先分析目标数据在网页中的展示方式。因为不同的网站的数据展
示方式不同,且相同网站的不同网页数据的展示方式也不尽相同,所以需要先确定具体情况。

网页中的数据要么是直接存放在 HTML 代码中,这种通过 XPath、正则表达式等方式可以筛选获取数
据。要么就是通过 Js 发送请求来展示数据的,这种就需要查找调用的 Js 接口,使用 JsonPath 筛选数
据。

判断方式可以通过Network(网络)中的Preview(预览)来查看是否有目标数据,如果有则代表数
据存放在 HTML 代码中,否则数据一般是在 Js 接口中。

滑动加载
在网页中加载大量数据时,网站为了提高网页的相应速度一般都会对数据进行分段加载,打开的网页只
会展示一部分数据信息,如果用户继续向下滑动页面,才会加载剩余的数据信息,从而提高用户的体
验。如果进入网页后直接使用 XPath 提取数据无法获取一页中的全部数据内容,就可以在 Selenium 中
模仿页面的滚动下滑操作,以保证抓取到当前网页中的全部图书信息。

当当图书单页抓取

import json
import time # 延迟模块
from lxml import etree # 解析html
from selenium import webdriver # 导入selenium# 1、创建浏览器对象并打开对应网页
driver = webdriver.Chrome()
driver.get('http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1')# 2、设置浏览器窗口最大化,并延时等待数据加载完毕
driver.maximize_window()
time.sleep(2)# 3、设置滚动次数来模拟人的动作
for i in range(1, 4):# 滚动一次停留1秒time.sleep(1)# 每次循环滚动1000的距离driver.execute_script(f'document.documentElement.scrollTop={i * 1000}')# 4、获取当前页面的html代码
str_data = driver.page_source# 5、解析网页,筛选所有图书的元素节点
html = etree.HTML(str_data)
data_list = html.xpath('//ul[@class="bang_list clearfix bang_list_mode"]/li')# 6、遍历每本图书的标签信息
for data in data_list:# 从图书的标签中获取图书名字book_name = data.xpath('./div[@class="name"]/a/text()')[0]# 从图书的标签中获取图书价格book_price = data.xpath('./div[@class="price"]/p/span[@class="price_n"]/text()')[0]print(f'书名:{book_name} 价格:{book_price}')# 7、将书籍信息打包成一个字典数据book_dict = {'name': book_name, 'price': book_price}# 8、创建json文件来保存抓取到的图书数据with open('当当图书.json', 'a', encoding='utf-8') as file:# 将字典数据转换为json字符串,且中文不进行转码json_data = json.dumps(book_dict, ensure_ascii=False) + ',\n'# 将json数据写入到文件中file.write(json_data)time.sleep(3)

当当图书分页抓取

抓取一页数据后开始进行翻页,从而获取下一页的数据信息

import json
import time # 延迟模块
from lxml import etree # 解析html
from selenium import webdriver # 导入selenium
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options# 1、输入抓取书籍的页数
pages = int(input('请输入抓取的图书页数:'))# 2、创建浏览器对象设置无界面模式,并打开对应的网页
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get('http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1')# 3、浏览器窗口最大化,并延时等待网页加载完毕
driver.maximize_window()
time.sleep(2)# 4、循环遍历抓取的页数
for i in range(pages):# 5、设置滚动次数来模拟人的动作for n in range(1, 4):# 滚动一次停留1秒time.sleep(1)# 每次循环滚动1000的距离driver.execute_script(f'document.documentElement.scrollTop={n * 1000}')# 6、获取当前页面的html代码str_data = driver.page_source# 7、解析网页,筛选图片元素节点html = etree.HTML(str_data)data_list = html.xpath('//ul[@class="bang_list clearfixbang_list_mode"]/li')# 8、遍历每本图片的标签信息for data in data_list:# 从图书的标签中获取图书名字book_name = data.xpath('./div[@class="name"]/a/text()')[0]# 从图书的标签中获取图书价格book_price =data.xpath('./div[@class="price"]/p/span[@class="price_n"]/text()')[0]print(f'书名:{book_name} 价格:{book_price}')# 9、将书籍信息打包成一个字典数据book_dict = {'name': book_name, 'price': book_price}# 10、创建json文件来保存抓取到的图书数据with open('当当图书.json', 'a', encoding='utf-8') as file:# 将字典数据转换为json字符串,且中文不进行转码json_data = json.dumps(book_dict, ensure_ascii=False) + ',\n'# 将json数据写入到文件中file.write(json_data)# 11、定位翻页标签,并点击该标签来实现翻页功能element = driver.find_element(By.XPATH,'//li[@class="next"]/a')element.click()# 12、翻页后等待3秒time.sleep(3)

相关文章:

Selenium网页的滚动

网页滚动功能实现 网页的滚动 如果需要对网页进行滑动操作,可以借助浏览器对象调用execute_script()方法来执行js语句,从而实现网页中的滚动下滑操作。 使用js语法实现网页滚动: # 根据x轴和y轴的值来定向滚动对应数值的距离 window.scrol…...

图算法系列1: 图算法的分类有哪些?(上)

大约在公元9世纪上半叶,来自中亚古国花剌子模的波斯数学家花剌子米(al-Khwarizmi)先后出版了两本对数学界有深远影响的书籍《印度数字算术》与《代数学》​,前者在12世纪被翻译为拉丁文传入欧洲,十进制也因此传入欧洲,最终所形成的…...

零样本学习——从多语言语料库数据中对未学习语言进行语音识别的创新技术

引言 在全球众多的语言中,只有极少数的语言在语音识别领域取得了显著的进展。这种不平衡现象的主要原因是,现有的语音识别模型往往依赖于大量的标注语音数据,而这些数据对于许多语言来说难以获得。 近年来,尽管语音识别技术取得…...

ViewStub的原理

**ViewStub是Android开发中的一个轻量级控件,主要用于懒加载布局以提高应用程序的性能和响应速度。**其原理和工作方式如下: 定义与特点 轻量级与不可见:ViewStub是一个不可见的、不占布局位置的轻量级View,它在初始化时不会实例…...

十一、Spring AOP

十一、Spring AOP 1. AOP概述2. Spring AOP快速⼊⻔2.1 引⼊AOP依赖2.2 编写AOP程序 3. Spring AOP 详解3.1 Spring AOP核⼼概念3.1.1 切点(Pointcut) Around 哪个包3.1.2 连接点(Join Point) 包下面的方法3.1.3 通知(Advice) 就是要执行的方法3.1.4 切⾯(Aspect) 3.2 通知类型…...

【网络】IP的路径选择——路由控制

目录 路由控制表 默认路由 主机路由 本地环回地址 路由控制表的聚合 网络分层 个人主页:东洛的克莱斯韦克-CSDN博客 路由控制表 在数据通信中,IP地址作为网络层的标识,用于指定数据包的目标位置。然而,仅有IP地址并不足以确…...

Unity动画模块 之 2D IK(反向动力学)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​ 1.什么是IK 反向动力学 IK(Inverse Kinematics)是一种方法,可以根据某些子关节的最…...

关于kickstart自动安装脚本以及dhcp的设置

我将在rhel7.9内进行本次实验,需要安装并启动图形界面 hostnamectl查看是否有图形界面 没有的话 可以使用yum group list 查看,并安装server with GUI yum group install "server with GUI" -y安装完成后可以使用init 5启动 安装kickstart自…...

AWS云服务器选择最佳区域

2024年,随着全球云计算的持续发展和AWS在全球不断扩展的数据中心网络,选择合适的AWS云服务器区域成为了企业和开发者需要认真考虑的问题。九河云告诉你在做出选择之前,需要考虑以哪些关键因素: 地理位置和用户分布 选择AWS云服务…...

Unity Android端截图保存并获取展示

截屏保存方法 public static IEnumerator ScreenShot(string filePath, string fileName){yield return new WaitForEndOfFrame();Rect rect new Rect(0, 0, Screen.width, Screen.height);Texture2D screenShot new Texture2D(Screen.width, Screen.height, TextureFormat.R…...

linux高级编程——文件IO

linux高级编程——文件IO 标准IO:stdio.h 标准IO:stdio.h IO也就是输入input和输出output; I: 键盘是标准输入设备,默认输入就是指键盘 /dev/input; O: 显示器是标准输出设备,默认输…...

windows C++-在 C++/WinRT 中使用委托处理事件(下)

撤销已注册的委托 当你注册委托时,通常会向你返回一个令牌。 随后,可以使用该令牌撤销委托;这意味着将从事件取消注册委托,再次引发该事件时不会调用该委托。 为简单起见,上面的代码示例都没有介绍如何执行该操作。 …...

【实用工具】Stirling-PDF: 优质开源的PDF处理工具/编辑工具-含入门安装教程

文章目录 项目简介功能展示Page Operations 页面操作Conversion Operations 转换操作Security & Permissions 安全与权限Other Operations 其他业务 如何安装并使用Docker RunDocker Compose 项目简介 这是一款使用 Docker 的基于本地托管网络的强大 PDF 操作工具。它能让…...

opencv 深度图视差图可视化案例

参考:https://www.cnblogs.com/zyly/p/9373991.html(图片这里面下载的) https://blog.csdn.net/He3he3he/article/details/101053457 原理 双目摄像头 视差公式: 三角形对应推算 深度距离转换: 这里d是视差Disparity 代码 下面两种计算视差方法: import os impor…...

Golang | Leetcode Golang题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; func minPatches(nums []int, n int) (patches int) {for i, x : 0, 1; x < n; {if i < len(nums) && nums[i] < x {x nums[i]i} else {x * 2patches}}return }...

算法训练(leetcode)第五十二天 | Bellman_ford 队列优化算法(SPFA)、BF算法判断负回路、BF之单源有限最短路(有负回路)

刷题记录 94. 城市间货物运输 I-Bellman_ford 队列优化算法&#xff08;SPFA&#xff09;95. 城市间货物运输 II-BF算法判断负回路96. 城市间货物运输 III-BF之单源有限最短路(有负回路) 94. 城市间货物运输 I-Bellman_ford 队列优化算法&#xff08;SPFA&#xff09; 题目地址…...

SpringBoot中整合RabbitMQ(测试+部署上线 最完整)

一、RabbitMQ安装 由于在测试环境中&#xff0c;我们现在虚拟机上基于docker安装mq docker run \-e RABBITMQ_DEFAULT_USERquick \-e RABBITMQ_DEFAULT_PASS123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network your-net\-d \r…...

算法板子:线性DP——算出三角形中的最大路径值、求最长上升子序列、求最长公共子序列

目录 一、数字三角形——算出三角形中的最大路径值 二、最长上升子序列——求一个数组中的最长递增子序列 三、最长公共子序列——求两个字符串中的最长公共子序列 一、数字三角形——算出三角形中的最大路径值 #include <iostream> using namespace std;const int N …...

【C++】值传递

函数值传递的特点&#xff1a;值传递过程中即使形参改变也不会改变实参 没有返回值的函数用“ void ”定义 下面是一个实例&#xff1a; #include<iostream> using namespace std;//值传递 //定义函数&#xff0c;实现两个数字进行交换函数//如果函数不需要返回值&…...

工业三防平板助力MES系统打造工厂移动式生产管理

随着工业4.0时代的到来&#xff0c;智能制造、数字化车间等概念层出不穷&#xff0c;生产过程的可视化管理也成为了企业提升效率、优化生产的关键。而工业三防平板&#xff0c;凭借其坚固耐用、功能强大、便携易用等特性&#xff0c;成为了实现生产过程可视化管理的重要利器&am…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...