如何使用Selenium Python爬取多个分页的动态表格并进行数据整合和分析

简介: 在网络爬虫的领域中,动态表格是一种常见的数据展示形式,它可以显示大量的结构化数据,并提供分页、排序、筛选等功能。动态表格的数据通常是通过JavaScript或Ajax动态加载的,这给爬虫带来了一定的挑战。本文将介绍如何使用Selenium Python这一强大的自动化测试工具来爬取多个分页的动态表格,并进行数据整合和分析。

亿牛云代理.png

导语

在网络爬虫的领域中,动态表格是一种常见的数据展示形式,它可以显示大量的结构化数据,并提供分页、排序、筛选等功能。动态表格的数据通常是通过JavaScript或Ajax动态加载的,这给爬虫带来了一定的挑战。本文将介绍如何使用Selenium Python这一强大的自动化测试工具来爬取多个分页的动态表格,并进行数据整合和分析。

正文

Selenium Python简介

Selenium是一个开源的自动化测试框架,它可以模拟用户在浏览器中的操作,如点击、输入、滚动等,从而实现对网页的自动化测试或爬取。Selenium支持多种编程语言,如Java、Python、Ruby等,其中Python是最受欢迎的一种,因为它简洁、易用、灵活。Selenium Python提供了一个WebDriver API,它可以让我们通过Python代码控制不同的浏览器驱动,如Chrome、Firefox、Edge等,从而实现对不同网站和平台的爬取。

动态表格爬取步骤

要爬取多个分页的动态表格,我们需要遵循以下几个步骤:

  1. 找到目标网站和目标表格。我们需要确定我们要爬取的网站和表格的URL,并用Selenium Python打开它们。
  2. 定位表格元素和分页元素。我们需要用Selenium Python提供的各种定位方法,如find_element_by_id、find_element_by_xpath等,来找到表格元素和分页元素,并获取它们的属性和文本。
  3. 爬取表格数据和翻页操作。我们需要用Selenium Python提供的各种操作方法,如click、send_keys等,来模拟用户在表格中翻页,并用BeautifulSoup等库来解析表格数据,并存储到列表或字典中。
  4. 数据整合和分析。我们需要用Pandas等库来对爬取到的数据进行整合和分析,并用Matplotlib等库来进行数据可视化和展示。

动态表格爬取特点

爬取多个分页的动态表格有以下几个特点:

  • 需要处理动态加载和异步请求。动态表格的数据通常是通过JavaScript或Ajax动态加载的,这意味着我们需要等待页面完全加载后才能获取到数据,或者使用Selenium Python提供的显式等待或隐式等待方法来设置超时时间。
  • 需要处理分页逻辑和翻页规则。动态表格通常有多个分页,每个分页有不同数量的数据,我们需要根据分页元素来判断当前所在的分页,并根据翻页规则来选择下一个分页。有些网站可能使用数字按钮来表示分页,有些网站可能使用上一页和下一页按钮来表示分页,有些网站可能使用省略号或更多按钮来表示分页,我们需要根据不同情况来选择合适的翻页方法。
  • 需要处理异常情况和错误处理。在爬取过程中,可能会遇到各种异常情况和错误,如网络中断、页面跳转、元素丢失等,我们需要用Selenium Python提供的异常处理方法来捕获和处理这些异常,并设置重试机制和日志记录。

案例

为了具体说明如何使用Selenium Python爬取多个分页的动态表格并进行数据整合和分析,我们以一个实际的案例为例,爬取Selenium Easy网站上的一个表格示例,并对爬取到的数据进行简单的统计和绘图。

网站和表格介绍

Selenium Easy是一个提供Selenium教程和示例的网站,它有一个表格演示页面,展示了一个有分页功能的动态表格,这个表格有15条记录,每个分页有5条记录,共有3个分页。每条记录包含了一个人的姓名、职位、办公室、年龄、入职日期和月薪。我们的目标是爬取这个表格中的所有数据,并对不同办公室的人数和月薪进行统计和绘图。

代码实现

为了实现这个目标,我们需要用到以下几个库:

  • selenium:用于控制浏览器驱动和模拟用户操作
  • requests:用于发送HTTP请求和获取响应
  • BeautifulSoup:用于解析HTML文档和提取数据
  • pandas:用于处理数据结构和分析
  • matplotlib:用于绘制数据图表

