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)
相关推荐
B站计算机毕业设计超人6 小时前
计算机毕业设计Python+Flask微博情感分析 微博舆情预测 微博爬虫 微博大数据 舆情分析系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI
爬虫·python·深度学习·算法·机器学习·自然语言处理·数据可视化
waterHBO8 小时前
python 爬虫 selenium 笔记
爬虫·python·selenium
chenjingming66616 小时前
windows使用tcpdump.exe工具进行抓包教程
网络·测试工具·tcpdump
bugtraq20211 天前
闲鱼网页版开放,爬虫的难度指数级降低。
爬虫
小码哥说测试1 天前
软件测试技术之 GPU 单元测试是什么!
自动化测试·功能测试·测试工具·jmeter·单元测试·集成测试·postman
Bigcrab__1 天前
Python3网络爬虫开发实战(15)Scrapy 框架的使用(第一版)
爬虫·python·scrapy
九月镇灵将1 天前
爬虫逆向学习(六):补环境过某数四代
爬虫·补环境·瑞数
kngines1 天前
【PLW004】基于Python网络爬虫与推荐算法的新闻推荐平台v1.0(Python+Django+NLP+Vue+MySQL前后端分离)
爬虫·python·nlp·推荐算法