核心概念:网页信息提取流程

无论使用哪种技术,基本流程都相似:

提取网页信息模板 yuandaima
(图片来源网络,侵删)
  1. 发送请求:向目标网址发送一个 HTTP 请求,获取网页的源代码(HTML)。
  2. :使用解析器(如 BeautifulSoup, lxml)读取 HTML 源代码,将其转换成一个可以方便遍历和查询的数据结构(通常是 DOM 树)。
  3. 定位信息:通过 CSS 选择器 或 XPath 表达式,精确定位到你想要提取的数据所在的 HTML 标签。
  4. 提取与存储:从定位到的标签中提取文本、链接、图片等数据,并将其整理、格式化,最后保存到文件(如 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 动态加载时,requestsBeautifulSoup 就无能为力了,因为它们只获取初始的 HTML 源码,这时需要使用 Selenium,它可以模拟一个真实的浏览器,执行 JavaScript,并获取最终渲染后的页面内容。

提取网页信息模板 yuandaima
(图片来源网络,侵删)

环境准备

安装库和浏览器驱动:

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 是一个很好的选择。axiosnode-fetch 用于请求,cheerio 用于解析(语法类似 jQuery)。

提取网页信息模板 yuandaima
(图片来源网络,侵删)

环境准备

确保你已安装 Node.jsnpm

# 初始化项目
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 较少

希望这些“源代码”模板能帮助您快速开始网页信息提取的工作!