核心概念:网页信息提取流程
无论使用哪种技术,基本流程都相似:

(图片来源网络,侵删)
- 发送请求:向目标网址发送一个 HTTP 请求,获取网页的源代码(HTML)。
- :使用解析器(如 BeautifulSoup, lxml)读取 HTML 源代码,将其转换成一个可以方便遍历和查询的数据结构(通常是 DOM 树)。
- 定位信息:通过 CSS 选择器 或 XPath 表达式,精确定位到你想要提取的数据所在的 HTML 标签。
- 提取与存储:从定位到的标签中提取文本、链接、图片等数据,并将其整理、格式化,最后保存到文件(如 CSV, JSON)或数据库中。
Python + BeautifulSoup (最常用,适合静态网页)
这是最经典、最易于上手的网页信息提取方案。requests 库负责请求,BeautifulSoup 负责解析。
环境准备
安装必要的库:
pip install requests beautifulsoup4 lxml
requests: 发送 HTTP 请求。beautifulsoup4: 解析 HTML/XML。lxml: 一个更快的解析器,推荐使用。
代码模板
下面是一个完整的模板,它会访问一个示例网站,提取所有文章的标题和链接。
import requests
from bs4 import BeautifulSoup
import csv
# --- 1. 定义目标 URL 和请求头 ---
# User-Agent 模拟浏览器,避免被反爬
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
URL = 'http://quotes.toscrape.com/' # 一个专门用于练习爬虫的网站
# --- 2. 发送请求并获取响应 ---
try:
response = requests.get(URL, headers=HEADERS, timeout=10)
# 检查请求是否成功 (状态码 200)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
exit()
# --- 3. 解析 HTML 内容 ---
# 使用 'lxml' 解析器,速度更快
soup = BeautifulSoup(response.text, 'lxml')
# --- 4. 定位并提取信息 ---
# 使用 CSS 选择器查找所有包含引用的 div
quotes = soup.find_all('div', class_='quote')
# 存储提取的数据
extracted_data = []
for quote in quotes:
# 提取文本
text = quote.find('span', class_='text').get_text(strip=True)
# 提取作者
author = quote.find('small', class_='author').get_text(strip=True)
# 提取标签
tags = [tag.get_text(strip=True) for tag in quote.find_all('a', class_='tag')]
# 将数据存入字典
extracted_data.append({
'text': text,
'author': author,
'tags': ', '.join(tags)
})
# --- 5. 打印或存储数据 ---
# 打印提取的数据
for item in extracted_data:
print(f"引用: {item['text']}")
print(f"作者: {item['author']}")
print(f"标签: {item['tags']}")
print("-" * 20)
# 将数据保存到 CSV 文件
CSV_FILE = 'quotes.csv'
with open(CSV_FILE, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.DictWriter(f, fieldnames=['text', 'author', 'tags'])
writer.writeheader() # 写入表头
writer.writerows(extracted_data)
print(f"数据已成功保存到 {CSV_FILE}")
Python + Selenium (适合动态/JavaScript 渲染的网页)
是通过 JavaScript 动态加载时,requests 和 BeautifulSoup 就无能为力了,因为它们只获取初始的 HTML 源码,这时需要使用 Selenium,它可以模拟一个真实的浏览器,执行 JavaScript,并获取最终渲染后的页面内容。

(图片来源网络,侵删)
环境准备
安装库和浏览器驱动:
pip install selenium
下载浏览器驱动:
- Chrome: 下载 ChromeDriver,版本需与你的 Chrome 浏览器版本匹配。
- Firefox: 下载 GeckoDriver。
- 将下载好的
driver.exe(Windows) 或driver(Mac/Linux) 放在项目目录或系统PATH中。
代码模板
这个模板会打开一个浏览器,加载页面,等待内容加载完成后,再提取信息。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager # 自动管理驱动
# --- 1. 设置 WebDriver ---
# 使用 webdriver_manager 自动下载并管理驱动,省去手动配置的麻烦
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# --- 2. 打开目标网页 ---
URL = 'https://www.bing.com' # 一个有动态内容的网站
driver.get(URL)
# --- 3. 等待和定位元素 ---
# 动态加载的页面需要等待,否则可能找不到元素
# 方式一:固定等待 (简单但低效)
time.sleep(3)
# 方式二:智能等待 (推荐)
# from selenium.webdriver.support.ui import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# search_box = WebDriverWait(driver, 10).until(
# EC.presence_of_element_located((By.NAME, "q"))
# )
# --- 4. 提取信息 ---
# 假设我们要获取首页的“每日一图”的标题和链接
try:
# 使用 XPath 定位
daily_image_element = driver.find_element(By.XPATH, "//a[contains(@class, 'ih-item')]")
image_title = daily_image_element.get_attribute('title')
image_link = daily_image_element.get_attribute('href')
print(f"图片标题: {image_title}")
print(f"图片链接: {image_link}")
except Exception as e:
print(f"未找到元素或发生错误: {e}")
# --- 5. 关闭浏览器 ---
driver.quit()
Node.js + Cheerio (适合静态网页,前端开发者友好)
如果你熟悉 JavaScript,使用 Node.js 是一个很好的选择。axios 或 node-fetch 用于请求,cheerio 用于解析(语法类似 jQuery)。

(图片来源网络,侵删)
环境准备
确保你已安装 Node.js 和 npm。
# 初始化项目 npm init -y # 安装依赖 npm install axios cheerio
代码模板
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
// --- 1. 定义目标 URL 和请求头 ---
const URL = 'http://quotes.toscrape.com/';
const HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
};
// --- 2. 发送请求并获取响应 ---
axios.get(URL, { headers: HEADERS })
.then(response => {
// --- 3. 解析 HTML 内容 ---
const $ = cheerio.load(response.data);
// --- 4. 定位并提取信息 ---
const extractedData = [];
$('.quote').each((index, element) => {
const text = $(element).find('.text').text().trim();
const author = $(element).find('.author').text().trim();
const tags = [];
$(element).find('.tag').each((i, tagEl) => {
tags.push($(tagEl).text().trim());
});
extractedData.push({
text: text,
author: author,
tags: tags.join(', ')
});
});
// --- 5. 打印或存储数据 ---
console.log(extractedData);
// 将数据保存到 JSON 文件
fs.writeFileSync('quotes.json', JSON.stringify(extractedData, null, 2), 'utf-8');
console.log('数据已成功保存到 quotes.json');
})
.catch(error => {
console.error(`请求失败: ${error.message}`);
});
C# + AngleSharp (适合 .NET 开发者)
如果你使用 .NET 生态,AngleSharp 是一个非常强大的 HTML 解析库。
环境准备
通过 NuGet 安装包:
dotnet add package AngleSharp
代码模板
using AngleSharp;
using AngleSharp.Dom;
using AngleSharp.Html.Parser;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class WebScraper
{
public static async Task Main(string[] args)
{
var url = "http://quotes.toscrape.com/";
var extractedData = new List<Quote>();
// --- 1. 发送请求 ---
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0...");
var htmlContent = await httpClient.GetStringAsync(url);
// --- 2. 解析 HTML ---
var parser = new HtmlParser();
var document = await parser.ParseDocumentAsync(htmlContent);
// --- 3. 定位并提取信息 ---
var quotes = document.QuerySelectorAll("div.quote");
foreach (var quoteElement in quotes)
{
var text = quoteElement.QuerySelector("span.text")?.TextContent.Trim();
var author = quoteElement.QuerySelector("small.author")?.TextContent.Trim();
var tags = new List<string>();
var tagElements = quoteElement.QuerySelectorAll("a.tag");
foreach (var tagElement in tagElements)
{
tags.Add(tagElement.TextContent.Trim());
}
if (text != null && author != null)
{
extractedData.Add(new Quote { Text = text, Author = author, Tags = string.Join(", ", tags) });
}
}
// --- 4. 打印或存储数据 ---
foreach (var quote in extractedData)
{
Console.WriteLine($"引用: {quote.Text}");
Console.WriteLine($"作者: {quote.Author}");
Console.WriteLine($"标签: {quote.Tags}");
Console.WriteLine(new string('-', 20));
}
// 保存到 JSON
var json = System.Text.Json.JsonSerializer.Serialize(extractedData, new System.Text.Json.JsonSerializerOptions { WriteIndented = true });
await File.WriteAllTextAsync("quotes.json", json);
Console.WriteLine("数据已成功保存到 quotes.json");
}
}
public class Quote
{
public string Text { get; set; }
public string Author { get; set; }
public string Tags { get; set; }
}
如何选择合适的模板?
| 场景 | 推荐技术 | 优点 | 缺点 |
|---|---|---|---|
| 静态网页 (HTML 直接包含内容) | Python + BeautifulSoup / Node.js + Cheerio | 代码简单、高效、资源占用少 | 无法处理 JavaScript 动态加载的内容 |
| 动态网页 (内容由 JS 渲染) | Python + Selenium / Node.js + Puppeteer | 功能强大,能模拟真实用户行为 | 速度慢,资源占用高,配置较复杂 |
| 个人/小规模项目 | Python + BeautifulSoup | 生态成熟,社区庞大,学习资源多 | |
| 大规模/分布式爬虫 | Scrapy (Python) / 爬虫框架 | 高性能,支持异步、分布式,数据管道强大 | 学习曲线陡峭 |
| .NET 开发者 | C# + AngleSharp | 与 .NET 生态无缝集成,类型安全 | 社区和资源相对 Python 较少 |
希望这些“源代码”模板能帮助您快速开始网页信息提取的工作!
