使用Selenium和Python进行网络爬虫 | 解决网络爬虫中的验证码

Ethan Collins
Pattern Recognition Specialist
04-Dec-2025

想象一下,你可以轻松地从互联网上获取所有你需要的数据,而无需手动浏览网页或复制粘贴。这就是网页抓取的魅力。无论你是数据分析师、市场研究人员还是开发者,网页抓取都为你打开了自动化数据收集的新世界。
在这个数据驱动的时代,信息就是力量。然而,手动从数百甚至数千个网页中提取信息不仅耗时,而且容易出错。幸运的是,网页抓取提供了一种高效且准确的解决方案,使你能够自动化地从互联网上提取所需数据,从而显著提高效率和数据质量。
目录
什么是网页抓取?
网页抓取是一种通过编写程序自动从网页中提取信息的技术。该技术在许多领域都有广泛的应用,包括数据分析、市场研究、竞争情报、内容聚合等。通过网页抓取,你可以在短时间内从大量网页中收集和整合数据,而不是依赖手动操作。
网页抓取通常包括以下步骤:
- 发送HTTP请求:通过程序向目标网站发送请求以获取网页的HTML源代码。常用的工具如Python的requests库可以轻松实现这一点。
- 解析HTML内容:在获取HTML源代码后,需要解析它以提取所需数据。可以使用如BeautifulSoup或lxml等HTML解析库来处理HTML结构。
- 提取数据:根据解析后的HTML结构,定位并提取特定内容,如文章标题、价格信息、图片链接等。常用的方法包括使用XPath或CSS选择器。
- 存储数据:将提取的数据保存到合适的存储介质中,如数据库、CSV文件或JSON文件,以便后续分析和处理。
通过使用Selenium等工具,可以模拟用户浏览器操作,绕过一些反爬虫机制,从而更高效地完成网页抓取任务。
领取CapSolver优惠码
立即提升你的自动化预算!
在充值CapSolver账户时使用优惠码 CAPN,每次充值均可获得额外 5% 的奖励 —— 无限制。
现在就在你的 CapSolver仪表板 中领取。
.
开始使用Selenium
我们以 ScrapingClub 为例,使用Selenium完成第一个练习。

准备
首先,你需要确保本地机器上已安装Python。你可以在终端中输入以下命令检查Python版本:
bash
python --version
确保Python版本大于3。如果未安装或版本过低,请从 Python官网 下载最新版本。接下来,使用以下命令安装selenium库:
bash
pip install selenium
导入库
python
from selenium import webdriver
访问页面
使用Selenium驱动Google Chrome访问页面并不复杂。在初始化Chrome选项对象后,可以使用get()方法访问目标页面:
python
import time
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
time.sleep(5)
driver.quit()
启动参数
Chrome选项可以添加许多启动参数,有助于提高数据检索效率。你可以在官方网站查看完整的参数列表:Chromium命令行开关列表。下表列出了一些常用的参数:
| 参数 | 用途 |
|---|---|
| --user-agent="" | 设置请求头中的User-Agent |
| --window-size=xxx,xxx | 设置浏览器分辨率 |
| --start-maximized | 以最大化分辨率运行 |
| --headless | 以无头模式运行 |
| --incognito | 以隐身模式运行 |
| --disable-gpu | 禁用GPU硬件加速 |
示例:以无头模式运行
python
import time
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
time.sleep(5)
driver.quit()
定位页面元素
抓取数据的必要步骤是在DOM中找到对应的HTML元素。Selenium提供了两种主要方法来定位页面元素:
find_element:查找符合标准的单个元素。find_elements:查找符合标准的所有元素。
这两种方法都支持八种不同的定位HTML元素的方式:
| 方法 | 含义 | HTML示例 | Selenium示例 |
|---|---|---|---|
| By.ID | 按元素ID定位 | <form id="loginForm">...</form> |
driver.find_element(By.ID, 'loginForm') |
| By.NAME | 按元素名称定位 | <input name="username" type="text" /> |
driver.find_element(By.NAME, 'username') |
| By.XPATH | 按XPath定位 | <p><code>My code</code></p> |
driver.find_element(By.XPATH, "//p/code") |
| By.LINK_TEXT | 按超链接文本定位 | <a href="continue.html">Continue</a> |
driver.find_element(By.LINK_TEXT, 'Continue') |
| By.PARTIAL_LINK_TEXT | 按部分超链接文本定位 | <a href="continue.html">Continue</a> |
driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti') |
| By.TAG_NAME | 按标签名称定位 | <h1>Welcome</h1> |
driver.find_element(By.TAG_NAME, 'h1') |
| By.CLASS_NAME | 按类名定位 | <p class="content">Welcome</p> |
driver.find_element(By.CLASS_NAME, 'content') |
| By.CSS_SELECTOR | 按CSS选择器定位 | <p class="content">Welcome</p> |
driver.find_element(By.CSS_SELECTOR, 'p.content') |
让我们回到ScrapingClub页面,编写以下代码来查找“开始”按钮元素以完成第一个练习:

python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
time.sleep(5)
driver.quit()
元素交互
一旦我们找到了“开始”按钮元素,就需要点击该按钮进入下一页。这涉及元素交互。Selenium提供了多种方法来模拟操作:
click(): 点击元素;clear(): 清除元素内容;send_keys(*value: str): 模拟键盘输入;submit(): 提交表单;screenshot(filename): 保存页面截图。
更多交互操作请参考官方文档:WebDriver API。我们继续改进ScrapingClub练习代码,添加点击交互:
python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
time.sleep(5)
driver.quit()
数据提取

