返回博客
指南
安德烈·奥吉奥兰2023年4月24日阅读时间:7分钟

了解如何使用 Python 抓取 JavaScript 表

了解如何使用 Python 抓取 JavaScript 表

导言

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

什么是 JavaScript 表格?

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

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

设置

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

  • Python:本教程假设您的计算机上已安装 Python。如果尚未安装 Python,您可以从官方网站下载,并按照您所用操作系统的安装说明进行操作。
  • WebDriver:为了使用 Python 加载网页并与之交互,我们需要使用 WebDriver。目前有多种选择,例如ChromeDriverFirefoxDriverSafariDriver。在本教程中,我们将使用 ChromeDriver。

安装好 Python 和 WebDriver 后,您还需要安装以下库:

  • 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

接下来,我们将创建一个 WebDriver 实例,并使用它加载网页:

# 将“path/to/chromedriver”替换为您 ChromeDriver 可执行文件的路径

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

# 加载网页

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

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

步骤 2:提取数据

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

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

# 查找表格中的所有行

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

# 遍历每行,查找单元格并提取文本

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'))

# 使用 WebDriver 加载网页

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

# 抓取 JavaScript 生成的内容时,等待几秒钟非常重要

time.sleep(4)

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

# 遍历每一行,查找单元格并提取文本

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轮换和验证码绕过等额外功能,能够让抓取过程变得更加轻松和可靠。

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

摘要

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

关于作者
安德烈·奥吉奥兰,全栈开发工程师 @ WebScrapingAPI
安德烈-奥吉奥兰全栈开发工程师

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

开始构建

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

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