返回博客
指南
Andrei OgiolanLast updated on Mar 31, 20262 min read

了解如何使用 Python 抓取 JavaScript 表格

了解如何使用 Python 抓取 JavaScript 表格

简介

网络爬虫是一种强大的工具,它能帮助您从网站中提取数据,并将其用于多种用途。无论是为商业智能收集数据、追踪网站上的变化,还是构建您自己的网络应用程序,它都能胜任。本文将重点介绍如何使用 Python 爬取 JavaScript 表格。

什么是 JavaScript 表格?

JavaScript表格是网页上展示表格数据的常见方式,在各类网站中随处可见。抓取这些表格可能颇具挑战性,因为数据通常以JavaScript对象的形式嵌入页面源代码中,而非标准HTML表格。不过,只要掌握正确的工具和技术,完全可以通过Python提取这些数据。

我们将首先配置必要的工具并安装所需的库。随后,我们将逐步演示如何使用 Python 和 WebDriver 加载网页并从表格中提取数据。最后,我们将探讨一些提高抓取效率和可靠性的方法,并解释为何在处理更复杂的任务时,使用专业的抓取工具可能更为合适。

准备工作

在开始使用 Python 抓取 JavaScript 表格之前,我们需要满足两个先决条件:

  • Python:本教程假设您的计算机已安装 Python。若尚未安装,可从官方网站下载并按照您所用操作系统的安装指南进行操作。
  • WebDriver:为了使用 Python 加载网页并进行交互,我们需要使用 WebDriver。可选方案包括 ChromeDriverFirefoxDriverSafariDriver 等。本教程将使用 ChromeDriver。

安装好 Python 和 Web 驱动程序后,您还需要安装以下库:

  • Selenium:Selenium 是一个允许您通过 Python 控制网页浏览器的库。我们将使用它来加载包含表格的网页并与之交互。对于 JavaScript 表格,使用 Selenium 这样的库而非 Python requests 非常重要,因为您可以等待由 JavaScript 生成的元素在页面上出现,以防网页加载时该元素尚未存在。
  • Pandas:Pandas 是一个为 Python 提供易于使用的数据结构和数据分析工具的库。我们将使用它来存储和处理从表格中提取的数据。

要安装这些库,请打开终端或命令提示符,并使用 pip 命令进行安装:

$ pip install selenium pandas

就这样!现在您可以开始使用 Python 抓取 JavaScript 表格了。在下一节中,我们将逐步演示整个过程。

开始抓取

既然所有必要的工具都已安装完毕,现在是时候开始使用 Python 抓取 JavaScript 表格了。该过程包括以下步骤

  • 使用 Selenium 和 WebDriver 加载包含表格的网页。
  • 使用 Selenium 和 Python 从表格中提取数据。
  • 使用 Pandas 存储和处理数据。

让我们更详细地逐一讲解这些步骤:

步骤 1:加载网页

首先,我们需要加载包含待抓取表格的网页。我们可以使用 Selenium 和 WebDriver 来完成此操作。

首先,导入必要的库:

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

import time

接下来,我们将创建 Web 驱动程序的实例,并使用它加载网页:

# Replace "path/to/chromedriver" with the path to your ChromeDriver executable

driver = webdriver.Chrome(service=Service('path/to/chromedriver'))

# Load the webpage

driver.get('https://html.com/tags/table/')

需要注意的是,在从表格中提取数据之前,网页必须完全加载完毕。您可能需要使用 driver.implicitly_wait() 函数等待页面加载完成,或者使用 driver.find_element(By.*, ‘’) 函数等待页面上的特定元素加载完毕。

步骤 2:提取数据

网页加载完成后,我们可以使用 Selenium 从表格中提取数据。实现方法有多种,其中一种是使用 driver.find_elements(By.CSS_SELECTOR, ‘td’) 函数定位表格中的单元格,并提取每个单元格中的文本。

以下是一个从两列简单表格中提取数据的示例:

# Find all of the rows in the table

rows = driver.find_elements(By.CSS_SELECTOR, 'table tr')

# For each row, find the cells and extract the text

