下面我将从核心原理、具体方法、常用工具、注意事项四个方面,详细解释如何修改网站抓取到的内容。

核心原理:获取、解析、修改、存储
的过程可以分解为四个基本步骤:
- 获取原始内容:使用HTTP请求从目标网站下载HTML、JSON或其他格式的数据,这是所有后续操作的基础。
- :将获取到的原始数据(如HTML)转换成一种程序可以方便操作的结构(如DOM树、JSON对象)。
- 修改/处理数据:根据你的需求,对解析后的数据进行操作,这是“修改”的核心环节。
- 存储或使用结果:将修改后的数据保存到你想要的地方(如数据库、CSV文件、JSON文件),或者直接在你的应用中使用。
具体修改方法与示例
的方式多种多样,从简单的文本替换到复杂的数据结构重组,下面列举几种常见场景。
场景1:文本内容的清洗和格式化
这是最常见的需求,比如去除多余的空格、换行、HTML标签等。
示例:抓取一段包含HTML标签的文本,只保留纯文字内容。

- 原始抓取内容:
<p> 你好,<strong>世界</strong>! </p> - :
你好,世界!
方法:
-
使用正则表达式:
import re raw_html = "<p> 你好,<strong>世界</strong>! </p>" # re.sub用于替换,'<.*?>?' 是一个非贪婪匹配,用于匹配所有HTML标签 clean_text = re.sub('<.*?>?', '', raw_html) # 去除多余空格 clean_text = ' '.join(clean_text.split()) print(clean_text) # 输出: 你好,世界! -
使用专门的HTML解析库(推荐):
from bs4 import BeautifulSoup raw_html = "<p> 你好,<strong>世界</strong>! </p>" soup = BeautifulSoup(raw_html, 'html.parser') # get_text() 方法会自动提取所有文本并去除标签 clean_text = soup.get_text() # 去除多余空格 clean_text = ' '.join(clean_text.split()) print(clean_text) # 输出: 你好,世界!
场景2:提取和重组数据
抓取的数据通常是分散的,你可能需要从不同位置提取信息,然后组合成新的结构。

