在进行网页数据抓取时,分页是一个常见的挑战。很多网站将数据分布在多个页面上,因此,我们需要通过分页按钮来逐页获取数据。今天,我们将分享如何使用 Selenium 抓取分页数据,并将抓取结果保存到 CSV 文件。
本文将通过一个实际的例子来展示如何抓取大学排名网站的数据,数据包含排名、大学名称、省份和得分,并将其保存在本地的 CSV 文件中。
1. 项目背景
我们将使用上海排名网的大学排名数据作为抓取目标。这些数据分布在多个页面上,我们需要:
-
抓取多个页面的数据;
-
模拟点击“下一页”按钮来获取每一页的数据;
-
将抓取的数据保存为 CSV 格式。
2. 准备工作
首先,我们需要安装一些依赖库:
-
Selenium:用于自动化浏览器操作。
-
webdriver_manager:自动管理 WebDriver 的安装。
-
pandas:用于处理抓取到的数据并保存为 CSV 文件。
你可以使用以下命令安装这些库:
pip install selenium webdriver-manager pandas
3. 编写代码
以下是完整的代码,它可以抓取上海排名网(网站链接)上的大学排名数据,并将其保存为 CSV 文件。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import pandas as pd
import time
def get_university_rankings(pages=5):
chrome_options = Options()
chrome_options.add_argument('--headless') # 启动无头浏览器
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
# 启动浏览器
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
url = "https://www.shanghairanking.com/rankings/bcur/2025"
driver.get(url)
time.sleep(3) # 等待页面加载
all_data = []
for page in range(1, pages + 1):
print(f"抓取第 {page} 页")
time.sleep(2) # 等待页面稳定
# 获取每一页的数据
rows = driver.find_elements(By.CSS_SELECTOR, "table tbody tr")
for row in rows:
cols = row.find_elements(By.TAG_NAME, "td")
cols_text = [col.text.strip() for col in cols]
if len(cols_text) >= 4:
all_data.append(cols_text[:4]) # 只保存前四列(排名、大学名、省份、得分)
# 判断是否可以继续抓取下一页
try:
next_btn = driver.find_element(By.CSS_SELECTOR, 'li.ant-pagination-next a')
if 'ant-pagination-disabled' in next_btn.get_attribute('class'):
print("已是最后一页,停止抓取")
break
else:
next_btn.click() # 点击“下一页”按钮
time.sleep(3) # 等待下一页加载
except NoSuchElementException:
print("找不到分页按钮,停止抓取")
break
driver.quit()
if not all_data:
print("❌ 没抓到数据")
return
# 转换为 DataFrame
df = pd.DataFrame(all_data, columns=["Rank", "University", "Province", "Score"])
# 保存为 CSV 文件
df.to_csv("E:/university_ranking.csv", index=False, encoding="utf-8-sig")
print("✅ 抓取完成,保存到 E:/university_ranking.csv")
4. 常见问题与解决方法
-
页面加载过慢:如果页面加载较慢,可以调整
time.sleep()
的等待时间,确保每一页的内容加载完成后再进行抓取。 -
找不到“下一页”按钮:如果网页的分页按钮结构发生了变化,可能导致选择器失效。你可以通过检查网页源代码来确定正确的 CSS 选择器。
-
抓取不完整的数据:如果页面结构发生变化或网络问题,可能导致抓取的数据不完整。可以尝试在代码中加入更多的错误处理机制,确保每个步骤都能顺利执行。
5. 总结
通过 Selenium 和 Python,我们可以轻松地处理带分页的网页数据抓取问题。关键步骤包括:
-
使用
find_elements
获取每一页的表格数据。 -
模拟点击“下一页”按钮,抓取多页数据。
-
将数据保存为 CSV 文件,方便后续分析。
如果你对爬虫、数据抓取或自动化测试有兴趣,这篇博客提供了一个很好的入门示例。希望你能顺利抓取到你需要的数据,祝你编程愉快!求关注、点赞、收藏OVO。