网络抓取是使用软件工具和脚本自动从网站提取数据的过程。由于其强大的网络自动化功能,Selenium 是最流行的网络抓取工具之一。在本综合指南中,我们将使用 Python 探索使用 Selenium 进行网页抓取。
网页抓取概述
在深入研究 Selenium 之前,我们首先了解什么是网页抓取以及为什么使用它。
网页抓取是指通过脚本和机器人自动从网站收集数据的技术,而不是手动复制粘贴。然后将抓取的数据结构化并存储在数据库或电子表格中以供进一步分析。
网络抓取最常见的用例包括:
价格监控 – 跟踪电子商务网站上的产品价格。帮助检测变化和价格错误。
市场调查 – 从网络上收集有关竞争对手、产品、评论等的数据。
新闻监测 – 从媒体网站抓取文章和新闻。对记者和公关专业人士有用。
研究 – 社会科学家使用网络抓取来收集社交媒体数据以进行研究。
数据库建设 – 通过抓取网站创建公司联系人、产品规格等的结构化数据集。
与手动数据收集相比,网络抓取可以节省大量时间和精力。但是,请确保以合乎道德的方式进行抓取并遵循网站的 robots.txt 规则。
为什么使用 Selenium 进行网页抓取?
有许多工具可用于网页抓取,例如 BeautifulSoup、Scrapy、Puppeteer 等。但是,当您需要执行以下操作时,Selenium 会脱颖而出:
从使用 JavaScript 加载内容的复杂动态网站中抓取数据。
在抓取之前,通过单击按钮、填写表格等方式与网站进行交互。
抓取隐藏在登录表单或支付门后面的数据。
扩大抓取范围以处理具有数千个页面的大型网站。
Selenium 可以自动化实际的 Web 浏览器(如 Chrome 或 Firefox),而不是像大多数其他 Web 抓取工具那样仅获取和解析 HTML。这使得抓取动态数据成为可能。
此外,Selenium 背后有一个庞大的社区,支持多种语言,包括 Python、Java、C# 和 JavaScript。
Selenium 网页抓取架构
在我们进入代码之前,让我们先了解一下 Selenium 如何进行网页抓取:
Selenium 使用以下方式与浏览器交互 网络驱动程序接口.
WebDriver 启动并控制 Chrome 等浏览器。
它执行用Python、Java等编写的抓取代码和脚本。
网页由浏览器呈现和处理。
根据脚本的逻辑收集和构建抓取的数据。
您可以将抓取工具部署在自己的机器上或使用云平台。
这种架构允许 Selenium 甚至可以抓取 Requests 等工具无法处理的复杂的 JavaScript 站点。
使用 Python 设置 Selenium
在开始网页抓取之前,我们需要在 Python 环境中设置 Selenium。
安装Python
确保您的系统上安装了 Python 3.6 或更高版本。您可以从以下位置下载最新的 Python 版本 蟒蛇网.
安装硒
安装 Python 后,运行以下命令来安装 Selenium:
pip install selenium
这将从 PyPI 安装 Python Selenium 包。
安装网络驱动程序
Selenium WebDriver 允许控制浏览器进行抓取。您需要为您要使用的浏览器安装 WebDriver:
铬:下载 ChromeDriver 与您的 Chrome 版本匹配。
火狐: 得到 Gecko驱动程序 根据您的 Firefox 版本。
边缘: 安装 微软网络驱动程序.
确保 WebDriver 可执行文件位于系统路径中,以允许 Selenium 检测到它。
就是这样!我们现在准备开始使用 Selenium Python 进行网页抓取。
启动浏览器
第一步是通过 Selenium 启动浏览器。
导入 Selenium 并创建一个 WebDriver
通过将路径传递给浏览器驱动程序可执行文件来实例化:
from selenium import webdriver
driver = webdriver.Chrome(‘/path/to/chromedriver‘)
您还可以初始化一个无头浏览器实例,它不会打开可见窗口:
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(options=options)
接下来,使用 get()
使浏览器实例导航到 URL 的方法:
driver.get(‘https://www.example.com‘)
浏览器现在将打开页面、渲染 JavaScript、加载动态内容等。现在我们可以开始抓取了!
定位页面元素
要从页面中提取数据,我们首先需要找到相关的 HTML 元素。硒提供了 find_element()
方法:
search_box = driver.find_element(By.NAME, ‘q‘)
这将定位具有 name="q" 属性的元素。其他一些常见的定位器策略是:
By.ID
– 通过元素ID查找By.XPATH
– 使用 XPath 查询查找By.CSS_SELECTOR
– 使用 CSS 选择器查找By.CLASS_NAME
– 通过 CSS 类名查找By.TAG_NAME
– 通过 HTML 标签名称查找
您还可以使用以下方式定位多个元素 find_elements()
它返回一个列表。
提取文本
找到一个元素后,您可以使用以下命令提取其文本 text
属性:
heading = driver.find_element(By.TAG_NAME, ‘h1‘)
print(heading.text)
这将打印 <h1>
页面上的标题文本。
同样,您可以获取输入字段的值:
username = driver.find_element(By.ID, ‘username‘)
print(username.get_attribute(‘value‘))
单击链接和按钮
要单击页面上的链接和按钮,请使用 click()
元素上的方法:
link = driver.find_element(By.LINK_TEXT, ‘Next Page‘)
link.click()
这允许与分页内容、弹出窗口、模式等进行交互。
填写表格
您可以使用以下命令将文本输入到文本框和其他输入元素中 send_keys()
:
search_box.send_keys(‘Web Scraping‘)
这允许在抓取之前登录网站、提交表单等。
执行 JavaScript
Selenium 还允许直接在页面上执行 JavaScript execute_script()
:
driver.execute_script(‘alert("Hello World");‘)
您可以使用它来抓取 JavaScript 注入到 DOM 中的数据。
等待元素加载
现代网站使用大量 AJAX 和 JavaScript 来动态加载内容。有时,您可能需要等待某些元素或数据加载才能进行抓取。
硒有 WebDriverWait
和 expected_conditions
处理这个:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, ‘someid‘)))
该脚本现在将等待长达 10 秒的时间以使该元素变得可点击。
有许多可用的预期条件,例如元素的可见性、AJAX 加载等,您可以使用它们来处理动态页面内容。
滚动页面
对于较长的网页,您可能需要向下滚动以通过 JavaScript 加载其他内容。硒也可以做到这一点:
# Scroll down the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Scroll back to top
driver.execute_script("window.scrollTo(0, 0);")
这允许抓取长网页。同样的滚动方法也适用于抓取 Facebook、Twitter 和其他社交媒体网站上的帖子。
处理登录和付费专区
有些网站要求在抓取之前先登录,或者可能有付费墙限制访问。
您可以使用 Selenium 输入凭据、绕过付费墙以及访问受限信息以进行抓取:
username = driver.find_element(By.ID, ‘username‘)
password = driver.find_element(By.ID, ‘password‘)
username.send_keys(‘myusername1234‘)
password.send_keys(‘mypassword5678‘)
login_button = driver.find_element(By.XPATH, ‘//button[text()="Log in"]‘)
login_button.click()
这允许登录亚马逊、eBay 等网站来抓取受限制的内容。
Selenium 网页抓取示例
让我们将所有内容整合到 Selenium 网络抓取脚本中:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.example.com")
# Click cookie consent banner
cookie_btn = driver.find_element(By.ID, ‘cookiebanner-accept‘)
cookie_btn.click()
# Wait for results to load
results = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "results"))
)
# Extract data from results
headings = results.find_elements(By.TAG_NAME, ‘h3‘)
for heading in headings:
print(heading.text)
driver.quit()
这个脚本:
- 启动 Chrome 并转到 example.com
- 单击 cookie 同意横幅以启用抓取
- 等待结果加载
- 提取标题文本并打印它们
您可以通过滚动、登录功能等来增强此功能,以构建强大的抓取工具!
使用 Selenium 进行有效网页抓取的技巧
以下是一些使用 Selenium 提高网页抓取效率的技巧:
使用无头浏览器 无需渲染和显示 UI 即可实现更快的抓取
限制不必要的行动 例如打开新标签、悬停交互等以加快抓取速度
等待页面加载和 AJAX 提取数据之前完成的请求
增量滚动 当抓取长页面以避免一次加载所有内容时
使用 CSS 选择器 定位元素时的可读性和性能
出现错误时重试 而不是完全停止以使刮刀更加坚固
限制请求 以避免服务器不堪重负并被阻止
在云端运行 使用 Selenium Grid 等服务来提高可靠性和规模
网页抓取的 Selenium 替代品
您可以研究以下一些其他流行的网络抓取工具:
美丽的汤 – 用于抓取 HTML 和 XML 的领先 Python 库
Scrapy – 适用于大型抓取项目的快速网络爬行框架
木偶戏 – 为 JavaScript 开发者提供的 Headless Chrome 抓取库
剧作家 – 使用 Chromium、Firefox 和 WebKit 浏览器进行抓取
阿皮菲 – 具有内置代理和无头 Chrome 的可扩展网络抓取平台
每个工具都有自己的优点和缺点。选择网络抓取解决方案时,请根据您的特定用例对其进行评估。
结论
Selenium 是一种多功能工具,用于用 Python 和其他语言构建强大的网络抓取工具。它提供了一些可能性,例如抓取 JavaScript 网站、处理动态内容、访问受限数据等,否则这些都是困难的。
使用 Selenium 时,请确保遵循道德抓取实践并尊重网站的限制。不要通过激进的抓取使服务器过载。
借助 Selenium、Python 和健全的抓取策略的强大功能,您可以从网络中提取大量有用数据,用于商业智能、研究和数据科学应用。