网页滚动功能实现
网页的滚动
如果需要对网页进行滑动操作,可以借助浏览器对象调用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)