示例:从一个商品详情页抓取商品名称、价格和库存,并组合成一个JSON对象。
- 原始HTML片段:
<h1 class="product-title">高级无线耳机</h1> <span class="price" id="sale-price">¥599.00</span> <span class="stock-status">库存: (15 件)</span>
- :
{ "name": "高级无线耳机", "price": 599.00, "stock": 15 }
方法: 使用HTML解析库(如BeautifulSoup)定位元素,提取属性和文本,然后构建新数据结构。
from bs4 import BeautifulSoup
html_doc = """
<h1 class="product-title">高级无线耳机</h1>
<span class="price" id="sale-price">¥599.00</span>
<span class="stock-status">库存: (15 件)</span>
"""
soup = BeautifulSoup(html_doc, 'html.parser')
# 提取名称
name = soup.find('h1', class_='product-title').get_text().strip()
# 提取价格并转换为浮点数
price_text = soup.find('span', class_='price').get_text().strip()
price = float(price_text.replace('¥', '').replace(',', ''))
# 提取库存并转换为整数
stock_text = soup.find('span', class_='stock-status').get_text().strip()
stock = int(stock_text.split('(')[1].split(' ')[0])
# 重组数据
product_data = {
"name": name,
"price": price,
"stock": stock
}
import json
print(json.dumps(product_data, ensure_ascii=False, indent=2))
# 输出:
# {
# "name": "高级无线耳机",
# "price": 599.0,
# "stock": 15
# }
场景3:处理动态加载内容
很多现代网站使用JavaScript动态加载数据,直接抓取HTML会得不到这些数据。
示例:抓取一个通过AJAX请求加载的评论列表。
方法:
- 手动分析网络请求:使用浏览器的开发者工具(F12 -> Network标签),找到加载评论数据的具体AJAX请求(通常是XHR或Fetch请求)。
- 直接模拟API请求:复制该请求的URL、请求方法(GET/POST)、请求头和请求体,在你的脚本中直接发送这个请求,获取JSON数据。
import requests
import json
# 假设通过浏览器开发者工具找到了API端点
api_url = "https://api.example.com/v1/comments?product_id=123"
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',
'Accept': 'application/json, text/plain, */*',
'Referer': 'https://example.com/product/123'
}
# 直接向API发送请求
response = requests.get(api_url, headers=headers)
response.raise_for_status() # 如果请求失败则抛出异常
comments_data = response.json()
# 现在你可以直接修改这个JSON对象
for comment in comments_data['comments']:
# 为每条评论添加一个处理时间戳
comment['processed_at'] = '2025-10-27T10:00:00Z'
# 或者修改用户名格式
comment['user']['display_name'] = comment['user']['display_name'].upper()
print(json.dumps(comments_data, indent=2, ensure_ascii=False))
场景4:数据转换和增强
将抓取到的数据进行类型转换、计算或关联外部数据。
示例:抓取汇率数据,并将其转换为另一种货币。
# 假设从某个API抓取了1美元兑人民币的汇率
usd_to_cny_rate = 7.25
# 抓取到的商品价格(美元)
product_prices_usd = [19.99, 29.50, 99.00]
# 修改数据:将价格转换为人民币
product_prices_cny = [price * usd_to_cny_rate for price in product_prices_usd]
# 创建一个包含两种价格的新数据结构
products_with_prices = [
{"usd_price": p, "cny_price": round(p * usd_to_cny_rate, 2)}
for p in product_prices_usd
]
import json
print(json.dumps(products_with_prices, indent=2))
常用工具和库
选择正确的工具能让事半功倍。
| 语言 | 工具/库 | 用途 |
|---|---|---|
| Python | Requests | 发送HTTP请求,获取网页内容,是事实上的标准。 |
| Beautiful Soup | 解析HTML和XML文档,非常易用,是处理网页数据的利器。 | |
| lxml | 一个高性能的HTML/XML解析器,Beautiful Soup可以底层使用它。 | |
| Selenium / Playwright | 自动化浏览器工具,用于处理JavaScript渲染的页面,模拟用户点击、滚动等操作。 | |
| Scrapy | 功能强大的爬虫框架,适合构建大规模、复杂的爬虫项目。 | |
| JavaScript (Node.js) | axios / node-fetch | 发送HTTP请求,类似于Python的Requests。 |
| cheerio | 服务端实现的jQuery,用于快速解析、操作和提取HTML数据。 | |
| puppeteer | 由Google开发,通过DevTools协议控制Chrome/Chromium浏览器,功能强大。 | |
| playwright | 由Microsoft开发,支持多浏览器(Chromium, Firefox, WebKit),是puppeteer的有力竞争者。 | |
| 命令行 | curl / wget | 快速下载网页内容,适合简单的测试和调试。 |
| jq | 一个轻量级、灵活的命令行JSON处理器,可以方便地过滤和转换JSON数据。 |
重要注意事项和最佳实践
- 遵守
robots.txt:在抓取任何网站之前,务必检查其robots.txt文件(https://example.com/robots.txt),这个文件规定了哪些页面允许爬虫访问,哪些不允许,尊重网站规则是良好爬虫的第一步。 - 设置合理的请求头:特别是
User-Agent,将其设置为常见的浏览器标识,避免被识别为爬虫而被封禁,可以设置Accept等头信息,模拟正常浏览器行为。 - 处理速率限制:不要以极高的频率发送请求,这会给目标服务器带来巨大压力,也容易被封,在请求之间加入随机延迟(
time.sleep(random.uniform(1, 3)))。 - 错误处理:网络请求可能会失败(404, 500, 503等),代码必须能够优雅地处理这些异常,避免程序崩溃。
- 数据存储:考虑将抓取到的原始数据和清洗后的数据分开存储,原始数据可用于回溯和调试,清洗后的数据用于业务逻辑。
- 法律和道德:确保你的抓取行为符合相关法律法规和网站的服务条款,不要抓取和传播受版权保护的内容,也不要用于恶意竞争,尊重数据隐私。
修改网站抓取内容的流程可以概括为:
发送请求获取数据 -> 解析数据结构 -> 按需清洗/转换/重组数据 -> 输出或存储结果
关键在于选择合适的工具来解析和操作数据,并始终遵循合法、合规、礼貌的原则进行抓取,对于初学者,强烈推荐从 Python + Requests + BeautifulSoup 这个黄金组合开始。
