网络爬虫是一种强大的工具,它能帮助您从网站中提取数据,并将其用于多种用途。无论是为商业智能收集数据、追踪网站上的变化,还是构建您自己的网络应用程序,它都能胜任。本文将重点介绍如何使用 Python 爬取 JavaScript 表格。
简介
什么是 JavaScript 表格?
JavaScript表格是网页上展示表格数据的常见方式,在各类网站中随处可见。抓取这些表格可能颇具挑战性,因为数据通常以JavaScript对象的形式嵌入页面源代码中,而非标准HTML表格。不过,只要掌握正确的工具和技术,完全可以通过Python提取这些数据。
我们将首先配置必要的工具并安装所需的库。随后,我们将逐步演示如何使用 Python 和 WebDriver 加载网页并从表格中提取数据。最后,我们将探讨一些提高抓取效率和可靠性的方法,并解释为何在处理更复杂的任务时,使用专业的抓取工具可能更为合适。
准备工作
在开始使用 Python 抓取 JavaScript 表格之前,我们需要满足两个先决条件:
- Python:本教程假设您的计算机已安装 Python。若尚未安装,可从官方网站下载并按照您所用操作系统的安装指南进行操作。
- WebDriver:为了使用 Python 加载网页并进行交互,我们需要使用 WebDriver。可选方案包括 ChromeDriver、FirefoxDriver 和 SafariDriver 等。本教程将使用 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 Byimport time
接下来,我们将创建 Web 驱动程序的实例,并使用它加载网页:
# Replace "path/to/chromedriver" with the path to your ChromeDriver executable
driver = webdriver.Chrome(service=Service('path/to/chromedriver'))
# Load the webpagedriver.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 表格是从网站提取数据并将其用于多种目的的一种强有力方法。无论您是使用自己的代码还是专业抓取工具,这项技术都能成为收集数据并获取洞察力的宝贵工具。




