http爬网站怎么操作?python爬虫教程
- 云服务器
- 2026-07-09
- 8
HTTP 协议与网站爬取技术详解
HTTP(HyperText Transfer Protocol,超文本传输协议)是互联网上应用最为广泛的一种网络协议,也是 Web 数据爬取的核心基础,理解 HTTP 协议的工作原理、请求与响应机制,是进行高效、稳定网站爬取的前提,本文将深入解析 HTTP 协议在爬虫中的应用,涵盖基础概念、常见状态码、请求方法、头部信息以及反爬策略与应对。
HTTP 协议基础架构
HTTP 是一种无状态、面向对象的协议,通常基于 TCP/IP 协议栈运行,在爬虫场景中,我们主要关注客户端(爬虫程序)与服务器之间的交互流程。
请求-响应模型
爬虫的工作流程可以简化为以下步骤:
- 建立连接:爬虫向目标服务器发起 TCP 连接。
- 发送请求:构造 HTTP 请求报文,包含请求行、请求头和请求体。
- 服务器处理:服务器接收请求,解析并处理业务逻辑。
- 返回响应:服务器返回 HTTP 响应报文,包含状态码、响应头和响应体(如 HTML、JSON 数据)。
- 关闭连接:数据传输完成后,断开连接(HTTP/1.1 默认保持连接,HTTP/2 多路复用)。
HTTP 版本差异
- HTTP/1.0:每次请求都需要建立新的 TCP 连接,效率较低。
- HTTP/1.1:支持持久连接(Keep-Alive),允许在一个连接上发送多个请求,提高了效率。
- HTTP/2:引入多路复用、头部压缩等技术,进一步提升了性能,但爬虫逻辑基本不变。
核心组件详解
请求方法(Methods)
爬虫主要使用 GET 方法,但了解其他方法有助于理解 API 接口。

| 方法 | 描述 | 爬虫应用场景 |
|---|---|---|
| GET | 请求指定资源的表示形式 | 获取网页 HTML、查询 API 数据 |
| POST | 向指定资源提交数据进行处理请求 | 提交表单、登录接口、提交搜索关键词 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容 | 较少用于爬取,多用于 API 更新资源 |
| DELETE | 请求服务器删除指定的页面 | 极少用于爬取 |
| HEAD | 与 GET 类似,但只返回响应头,不返回响应体 | 检查链接是否有效、获取文件大小 |
常用请求头(Request Headers)
服务器通过请求头识别客户端身份和行为,爬虫需合理设置这些字段以模拟真实浏览器。
- User-Agent (UA):标识客户端软件类型、操作系统和版本,大多数网站会检查 UA,若缺失或为默认值(如 python-requests/2.25.1),可能被拒绝访问。
- Host:指定请求的资源的主机名和端口号。
- Referer:指示请求从哪个页面链接过来,用于防盗链和追踪来源。
- Cookie:存储用户会话信息(如登录状态、购物车内容)。
- Accept:指定客户端能够识别的内容类型(如 text/html, application/json)。
- Authorization:用于身份验证,通常包含 Token 或 Basic Auth 信息。
响应状态码(Status Codes)
状态码告知爬虫请求是否成功,是判断爬取结果的关键。

| 状态码 | 含义 | 爬虫处理建议 |
|---|---|---|
| 200 | OK,请求成功 | 正常解析响应体内容 |
| 301/302 | 永久/临时重定向 | 跟随 Location 头中的新 URL 继续请求 |
| 403 | Forbidden,禁止访问 | 检查 UA、Referer,或尝试更换 IP |
| 404 | Not Found,资源不存在 | 检查 URL 是否正确,或资源已移除 |
| 429 | Too Many Requests | 请求频率过高,需降低爬取速度或等待 |
| 500 | Internal Server Error | 服务器内部错误,可稍后重试 |
| 503 | Service Unavailable | 服务器过载,需等待后重试 |
爬虫实战中的关键技术
会话保持(Session)
许多网站需要登录才能访问特定内容,使用 requests.Session() 可以自动管理 Cookie,保持登录状态。
import requests session = requests.Session() # 登录接口 login_url = "https://example.com/login" data = {"username": "user", "password": "pass"} session.post(login_url, data=data) # 使用保持的会话访问需要登录的页面 response = session.get("https://example.com/profile") print(response.text)
处理动态加载内容(JavaScript)
现代网站大量使用 AJAX 和 JavaScript 动态渲染页面,传统的 HTTP 请求只能获取初始 HTML,无法获取动态数据。