首先,我们需要导入这些库,并设置一些全局变量,如浏览器驱动路径、目标网站URL、代理服务器信息等:

# 导入库
import requests
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt

# 设置浏览器驱动路径
driver_path = r'/Users/weaabduljamac/Downloads/chromedriver'

# 设置目标网站URL
url = 'https://demo.seleniumeasy.com/table-pagination-demo.html'

# 亿牛云 爬虫代理加强版 设置代理服务器信息
proxyHost = "www.16yun.cn"
proxyPort = "3111"
proxyUser = "16YUN"
proxyPass = "16IP"

接下来,我们需要创建一个浏览器驱动对象,并设置代理服务器参数,然后打开目标网站:

# 创建浏览器驱动对象
driver = webdriver.Chrome(driver_path)

# 设置代理服务器参数
options = webdriver.ChromeOptions()
options.add_argument(f'--proxy-server=http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}')

# 打开目标网站
driver.get(url)

然后,我们需要定位表格元素和分页元素,并获取它们的属性和文本:

# 定位表格元素
table = driver.find_element_by_xpath('//*[@id="myTable"]')

# 定位分页元素
pagination = driver.find_element_by_xpath('//*[@id="myPager"]')

# 获取分页元素的文本
pagination_text = pagination.text

# 获取分页元素的链接列表
pagination_links = pagination.find_elements_by_tag_name('a')

接着,我们需要创建一个空列表来存储爬取到的数据,并创建一个循环来遍历每个分页,并爬取每个分页中的表格数据:

# 创建一个空列表来存储爬取到的数据
data = []

# 创建一个循环来遍历每个分页
for i in range(len(pagination_links)):
    # 获取当前分页元素的文本
    current_page_text = pagination_links[i].text

    # 判断当前分页元素是否是数字按钮或更多按钮(省略号)
    if current_page_text.isdigit() or current_page_text == '...':
        # 点击当前分页元素
        pagination_links[i].click()

        # 等待页面加载完成(可以使用显式等待或隐式等待方法来优化)
        driver.implicitly_wait(10)

        # 重新定位表格元素(因为页面刷新后原来的元素可能失效)
        table = driver.find_element_by_xpath('//*[@id="myTable"]')
        # 解析表格元素的HTML文档
        soup = BeautifulSoup(table.get_attribute('innerHTML'), 'html.parser')

        # 提取表格元素中的每一行数据
        rows = soup.find_all('tr')

        # 遍历每一行数据
        for row in rows:
            # 提取每一行数据中的每一列数据
            cols = row.find_all('td')

             # 判断每一列数据是否为空(因为表头行没有数据)
            if len(cols) > 0:
                # 获取每一列数据的文本
                name = cols[0].text
                position = cols[1].text
                office = cols[2].text
                age = cols[3].text
                start_date = cols[4].text
                salary = cols[5].text

                # 将每一列数据组合成一个字典
                record = {
   
   
                  'name': name,
                  'position': position,
                  'office': office,
                  'age': age,
                  'start_date': start_date,
                  'salary': salary
                 }

                # 将字典添加到列表中
                data.append(record)

     # 判断当前分页元素是否是上一页或下一页按钮
    elif current_page_text == 'Prev' or current_page_text == 'Next':
        # 点击当前分页元素
        pagination_links[i].click()

        # 等待页面加载完成(可以使用显式等待或隐式等待方法来优化)
        driver.implicitly_wait(10)

        # 重新定位分页元素(因为页面刷新后原来的元素可能失效)
        pagination = driver.find_element_by_xpath('//*[@id="myPager"]')

        # 重新获取分页元素的链接列表(因为页面刷新后原来的链接可能变化)
        pagination_links = pagination.find_elements_by_tag_name('a')

最后,我们需要用Pandas等库来对爬取到的数据进行整合和分析,并用Matplotlib等库来进行数据可视化和展示:

# 关闭浏览器驱动对象
driver.quit()

# 将列表转换为Pandas数据框
df = pd.DataFrame(data)

# 查看数据框的基本信息
print(df.info())

# 查看数据框的前五行
print(df.head())

# 对不同办公室的人数进行统计和分组
office_count = df.groupby('office')['name'].count()

