写爬虫的第一步,是把网页内容拿到手。requests 是 Python 里最常用的 HTTP 库,几行代码就能完成一次请求。这一篇只讲最基础的 GET 请求、状态码判断、超时和参数传递,掌握这些就能抓取大部分静态页面了。
安装与第一次请求
requests 是第三方库,先安装:
pip install requests
然后发起第一个 GET 请求:
import requests
resp = requests.get("https://example.com", timeout=10)
print(resp.status_code) # 输出:200
print(resp.text[:40]) # 输出:<!doctype html>(网页源码开头)
status_code 是 HTTP 状态码,200 表示成功;resp.text 是服务器返回的文本内容。timeout=10 表示最多等 10 秒,这个参数建议永远都带上,不然网络卡住时程序会一直挂在那里。
判断请求是否成功
网络请求随时可能失败,先检查状态码再解析内容是好习惯:
import requests
resp = requests.get("https://example.com/not-exist", timeout=10)
print(resp.status_code) # 输出:404
resp.raise_for_status() # 状态码是 4xx/5xx 时会抛出异常
把 raise_for_status() 放在 try/except 里,失败时就能拿到明确的错误信息,而不是拿着一份空数据继续往下跑:
import requests
try:
resp = requests.get("https://example.com", timeout=10)
resp.raise_for_status()
print("抓取成功,长度:", len(resp.text))
except requests.RequestException as e:
print("抓取失败:", e)
传递查询参数
URL 后面那些 ?key=value 可以用 params 参数来传,requests 会自动拼接并做 URL 编码:
import requests
resp = requests.get(
"https://httpbin.org/get",
params={"word": "python", "page": 1},
timeout=10,
)
print(resp.url)
# 输出:https://httpbin.org/get?word=python&page=1
参数值里就算有中文和特殊字符也不用自己转码,直接写就行,比手动拼字符串干净得多。
请求头与 User-Agent
有些网站会检查请求头里的 User-Agent,缺了它可能拿不到正常内容。用一个字典把自定义请求头传进去:
import requests
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
resp = requests.get("https://example.com", headers=headers, timeout=10)
print(resp.status_code) # 输出:200
保存抓到的内容
拿到文本后写入本地文件,就完成了一次最简单的抓取流程:
import requests
resp = requests.get("https://example.com", timeout=10)
resp.encoding = "utf-8" # 指定编码,避免中文乱码
with open("page.html", "w", encoding="utf-8") as f:
f.write(resp.text)
print("已保存", len(resp.text), "个字符")
如果抓的是图片这类二进制数据,改用 resp.content(字节内容)配合 "wb" 模式写入即可。
小结
requests.get()发起 GET 请求,timeout一定要设- 用
status_code/raise_for_status()判断请求成败 params传查询参数,headers自定义请求头resp.text是解码后的文本,resp.content是原始字节- 抓取前先看看目标网站的 robots.txt,控制好频率,别给人家服务器添麻烦
下一篇可以在这基础上引入 BeautifulSoup,把网页里的标题和链接提取出来,做成真正意义上的结构化爬取。
「timeout 一定要设」这条真是血泪教训,之前爬站没设它,程序挂了一晚上才发现。下篇求安排 BeautifulSoup!