第 3 章 · 网页采集

网页获取

概

浏览器背后发生了什么?

浏览器或采集程序称为客户端,向存放网页的电脑(服务器)发送请求。服务器返回响应,里面可能包含页面内容。HTTP是双方交换消息所用的规则;HTTPS在传输时加密。

URL:资源的「门牌号」

URL就是资源地址,通常称为网址。同一篇报道可能有中文页、英文页和双语页,因此要检查取得的是哪个版本。例如:

https://cn.nytimes.com/china/20260916/china-english-language-education/dual/
│       │             │    │       │                               │
协议     域名           分类  日期    文章 slug                       双语页标识
  • https:// — 安全传输协议(HTTP + 加密)
  • cn.nytimes.com — 纽约时报中文网的服务器域名
  • /china/20260916/... — 路径,含分类、发布日期、文章标识
  • /dual/ — 关键后缀,表示「英中对照」版本

请求(Request)

请求是客户端发给服务器的消息。GET表示请求取得某个网址的内容。除了网址,请求还可带上请求头,说明客户端类型等信息。

响应(Response)

响应是服务器对请求的回复,包含状态码和返回内容。返回的文本通常是HTML,即带有网页结构标记的文字;可能是正文,也可能是登录提示。提取前要先识别正文所在的区域。

常见 HTTP 状态码

状态码 含义 语料采集中的应对
200 OK 请求成功,服务器返回了页面内容 先核对标题、正文和语言版本,再继续提取
404 Not Found 页面不存在(URL 拼写错误或文章已下架) 检查 URL 是否正确;记录失败链接,跳过该篇
403 Forbidden 服务器拒绝访问(可能检测到爬虫) 先确认访问要求;无法取得时,可用已获准保存的材料继续
500 / 503 服务器内部错误或暂时不可用 稍后重试;脚本中可设置 timeout 避免无限等待

翻译学生的视角

例如,准备收集机场年报时,状态码200只说明收到响应;若正文是“请登录”,年报仍未取得。404表示地址未找到;403表示访问被拒绝,不能靠更改一个参数就认定问题已经解决。

技

requests 库核心用法

1. 安装与导入

requests是Python中用于获取网页的库,安装命令为pip install requests。import requests表示使用这个库。

import requests

2. requests.get():发送 GET 请求

requests.get(url)按网址请求页面。返回的response对象保存这次响应的信息;.status_code是状态码,.text是收到的文本。

url = "https://cn.nytimes.com/china/20260916/china-english-language-education/dual/"
response = requests.get(url)

print(response.status_code)   # 200 表示成功
print(len(response.text))     # HTML 字符串的长度(字符数)
print(response.text[:200])    # 预览前 200 个字符

3. headers:随请求发送的说明

请求头(headers)随请求提供补充信息;User-Agent说明客户端类型,例如浏览器或采集程序。这些信息不等于访问许可,也不保证网站返回正文。

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36"
}
response = requests.get(url, headers=headers)

4. timeout:设置等待限制

timeout设置等待限制。超时表示这次获取未完成,程序会报错;只有另外写了错误处理,才会跳过或重试。例如,一份年报下载超时,应标为未取得,不能算入已收集材料。

# 连接或读取等待超时会报错
response = requests.get(url, headers=headers, timeout=30)

5. encoding:确保中文不乱码

encoding指定怎样把返回内容读成文字。编码应与实际内容一致;若原页面是UTF-8,可按UTF-8读取。乱码不一定是缺字,不能直接删除。

response = requests.get(url, headers=headers, timeout=30)
response.encoding = "utf-8"   # 强制按 UTF-8 解码 response.text
html = response.text

6. 保存 HTML 到本地文件

下载后可将 HTML 保存为 .html 文件,便于离线检查或在浏览器中打开对照。

保存页面不等于提取正文

取得采购须知网页后,保存的HTML可能同时含有付款条款、菜单和订阅按钮。保存只是留下一份可回查的页面文本;提取还要把条款选出来。图片、样式或后加载的内容不一定随HTML一起保存。

with open("nyt_page.html", "w", encoding="utf-8") as f:
    f.write(response.text)
print("已保存: nyt_page.html")
景

下载 NYT 双语页完整脚本

脚本向双语页面发送请求,检查状态码、设置编码,并将返回的HTML保存为本地文件。

Python代码
#!/usr/bin/env python3
"""下载 NYT 中文网双语页面 HTML(语料采集第一步)"""

import requests

# 目标 URL:/dual/ 后缀表示英中对照版
url = "https://cn.nytimes.com/china/20260916/china-english-language-education/dual/"

# 请求头:模拟浏览器,降低被拒绝的概率
headers = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36"
    )
}

# ① 发送 GET 请求(含超时保护)
response = requests.get(url, headers=headers, timeout=30)

# ② 检查状态码
if response.status_code != 200:
    print(f"下载失败,状态码: {response.status_code}")
    exit(1)

# ③ 指定 UTF-8 编码,避免中文乱码
response.encoding = "utf-8"
html = response.text

# ④ 保存到本地文件
output_file = "nyt_dual_page.html"
with open(output_file, "w", encoding="utf-8") as f:
    f.write(html)

print(f"下载成功!状态码: {response.status_code}")
print(f"HTML 大小: {len(html):,} 字符")
print(f"已保存: {output_file}")
print("可用浏览器打开已保存的文件,核对标题和正文。")

获取材料前,确认来源及使用条件,保留原文供核对。访问网页需要联网;网站改版后,提取范围可能需要调整。

笔译练习:哪些材料仍需补齐

用途:收集某机场2025年度报告的中英文版,供本年度年报翻译参考。

结果收到的内容
A状态200;标题为该机场2025年度报告,含中英文正文,尚未核对版本和完整性。
B状态200;只有“请登录”,没有年报正文。
C状态404;没有找到页面。

请判断:哪份材料可以继续核对?另外两项还缺什么?能否把状态200都视为已取得完整材料?

参考答案

A可继续核对年份、版本和正文是否完整;B只取得登录提示,C没有找到页面,两者都未取得年报正文。状态200不能单独证明材料正确或完整。