当我们到达第一个练习页面时,需要收集产品的图片、名称、价格和描述信息。我们可以使用不同的方法来查找这些元素并提取它们:
python
from selenium import webdriver
from selenium.webdriver.common.by import By
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text
print(f'产品名称: {product_name}')
print(f'产品图片: {product_image}')
print(f'产品价格: {product_price}')
print(f'产品描述: {product_description}')
driver.quit()
该代码将输出以下内容:
产品名称: 长袖连衣裙上衣
产品图片: https://scrapingclub.com/static/img/73840-Q.jpg
产品价格: $12.99
产品描述: 有机棉制成的伸展针织上衣,圆领设计。92% 棉,3% 氨纶,3% 粘胶纤维,2% 聚酯纤维。
等待元素加载
有时,由于网络问题或其他原因,Selenium运行完成后元素可能尚未加载完成,这可能导致部分数据收集失败。为了解决这个问题,我们可以设置等待,直到某个特定元素完全加载后再继续数据提取。以下是一个示例代码:
python
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
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://scrapingclub.com/')
get_started_button = driver.find_element(By.XPATH, "//div[@class='w-full rounded border'][1]/div[3]")
get_started_button.click()
# 等待产品图片元素完全加载
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.card-img-top')))
product_name = driver.find_element(By.CLASS_NAME, 'card-title').text
product_image = driver.find_element(By.CSS_SELECTOR, '.card-img-top').get_attribute('src')
product_price = driver.find_element(By.XPATH, '//h4').text
product_description = driver.find_element(By.CSS_SELECTOR, '.card-description').text
print(f'产品名称: {product_name}')
print(f'产品图片: {product_image}')
print(f'产品价格: {product_price}')
print(f'产品描述: {product_description}')
driver.quit()
绕过反抓取保护
ScrapingClub练习相对容易完成。然而,在实际的数据收集场景中,获取数据并不容易,因为一些网站采用了反抓取技术,可能会检测到你的脚本是机器人并阻止收集。最常见的场景是验证码挑战

解决这些验证码挑战需要大量的机器学习、逆向工程和浏览器指纹对抗经验,这可能需要很多时间。幸运的是,现在你不需要自己完成所有工作。CapSolver 提供了完整的解决方案,帮助你轻松绕过所有挑战。CapSolver 提供了浏览器扩展,可以在使用Selenium收集数据时自动解决验证码挑战。此外,他们还提供了API方法来解决验证码并获取令牌,所有操作只需几秒钟即可完成。更多详情请参考 CapSolver文档。
结论
从提取产品详情到绕过复杂的反抓取措施,使用Selenium进行网页抓取为自动化数据收集打开了广阔的新天地。随着我们不断探索不断变化的网络环境,像CapSolver这样的工具为更顺畅的数据提取铺平了道路,让曾经难以克服的挑战成为过去式。因此,无论你是数据爱好者还是经验丰富的开发者,利用这些技术不仅能提高效率,还能开启一个数据驱动洞察触手可及的世界。
常见问题
1. 网页抓取用于什么?
网络爬虫用于从网页中自动提取信息。它允许开发者、分析师和企业批量收集产品数据、价格、文章、图片、评论和其他在线信息,而无需手动复制,大大提高了效率和数据准确性。
2. 为什么使用 Selenium 进行网络爬虫而不是 requests 或 BeautifulSoup?
Requests 和 BeautifulSoup 对于静态网页效果很好,但许多现代网站使用 JavaScript 加载内容。Selenium 可以模拟真实浏览器,允许您抓取动态页面、点击按钮、滚动页面、与元素交互,并绕过简单的反爬虫措施——使其适用于复杂场景。
3. Selenium 能否抓取需要登录或用户操作的网站?
可以。Selenium 可以执行点击按钮、输入文本、导航页面和管理 cookies 或会话等交互操作,使其适用于抓取登录表单或用户工作流后的页面。
4. 抓取数据时如何处理 CAPTCHAs?
CAPTCHAs 是一种常见的反机器人机制,可能会阻止 Selenium 脚本。除了手动解决外,您还可以集成如 CapSolver 等解决方案,通过 API 或浏览器扩展自动解决 CAPTCHAs,以保持抓取过程的连续性。
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

如何使用 Scrapling 和 CapSolver 解决验证码
Scrapling + CapSolver 支持通过 ReCaptcha v2/v3 和 Cloudflare Turnstile 绕过进行自动化抓取。

Ethan Collins
05-Dec-2025

使用Selenium和Python进行网络爬虫 | 解决网络爬虫中的验证码
在本文中,您将掌握使用Selenium和Python进行网络爬虫,并学习如何解决过程中遇到的Captcha,以实现高效的数据提取。

Ethan Collins
04-Dec-2025

使用Colly进行Go语言网络爬虫
在本文中,我们将深入探讨使用Go语言和Colly库进行网络爬虫。指南首先帮助您设置Go语言项目并安装Colly库。然后我们逐步讲解如何创建一个基础爬虫,从维基百科页面中提取链接,展示Colly的易用性和强大功能。

Ethan Collins
04-Dec-2025

什么是网络爬虫 | 常见应用场景和问题
了解网络爬虫:学习其优势,轻松应对挑战,并通过CapSolver提升您的业务。

Anh Tuan
03-Dec-2025

什么是Puppeteer以及如何在网页爬虫中使用 | 完整指南 2026
本完整指南将深入探讨Puppeteer是什么以及如何在网页爬取中有效使用它。

Nikolai Smirnov
03-Dec-2025

如何制作一个AI代理网络爬虫(适合初学者的教程)
通过这个适合初学者的教程,学习如何从零开始创建AI智能体网络爬虫。了解核心组件、代码示例以及如何绕过反机器人措施(如验证码)以确保可靠的数据采集。

Lucas Mitchell
02-Dec-2025


.