for row in rows:

    try:

        cells = row.find_elements(By.CSS_SELECTOR, 'td') or row.find_elements(By.CSS_SELECTOR, 'th')

    except:

        continue

    for cel in cells:

        print(cel.text, end= " ")

    print()

driver.quit()

请注意,根据表格的结构及其包含的元素,您可能需要使用不同的 CSS 选择器。您可以使用浏览器的开发者工具检查页面,从而找到合适的选择器。

步骤 3:存储和处理数据

从表格中提取数据后,您可以将其存储在 Pandas 数据框中,并根据需要进行处理。以下是一个操作示例:

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

import time

import pandas as pd

df = pd.DataFrame()

driver = webdriver.Chrome(service=Service('/path/to/chromedriver'))

# Use the webdriver to load a webpage

driver.get('https://html.com/tags/table/')

# When scraping JavaScript generated content it is important to wait a few seconds

time.sleep(4)

table = driver.find_element(By.CSS_SELECTOR, 'table')

# For each row, find the cells and extract the text

df = pd.read_html(table.get_attribute('outerHTML'))

print(df)

driver.close()

深入探讨

虽然上述步骤已能让你使用 Python 抓取 JavaScript 表格,但仍有几种方法可以提高该过程的效率和可靠性。

提高效率的一种方法是使用无头浏览器,即在后台运行且不显示图形界面的浏览器。这比运行完整浏览器更快,且对系统资源的消耗更小。若要在 Selenium 中使用无头浏览器,可在创建 WebDriver 实例时使用 --headless 参数。

另一种提高效率的方法是使用提供轮换 IP 地址的服务,例如代理服务器。由于每次请求的 IP 地址看似都在变化,这有助于避免被网站识别为爬虫并遭到封禁。 WebScrapingAPI 是一项支持通过代理服务器抓取网站的服务。若想进一步了解如何在网页抓取中使用代理,欢迎查阅我们的文档

若要在 Selenium 中使用代理服务器,我强烈建议您使用 selenium-wire,因为在连接代理服务器方面,它比原生 Selenium 更直观。与其他 Python 包一样,您只需运行以下命令即可安装:

$ pip install selenium-wire

随后,您可以参考以下代码示例,在 Selenium 中使用代理服务器:

from seleniumwire import webdriver

from selenium.webdriver.chrome.service import Service

import time

# Create a webdriver instance with the desired proxy server and authentication details

API_KEY = '<YOUR-API-KEY-HERE>'

options = {

    'proxy': {

        'http': f'http://webscrapingapi:{API_KEY}@proxy.webscrapingapi.com:80',

        'https': f'https://webscrapingapi:{API_KEY}@proxy.webscrapingapi.com:80',

        'no_proxy': 'localhost,127.0.0.1'

    }

}

driver = webdriver.Chrome(service=Service('/path/to/chromedriver'), seleniumwire_options=options)

# Use the webdriver to load a webpage

driver.get('http://httpbin.org/ip')

# When scraping JavaScript generated content it is important to wait a few seconds

time.sleep(5)

# Do something with the page, such as extract data or take a screenshot

# ...

# Close the webdriver

driver.quit()

虽然这些技巧有助于提高网页抓取的效率和可靠性,但需要注意的是,它们已超出本文的讨论范围。对于更复杂的抓取任务,使用专业的抓取工具(如 WebScrapingAPI)可能更为高效可靠。该工具提供了 IP 轮换和 CAPTCHA 绕过等额外功能,能让抓取过程变得更加轻松且可靠。

在下一节中,我们将总结使用 Python 抓取 JavaScript 表格的步骤,并探讨在处理更复杂的任务时使用专业抓取工具的优势。

总结

总而言之,使用 Python 抓取 JavaScript 表格是从网站提取数据并将其用于多种目的的一种强有力方法。无论您是使用自己的代码还是专业抓取工具,这项技术都能成为收集数据并获取洞察力的宝贵工具。

关于作者
Andrei Ogiolan, 全栈开发工程师 @ WebScrapingAPI
Andrei Ogiolan全栈开发工程师

安德烈·奥吉奥兰(Andrei Ogiolan)是 WebScrapingAPI 的全栈开发工程师,他在产品各领域均有贡献,并协助为该平台构建可靠的工具和功能。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。