Skip to content

爬虫基础与HTTP

爬虫最核心的事情,其实可以概括成一句话:

程序代替浏览器去访问网络资源,再从返回结果里提取你真正需要的数据。

所以如果你连 HTTP 请求和响应都没搞清楚,后面就很容易变成只会照抄代码,不知道为什么能抓、为什么抓不到、为什么会被拦。

本节目标

  • 理解什么是爬虫
  • 理解浏览器访问网页的基本流程
  • 理解 HTTP 请求和响应
  • 理解常见请求方法和状态码
  • 理解请求头、响应体、Cookie、Referer、User-Agent 的作用
  • 建立分析网页请求流程的基础能力

什么是爬虫

爬虫不是神秘技术,本质上就是自动化获取网络数据。

例如:

  • 获取商品列表
  • 获取文章标题
  • 获取评论信息
  • 获取接口返回的数据

你平时用浏览器打开网页,是“人看页面”;爬虫则是“程序拿数据”。

所以爬虫的核心任务不是把页面显示得多漂亮,而是找到目标数据并提取出来。

浏览器访问网页时到底发生了什么

你在浏览器地址栏输入一个网址时,大致会经历这些步骤:

  1. 浏览器向服务器发请求
  2. 服务器返回响应内容
  3. 浏览器解析 HTML、CSS、JavaScript
  4. 页面被渲染出来

而爬虫最关心的是前两步:

  • 请求发了什么
  • 服务器回了什么

只要这两步理解清楚,后面的采集工作就有了抓手。

HTTP 是什么

HTTP 是浏览器和服务器通信时常见的协议。

你可以先把它理解成一套“双方说话的规则”。

浏览器不会无缘无故知道一个页面长什么样,必须先按 HTTP 规则发请求,服务器再按 HTTP 规则回响应。

什么是请求

请求就是“客户端向服务器发出的一次访问动作”。

例如你访问:

text
https://example.com/news/

浏览器会向服务器发出一个请求,问它:

“请把这个地址对应的内容给我。”

一个请求通常包含什么

HTTP 请求中常见的信息包括:

  • 请求方法
  • 请求地址
  • 请求头
  • 请求参数
  • 请求体

请求方法

常见有:

  • GET
  • POST

请求地址

也就是访问目标,例如:

text
https://example.com/api/user

请求头

请求头里会携带一些附加信息,例如:

  • 你是什么客户端
  • 你从哪里来
  • 你能接受什么内容

请求参数

例如:

text
https://example.com/search?q=python&page=1

这里的 q=python&page=1 就是请求参数。

GET 和 POST 的区别

这是做爬虫时必须分清的基础。

GET

常用于获取数据。

例如:

  • 打开新闻详情页
  • 搜索列表页
  • 获取普通页面

特点:

  • 参数通常直接写在 URL 后面

POST

常用于提交数据。

例如:

  • 登录
  • 提交表单
  • 调用某些接口

特点:

  • 参数通常写在请求体中

什么是响应

服务器收到请求后,会返回一个结果,这个结果就叫响应。

常见响应内容包括:

  • HTML 页面
  • JSON 数据
  • 图片
  • 视频
  • 文件

所以爬虫拿到响应后,下一步要做的就是判断:

  • 这是 HTML 吗
  • 这是 JSON 吗
  • 我要从哪里提取数据

响应里常见的关键信息

状态码

状态码用来表示这次请求结果如何。

响应头

响应头会告诉你一些附加信息,例如:

  • 内容类型
  • 编码方式
  • Cookie 信息

响应体

响应体才是真正的数据内容。

例如:

  • 页面 HTML 源码
  • JSON 返回结果
  • 图片二进制内容

常见状态码

200

请求成功。

这通常表示服务器已经正常返回内容。

301 / 302

重定向。

表示资源被跳转到其他地址。

403

禁止访问。

这在反爬场景里很常见,说明服务器拒绝了你的请求。

404

资源不存在。

说明地址写错了,或者目标页面已经没了。

500

服务器内部错误。

通常说明对方服务器本身出了问题,不一定是你代码写错。

请求头为什么重要

很多初学者只会写:

python
requests.get(url)

但很多网站不会这么轻易给你数据,因为它们会检查请求头。

常见请求头之一:User-Agent

它通常用来标识“你是谁”。

浏览器发出的请求通常会带一个正常的浏览器标识。

如果你的请求完全没有这个头,某些网站会怀疑你不是正常用户。

Referer

表示这次请求是从哪个页面跳过来的。

有些网站会检查这个值,如果不符合预期,就不给你内容。

很多登录态、用户状态、会话信息都依赖 Cookie。

如果你不理解 Cookie,后面做登录后页面抓取会非常容易失败。

Cookie 可以简单理解成:服务器让浏览器保存的一小段状态信息。

例如:

  • 登录状态
  • 访问标识
  • 会话标识

浏览器后续再访问同一个站点时,通常会把相关 Cookie 带回去。

这就是为什么:

  • 浏览器里能打开的页面
  • 你用爬虫直接请求时却不一定能打开

原因之一就是:浏览器自动带了 Cookie,而你的代码没有。

为什么爬虫必须懂 HTTP

因为你后面做的所有事情,本质上都建立在 HTTP 之上:

  • requests 发请求
  • 观察返回状态码
  • 带请求头
  • 处理 Cookie
  • 抓接口
  • 分析反爬

如果这些基础不清楚,你看到问题时就很难判断到底是:

  • 地址错了
  • 方法错了
  • 参数错了
  • 头信息不对
  • Cookie 丢了
  • 服务器拒绝了

抓包工具的意义

像 Fiddler、浏览器开发者工具、Charles 这类工具,本质上都是帮你看清楚:

  • 浏览器到底发了什么请求
  • 请求头里带了什么
  • 参数是什么
  • 返回了什么响应

这非常重要,因为很多网站表面看是一个页面,实际上数据可能是通过单独接口返回的。

HTTPS 和证书

现在很多网站都使用 HTTPS。

这意味着浏览器和服务器之间的数据是加密传输的。

对初学者来说,你先记住两点就行:

  • HTTPS 很常见
  • 抓包分析 HTTPS 流量时,有时需要额外处理证书问题

你不需要在这一节就把证书机制学得很深,但要知道它确实会影响抓包和请求分析。

一个完整思路示例

假设你要抓一个新闻列表页,正确思路通常是:

  1. 用浏览器打开页面
  2. 看页面内容是直接写在 HTML 里,还是后端接口返回的
  3. 观察请求方式是 GET 还是 POST
  4. 看是否需要特殊请求头
  5. 看响应是 HTML 还是 JSON
  6. 再决定后面用什么方式提取数据

这就是“先分析,再编码”的爬虫思路。

常见错误

1. 只会跑代码,不会看请求细节

这样一旦请求失败,你就不知道该从哪里排查。

2. 把浏览器看到的页面当成原始响应

有些页面是 JavaScript 动态渲染的,浏览器显示出来的内容,不一定直接存在于最初返回的 HTML 中。

3. 看到 200 就以为成功了

有时服务器虽然返回 200,但内容其实是:

  • 空页面
  • 登录页
  • 验证页
  • 错误提示页

所以不能只看状态码,还要看响应内容。

练习题

练习 1

自己描述一遍浏览器打开网页的大致流程。

练习 2

解释 GET 和 POST 的区别,并分别举例。

练习 3

整理一份常见状态码清单,写出 200403404500 的意义。

练习 4

思考一个问题:为什么同一个网站,浏览器能打开,爬虫代码却可能被拒绝?

练习 5

用浏览器开发者工具观察一个简单网页请求,看看它的请求方法、状态码和响应类型。

本节小结

爬虫真正的基础,不是某个框架,而是 HTTP。

你这一节最重要的收获应该是:

  • 知道爬虫本质是在自动获取网络数据
  • 理解浏览器访问网页的基本流程
  • 理解 HTTP 请求和响应
  • 分清 GET、POST、状态码、请求头、响应体
  • 知道 Cookie 和抓包工具为什么重要

只要这一层建立起来,后面你学 requestsScrapy 和反爬分析时,就不会只停留在“能跑就行”的层面。

Built with VitePress.