导言
网页抓取是一种强大的工具,它能帮助您从网站中提取数据,并将其用于多种用途。无论是为商业智能收集数据、追踪网站上的变化,还是构建自己的网络应用程序,它都能派上用场。本文将重点介绍如何使用 Python 抓取 JavaScript 表格。
什么是 JavaScript 表格?
JavaScript 表格是网页上展示表格数据的常见方式,在各类网站中随处可见。抓取这些表格可能颇具挑战性,因为数据通常以 JavaScript 对象的形式嵌入在页面源代码中,而非标准 HTML 表格中。不过,只要使用正确的工具和技术,就可以通过 Python 提取这些数据。
我们将首先配置必要的工具并安装所需的库。然后,我们将逐步演示如何使用 Python 和 WebDriver 加载网页并从表格中提取数据。最后,我们将探讨一些提高数据抓取效率和可靠性的方法,并解释为何在处理更复杂的任务时,使用专业的数据抓取工具可能更为合适。
设置
在开始使用 Python 抓取 JavaScript 表格之前,我们需要先满足以下两个先决条件:
- Python:本教程假设您的计算机上已安装 Python。如果尚未安装 Python,您可以从官方网站下载,并按照您所用操作系统的安装说明进行操作。
- WebDriver:为了使用 Python 加载网页并与之交互,我们需要使用 WebDriver。目前有多种选择,例如ChromeDriver、FirefoxDriver 和SafariDriver。在本教程中,我们将使用 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 表格是一种从网站提取数据并将其用于多种用途的强大方法。无论您是使用自写的代码还是专业的抓取工具,这项技术都能成为收集数据并获取洞察力的有力工具。




