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 By

driver = 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 clearfix bang_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进行web自动化时,可以通过操作鼠标来实现滚动页面。一种方法是使用JavaScript语言来控制滚动条的位置。例如,通过执行`document.documentElement.scrollTop=10000`可以将滚动滚动页面最底部,而执行`document.documentElement.scrollTop=0`则可以将滚动滚动页面最顶部。这种方法适用于具有滚动条id的网页。 另一种方法是使用JavaScript脚本来实现拖动滚动条到指定位置的功能。这种方法适用于没有滚动条id的网页。 通过以上两种方法,可以使用selenium来模拟鼠标滚动操作,以实现浏览网页内容的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅谈selenium如何应对网页内容需要鼠标滚动加载的问题](https://download.csdn.net/download/weixin_38720009/12854231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [selenium 模拟鼠标操作](https://blog.csdn.net/weixin_54542209/article/details/123282059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [selenium操作下拉滚动条方法汇总](https://blog.csdn.net/feiyu68/article/details/120928895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值