# 对不同办公室的月薪进行统计和分组(注意月薪需要去掉货币符号和逗号,并转换为数值类型)
office_salary = df.groupby('office')['salary'].apply(lambda x: x.str.replace('$', '').str.replace(',', '').astype(float).sum())

# 绘制不同办公室的人数和月薪的柱状图
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
office_count.plot.bar(ax=ax[0], title='Number of Employees by Office')
office_salary.plot.bar(ax=ax[1], title='Total Salary by Office')
plt.show()

结语

本文介绍了如何使用Selenium Python爬取多个分页的动态表格,并进行数据整合和分析。通过这个案例,我们可以学习到Selenium Python的基本用法和特点,以及如何处理动态加载和异步请求、分页逻辑和翻页规则、异常情况和错误处理等问题。Selenium Python是一个强大而灵活的自动化测试工具,它可以帮助我们实现对各种网站和平台的爬取,从而获取有价值的数据和信息。希望本文能对你有所帮助和启发,欢迎你继续探索Selenium Python的更多功能和应用。

相关文章
|
10月前
|
SQL 自然语言处理 数据库
【Azure Developer】分享两段Python代码处理表格(CSV格式)数据 : 根据每列的内容生成SQL语句
本文介绍了使用Python Pandas处理数据收集任务中格式不统一的问题。针对两种情况:服务名对应多人拥有状态(1/0表示),以及服务名与人名重复列的情况,分别采用双层for循环和字典数据结构实现数据转换,最终生成Name对应的Services列表(逗号分隔)。此方法高效解决大量数据的人工处理难题,减少错误并提升效率。文中附带代码示例及执行结果截图,便于理解和实践。
267 5
|
8月前
|
数据采集 Web App开发 JavaScript
基于Selenium的Python爬虫抓取动态App图片
基于Selenium的Python爬虫抓取动态App图片
576 68
|
数据处理 索引 Python
用Python实现数据录入、追加、数据校验并生成表格
本示例展示了如何使用Python和Pandas库实现学生期末考试成绩的数据录入、追加和校验,并生成Excel表格。首先通过`pip install pandas openpyxl`安装所需库,然后定义列名、检查并读取现有数据、用户输入数据、数据校验及保存至Excel文件。程序支持成绩范围验证,确保数据准确性。
538 14
|
8月前
|
存储 机器学习/深度学习 人工智能
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
本文探讨了多模态RAG系统的最优实现方案,通过模态特定处理与后期融合技术,在性能、准确性和复杂度间达成平衡。系统包含文档分割、内容提取、HTML转换、语义分块及向量化存储五大模块,有效保留结构和关系信息。相比传统方法,该方案显著提升了复杂查询的检索精度(+23%),并支持灵活升级。文章还介绍了查询处理机制与优势对比,为构建高效多模态RAG系统提供了实践指导。
2161 0
多模态RAG实战指南:完整Python代码实现AI同时理解图片、表格和文本
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
757 4
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
362 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
11月前
|
算法 机器人 Python
使用Selenium和ChromeDriver模拟用户操作:从表单填写到数据提交
简介:工程师小王和产品经理莉莉面临无人机市场调研投票数据获取难题,传统方法屡遭封禁。小王通过构建“隐身特工”装备——代理IP、随机UserAgent及有效Cookie,结合Python与Selenium技术,成功绕过问卷星的防刷票系统,实现自动化投票。最终,他们获得了看似真人投票的数据,展示了技术攻防的艺术。这段故事不仅是一场技术较量,更是对算法规则游戏的深刻思考。
247 2
使用Selenium和ChromeDriver模拟用户操作:从表单填写到数据提交
|
11月前
|
Web App开发 数据采集 数据安全/隐私保护
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
Selenium库详解:Python实现模拟登录与反爬限制的进阶指南
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
数据采集 Python
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态
本文介绍了使用Python Selenium和WebDriver库抓取LinkedIn数据的方法。首先,安装Selenium库和对应的WebDriver,然后配置爬虫代理IP以避免频繁请求被检测。接下来,设置user-agent和cookies以模拟真实用户行为,实现登录并保持状态。登录后,使用WebDriver抓取目标页面数据,如用户名、年龄、性别和简历信息。最后,强调了优化代码、处理异常和遵守使用条款的重要性,以提高效率并避免账号被封禁。
578 2
如何用Python Selenium和WebDriver抓取LinkedIn数据并保存登录状态

推荐镜像

更多