第2章:Python爬虫入门——HTTP协议基础、Requests库入门、第一个爬虫程序
2.1 爬虫到底是什么?
说实话,很多人一听到「爬虫」就觉得很高大上。其实说白了,爬虫就是模拟浏览器去访问网页,然后把网页上的数据拿回来。
你想想看,我们平时用浏览器看网页,眼睛看到的是排版好的图文。但浏览器背后干了什么?它发了一个请求给服务器,服务器返回一堆HTML代码,浏览器再把代码渲染成漂亮的页面。
爬虫做的事情更直接——它跳过渲染这一步,直接拿回HTML代码,然后从中提取我们需要的数据。
我个人习惯把爬虫分成三步:请求 → 解析 → 存储。这一章我们先搞定第一步——请求。
核心要点:爬虫不是黑魔法,它只是自动化地重复「浏览器的工作」。你手动能看到的网页,爬虫理论上都能拿到。
2.2 HTTP协议——爬虫的「交通规则」
爬虫和服务器之间怎么交流?靠的就是HTTP协议。你可以把它理解成一套约定好的「暗号」。
2.2.1 请求与响应
每次访问网页,本质上就是一次请求-响应的循环:
- 客户端(爬虫) → 发送请求 → 服务器
- 服务器 → 返回响应 → 客户端(爬虫)
我在项目中遇到过不少新手,以为爬虫能直接拿到网页渲染后的数据。其实服务器返回的只是原始HTML,JavaScript生成的内容需要额外处理。嗯,这个后面会讲到。
2.2.2 常见的HTTP方法
| 方法 | 作用 | 爬虫常用吗? |
|---|---|---|
| GET | 获取资源(最常见) | ✅ 几乎天天用 |
| POST | 提交数据(登录、搜索) | ✅ 经常用 |
| PUT | 更新资源 | ❌ 很少用 |
| DELETE | 删除资源 | ❌ 基本不用 |
你写爬虫时,90%的情况只用GET和POST。GET就像你打开一个链接,POST就像你填完表单点提交。
2.2.3 状态码——服务器在跟你说话
服务器每次响应都会带一个状态码。我刚开始学的时候记不住,后来发现其实就记住几个关键的就行:
- 200 OK:一切正常,数据拿到了
- 301/302:页面搬家了,自动跳转
- 403 Forbidden:服务器不让你访问(反爬了)
- 404 Not Found:页面不存在
- 500:服务器自己出问题了
小技巧:写爬虫时,我习惯先打印一下状态码。如果看到403,赶紧检查是不是被反爬了。别傻乎乎地一直发请求。
2.3 Requests库——Python爬虫的「瑞士军刀」
Python里发HTTP请求有很多方式,但Requests库是最简单、最优雅的。没有之一。
2.3.1 安装
pip install requests
就这一行命令,搞定。
2.3.2 发送GET请求
来,直接看代码:
import requests
url = "https://httpbin.org/get"
response = requests.get(url)
print(response.status_code) # 200
print(response.text) # 返回的HTML/JSON内容
print(response.headers) # 响应头信息
就这么简单。三行代码,一个网页就抓回来了。
我曾经在项目里看到有人用urllib写了几十行代码,就为了发一个GET请求。用Requests的话,三行搞定。所以别跟自己过不去。
2.3.3 发送POST请求
POST请求稍微复杂一点,因为要带数据:
import requests
url = "https://httpbin.org/post"
data = {"username": "admin", "password": "123456"}
response = requests.post(url, data=data)
print(response.json()) # 服务器返回的JSON数据
注意这里用了data参数。如果是JSON格式的数据,用json参数:
response = requests.post(url, json={"key": "value"})
2.3.4 设置请求头——伪装成浏览器
很多网站会检查请求头,如果发现你是爬虫,直接拒绝访问。最常见的反爬手段就是检查User-Agent。
我建议你每次写爬虫都带上请求头,养成习惯:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
避坑指南:我曾经因为没加请求头,被一个网站封了IP整整一天。后来才发现,人家只是检查了User-Agent。加一行代码就解决了。所以——请求头一定要加!
2.4 第一个爬虫程序——抓取网页标题
理论说完了,咱们动手写一个真正的爬虫。目标:抓取一个网页的标题。
2.4.1 完整代码
import requests
# 目标网址
url = "https://example.com"
# 伪装成浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 发送请求
response = requests.get(url, headers=headers)
# 检查是否成功
if response.status_code == 200:
# 从HTML中提取标题(简单方法)
html = response.text
start = html.find("<title>") + len("<title>")
end = html.find("</title>")
title = html[start:end]
print(f"网页标题是:{title}")
else:
print(f"请求失败,状态码:{response.status_code}")
运行一下,你会看到类似这样的输出:
网页标题是:Example Domain
恭喜你!你已经写出了第一个爬虫程序。
2.4.2 代码拆解
这段代码虽然简单,但包含了爬虫的核心流程:
- 准备:确定URL,设置请求头
- 请求:用requests.get()发送请求
- 检查:判断状态码是否为200
- 提取:从HTML中找出标题
- 输出:打印结果
你想想看,以后爬任何网站,本质上都是这个流程。只是提取数据的方式会更复杂——我们会用BeautifulSoup、XPath这些工具。但骨架不变。
记住这个流程:准备 → 请求 → 检查 → 提取 → 输出。这是所有爬虫程序的通用模板。
2.5 本章知识体系
下面这张图帮你理清这一章的核心逻辑:
2.6 本章小结
这一章我们走完了爬虫的第一步。你学会了:
- HTTP协议的基本概念——请求、响应、状态码
- Requests库的安装和基本用法——GET和POST
- 如何设置请求头来伪装成浏览器
- 写了一个真正的爬虫程序——抓取网页标题
说实话,能坚持到这里你已经很棒了。很多人在安装库那一步就放弃了。你想想看,你已经跑通了第一个爬虫,接下来就是不断深入的问题了。
给你的建议:别急着往下学。把今天写的代码多跑几遍,换几个不同的网址试试。看看哪些网站能成功,哪些会报错。报错就是学习的机会。
嗯,这一章就到这里。代码写起来,别光看。