如何从网站上抓取表格--Python 教程

方法, 蟒蛇, 搜索, 12-13-20245 分钟阅读

对于 Python 开发人员、数据分析师和任何从事数据集工作的人来说,网络搜刮已成为一项重要技能。说到结构化和丰富的数据,网站上的表格往往是信息的金矿。无论您是在网上搜索产品目录、体育统计数据还是财务数据,使用 Python 提取和保存表格数据的能力都是一种无价的工具。

这本实用指南将带你一步步完成使用 Python 从网站上刮擦表格的过程。到最后,您将知道如何使用requestsBeautiful Soup 甚至pandas等流行库访问表格数据,并将其存储为CSV 文件等可重复使用的格式。

先决条件

在我们进入技术细节之前,先来了解一下您需要了解的内容:

  • 确保系统已安装 Python。您可以从此处下载最新版本。
  • 所需图书馆:
    • requests-从网站获取 HTML 内容。这是用 Python 发送 HTTP 请求的常用软件包。
    • Beautiful Soup--解析 HTML 和 XML 文档的强大库。我们将用它从网页中提取特定元素。
    • pandas--Python 数据操作和分析的首选库。这将是我们存储提取的表格数据的最终目的地。

我们将使用pip 命令来安装所需的库。只需在终端运行以下命令即可完成安装:

pipinstall requestsbeautifulsoup4 pandas

表格搜索分步指南

步骤 1:了解网站结构

任何网络刮擦项目的第一步都是分析目标网站的结构。在本示例中,我们将从一个示例网站中抓取数据,该网站有一个显示曲棍球队排名的表格。下面是表格的预览:

下面是该表格在HTML 结构中的显示方式。

步骤 2:发送 HTTP 请求

第一步是获取要抓取的网页。我们将使用请求库发送 HTTP 请求,并从我们用来获取表格内容的虚拟网站中获取 HTML 内容

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
   print("Page fetched successfully!")
   html_content = response.text
else:
   print(f"Failed to fetch the page. Status code: {response.status_code}")
   exit()

步骤 3:从表格中提取数据

在 HTML 中,表格是以行和列的形式呈现数据的一种结构化方式,就像电子表格一样。创建表格使用 <table> 标签,其内容分为行 (<tr>)和细胞(<td> 数据单元格或 <th> 用于标题单元格)。下面是表格结构工作原理的简要说明:

  • 表: 内附 <table> 标记,它是所有行和单元格的容器。
  • 每个 <tr> (表格行)代表表格的一个水平切片。
  • 细胞 每行内 <td> 标记保存单个数据值(或 <th> 标头的标记)。
  • 属性:表格通常都有类ID 或其他属性,用于设计或标识它们。

例如,在本脚本中,我们找到了 <table> 标记的特定类别 (class="table"),并使用 美丽汤.这样我们就可以系统地提取数据,为分析或保存数据做好准备。

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
   print("No table found on the page!")
   exit()

第 4 步:将数据保存为 CSV 文件

在这一步中,我们将把提取的表格数据保存到CSV 文件中,以备将来使用,同时还将其显示为 pandas DataFrame,以便查看数据的结构。将数据保存为 CSV 文件后,您就可以在ExcelGoogle SheetsPython等工具中对其进行分析。

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
   cells = [cell.text.strip() for cell in row.find_all("td")]
   rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(f"Data saved to {csv_filename}")

运行这段代码时,pandas 会创建一个名为 scraped_table_data.csv 在你的工作目录中,提取的数据将打印在控制台中,如下所示:

          队名年份 胜负加时赛 输球 胜率 进球数 (GF) 失球数 (GA) + / -
0波士顿棕熊队1990 44 24 0.55 299 264 35
1水牛城军刀队1990 年 31 30 0.388 292 278 14
2卡尔加里火焰队1990 年 46 26 0.575 344 263 81
3芝加哥黑鹰队1990 49 23 0.613 284 211 73
4底特律红翼队1990 34 38 0.425 273 298 -25

完整代码抓取和保存表格数据

下面是完整的 Python 脚本,用于从网站上抓取表格数据、保存到 CSV 文件并显示提取的数据。该脚本将本指南中涉及的所有步骤整合为一个完整的工作流程。

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
    print("Page fetched successfully!")
    html_content = response.text
else:
    print(f"Failed to fetch the page. Status code: {response.status_code}")
    exit()

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
    print("No table found on the page!")
    exit()

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
    cells = [cell.text.strip() for cell in row.find_all("td")]
    rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(df.head())
print(f"Data saved to {csv_filename}")

结论

本指南将一步步引导您完成这一过程:了解网站结构、提取数据并保存数据以供分析。无论您是为研究建立数据集、自动收集数据,还是仅仅探索网络刮擦的可能性,掌握这些技术都将为您带来无限商机。

在刮擦时,您可能会遇到网站设置的 IP 禁止或速率限制等挑战。这时,代理就变得至关重要。代理可以让你

  • 绕过速率限制:旋转 IP 地址,避免因发送过多请求而被网站屏蔽。
  • 保持匿名性:通过掩盖真实 IP 地址来隐藏身份。
  • 访问地理限制数据:使用具有特定位置的代理来抓取特定地区的内容。

ProxyScrape提供各种代理服务器,包括 住宅代理服务器、 高级代理服务器、 专用代理服务器和 移动代理服务器, 专为网络搜刮量身定制。他们可靠且可扩展的代理解决方案可帮助您无中断地处理大型搜索项目,确保顺利高效地收集数据。