赞
踩
在网络爬虫的领域中,动态表格是一种常见的数据展示形式,它可以显示大量的结构化数据,并提供分页、排序、筛选等功能。动态表格的数据通常是通过JavaScript或Ajax动态加载的,这给爬虫带来了一定的挑战。本文将介绍如何使用Selenium Python这一强大的自动化测试工具来爬取多个分页的动态表格,并进行数据整合和分析。
Selenium是一个开源的自动化测试框架,它可以模拟用户在浏览器中的操作,如点击、输入、滚动等,从而实现对网页的自动化测试或爬取。Selenium支持多种编程语言,如Java、Python、Ruby等,其中Python是最受欢迎的一种,因为它简洁、易用、灵活。Selenium Python提供了一个WebDriver API,它可以让我们通过Python代码控制不同的浏览器驱动,如Chrome、Firefox、Edge等,从而实现对不同网站和平台的爬取。
要爬取多个分页的动态表格,我们需要遵循以下几个步骤:
爬取多个分页的动态表格有以下几个特点:
为了具体说明如何使用Selenium Python爬取多个分页的动态表格并进行数据整合和分析,我们以一个实际的案例为例,爬取Selenium Easy网站上的一个表格示例,并对爬取到的数据进行简单的统计和绘图。
Selenium Easy是一个提供Selenium教程和示例的网站,它有一个表格演示页面,展示了一个有分页功能的动态表格,这个表格有15条记录,每个分页有5条记录,共有3个分页。每条记录包含了一个人的姓名、职位、办公室、年龄、入职日期和月薪。我们的目标是爬取这个表格中的所有数据,并对不同办公室的人数和月薪进行统计和绘图。
为了实现这个目标,我们需要用到以下几个库:
首先,我们需要导入这些库,并设置一些全局变量,如浏览器驱动路径、目标网站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的更多功能和应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。