Selenium网页的滚动

网页滚动功能实现

网页的滚动

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

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

python 复制代码
# 根据x轴和y轴的值来定向滚动对应数值的距离
window.scrollTo(横向x轴的值,竖向y轴的值)

# 当前页面x轴的值为0,y轴移动到底部
window.scrollTo(0,document.body.scrollHeight)

# 页面滚动到固定的位置
document.documentElement.scrollTop=数值

使用案例

python 复制代码
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 中

模仿页面的滚动下滑操作,以保证抓取到当前网页中的全部图书信息。

当当图书单页抓取

python 复制代码
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)

当当图书分页抓取

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

python 复制代码
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)
相关推荐
ac-er88884 分钟前
PHP网络爬虫常见的反爬策略
开发语言·爬虫·php
测试19981 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
代码欢乐豆2 小时前
数据采集之selenium模拟登录
python·selenium·测试工具
聪明的墨菲特i3 小时前
Python爬虫学习
爬虫·python·学习
oliveira-time5 小时前
爬虫学习6
爬虫
测试杂货铺5 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
小码哥说测试7 小时前
接口测试用例设计的关键步骤与技巧解析!
自动化测试·测试工具·jmeter·职场和发展·测试用例·接口测试·postman
xiaoxiongip66610 小时前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
兆。12 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
小白学大数据13 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin