浏览器背后发生了什么?
浏览器或采集程序称为客户端,向存放网页的电脑(服务器)发送请求。服务器返回响应,里面可能包含页面内容。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不能单独证明材料正确或完整。