- 分析 API 接口
通过浏览器开发者工具(Network 面板)捕获前端 JS 发起的 XHR/Fetch 请求,直接模拟这些 API 请求,效率更高。
- 使用无头浏览器
使用 Selenium、Playwright 或 Puppeteer 等工具,启动真实的浏览器内核执行 JS,等待页面渲染完成后提取数据。
代理 IP 的使用
当爬取频率过高时,目标网站会封禁 IP,使用代理 IP 池可以分散请求来源,降低被封风险。
proxies = { "http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080", } response = requests.get("https://example.com", proxies=proxies)
常见反爬策略与应对
| 反爬策略 | 描述 | 应对方法 |
|---|---|---|
| User-Agent 检测 | 检查请求头中的 UA 字段 | 轮换多个真实的浏览器 UA |
| IP 频率限制 | 限制同一 IP 在单位时间内的请求次数 | 使用代理 IP 池,降低爬取速度,设置随机延时 |
| Cookie/Session 验证 | 要求携带有效的 Cookie 才能访问 | 先访问首页获取 Cookie,或使用 Session 保持状态 |
| 验证码 | 图形验证码、滑块验证码等 | 使用打码平台,或训练 OCR 模型,或模拟人工操作 |
| JS 加密参数 | URL 或表单中包含由 JS 生成的加密参数 | 逆向分析 JS 代码,使用 PyExecJS 执行 JS,或直接用浏览器自动化 |
| Referer 检查 | 检查请求来源页面 | 在请求头中设置正确的 Referer |
最佳实践与道德规范
- 遵守 robots.txt:在爬取前,检查目标网站的 robots.txt 文件,尊重网站的爬取规则。
- 控制爬取频率:避免对服务器造成过大压力,设置合理的延时(如 1-3 秒)。
- 合法合规:仅爬取公开数据,不侵犯个人隐私,不用于非法用途。
- 错误处理:编写健壮的代码,处理网络异常、超时、状态码错误等情况,实现自动重试机制。
相关问题与解答
问题 1:为什么我的爬虫请求返回 403 Forbidden 错误,该如何解决?
解答:
403 Forbidden 错误通常意味着服务器理解请求但拒绝执行,在爬虫场景中,常见原因及解决方法如下:
- 缺少或错误的 User-Agent:服务器可能拒绝没有 UA 或 UA 为默认值的请求。
- 解决:在请求头中添加一个真实的浏览器 UA,如 Chrome 或 Firefox 的 UA 字符串。
- 缺少 Referer:某些网站(尤其是图片站)会检查 Referer 以防止盗链。
- 解决:在请求头中添加 Referer 字段,设置为上一页面的 URL。
- IP 被封禁:如果之前爬取频率过高,IP 可能被临时或永久封禁。
- 解决:更换 IP 地址,或使用代理 IP 池。
- 需要登录或 Cookie:某些资源需要用户登录状态。
- 解决:先模拟登录获取 Cookie,然后在后续请求中携带 Cookie。
问题 2:如何高效地爬取动态加载的网页内容?
解答:
动态加载网页的内容通常通过 JavaScript 异步请求(AJAX)获取,直接请求 URL 只能得到空壳 HTML,高效爬取的方法有:
- 分析网络请求(推荐):
- 打开浏览器开发者工具(F12),切换到 Network 标签。
- 刷新页面,筛选 XHR 或 Fetch 请求。
- 找到返回 JSON 或 HTML 数据的接口,分析其请求参数(URL、Headers、Body)。
- 使用 Python 的 requests 库直接模拟这些 API 请求,解析返回的数据,这种方法速度快、资源消耗低。
- 使用浏览器自动化工具:
- API 加密复杂或难以逆向,可使用 Selenium、Playwright 或 Puppeteer。
- 这些工具可以启动真实浏览器,执行 JavaScript,等待页面渲染完成后再提取 DOM 元素。
- 注意:此方法资源消耗大、速度慢,应作为最后手段。
- 使用无头浏览器服务:
对于大规模爬取,可考虑使用商业化的无头浏览器服务或 API,避免自建环境维护成本。