爬虫基础与HTTP
爬虫最核心的事情,其实可以概括成一句话:
程序代替浏览器去访问网络资源,再从返回结果里提取你真正需要的数据。
所以如果你连 HTTP 请求和响应都没搞清楚,后面就很容易变成只会照抄代码,不知道为什么能抓、为什么抓不到、为什么会被拦。
本节目标
- 理解什么是爬虫
- 理解浏览器访问网页的基本流程
- 理解 HTTP 请求和响应
- 理解常见请求方法和状态码
- 理解请求头、响应体、Cookie、Referer、User-Agent 的作用
- 建立分析网页请求流程的基础能力
什么是爬虫
爬虫不是神秘技术,本质上就是自动化获取网络数据。
例如:
- 获取商品列表
- 获取文章标题
- 获取评论信息
- 获取接口返回的数据
你平时用浏览器打开网页,是“人看页面”;爬虫则是“程序拿数据”。
所以爬虫的核心任务不是把页面显示得多漂亮,而是找到目标数据并提取出来。
浏览器访问网页时到底发生了什么
你在浏览器地址栏输入一个网址时,大致会经历这些步骤:
- 浏览器向服务器发请求
- 服务器返回响应内容
- 浏览器解析 HTML、CSS、JavaScript
- 页面被渲染出来
而爬虫最关心的是前两步:
- 请求发了什么
- 服务器回了什么
只要这两步理解清楚,后面的采集工作就有了抓手。
HTTP 是什么
HTTP 是浏览器和服务器通信时常见的协议。
你可以先把它理解成一套“双方说话的规则”。
浏览器不会无缘无故知道一个页面长什么样,必须先按 HTTP 规则发请求,服务器再按 HTTP 规则回响应。
什么是请求
请求就是“客户端向服务器发出的一次访问动作”。
例如你访问:
https://example.com/news/浏览器会向服务器发出一个请求,问它:
“请把这个地址对应的内容给我。”
一个请求通常包含什么
HTTP 请求中常见的信息包括:
- 请求方法
- 请求地址
- 请求头
- 请求参数
- 请求体
请求方法
常见有:
GETPOST
请求地址
也就是访问目标,例如:
https://example.com/api/user请求头
请求头里会携带一些附加信息,例如:
- 你是什么客户端
- 你从哪里来
- 你能接受什么内容
请求参数
例如:
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
服务器内部错误。
通常说明对方服务器本身出了问题,不一定是你代码写错。
请求头为什么重要
很多初学者只会写:
requests.get(url)但很多网站不会这么轻易给你数据,因为它们会检查请求头。
常见请求头之一:User-Agent
它通常用来标识“你是谁”。
浏览器发出的请求通常会带一个正常的浏览器标识。
如果你的请求完全没有这个头,某些网站会怀疑你不是正常用户。
Referer
表示这次请求是从哪个页面跳过来的。
有些网站会检查这个值,如果不符合预期,就不给你内容。
Cookie
很多登录态、用户状态、会话信息都依赖 Cookie。
如果你不理解 Cookie,后面做登录后页面抓取会非常容易失败。
Cookie 到底是什么
Cookie 可以简单理解成:服务器让浏览器保存的一小段状态信息。
例如:
- 登录状态
- 访问标识
- 会话标识
浏览器后续再访问同一个站点时,通常会把相关 Cookie 带回去。
这就是为什么:
- 浏览器里能打开的页面
- 你用爬虫直接请求时却不一定能打开
原因之一就是:浏览器自动带了 Cookie,而你的代码没有。
为什么爬虫必须懂 HTTP
因为你后面做的所有事情,本质上都建立在 HTTP 之上:
- 用
requests发请求 - 观察返回状态码
- 带请求头
- 处理 Cookie
- 抓接口
- 分析反爬
如果这些基础不清楚,你看到问题时就很难判断到底是:
- 地址错了
- 方法错了
- 参数错了
- 头信息不对
- Cookie 丢了
- 服务器拒绝了
抓包工具的意义
像 Fiddler、浏览器开发者工具、Charles 这类工具,本质上都是帮你看清楚:
- 浏览器到底发了什么请求
- 请求头里带了什么
- 参数是什么
- 返回了什么响应
这非常重要,因为很多网站表面看是一个页面,实际上数据可能是通过单独接口返回的。
HTTPS 和证书
现在很多网站都使用 HTTPS。
这意味着浏览器和服务器之间的数据是加密传输的。
对初学者来说,你先记住两点就行:
- HTTPS 很常见
- 抓包分析 HTTPS 流量时,有时需要额外处理证书问题
你不需要在这一节就把证书机制学得很深,但要知道它确实会影响抓包和请求分析。
一个完整思路示例
假设你要抓一个新闻列表页,正确思路通常是:
- 用浏览器打开页面
- 看页面内容是直接写在 HTML 里,还是后端接口返回的
- 观察请求方式是 GET 还是 POST
- 看是否需要特殊请求头
- 看响应是 HTML 还是 JSON
- 再决定后面用什么方式提取数据
这就是“先分析,再编码”的爬虫思路。
常见错误
1. 只会跑代码,不会看请求细节
这样一旦请求失败,你就不知道该从哪里排查。
2. 把浏览器看到的页面当成原始响应
有些页面是 JavaScript 动态渲染的,浏览器显示出来的内容,不一定直接存在于最初返回的 HTML 中。
3. 看到 200 就以为成功了
有时服务器虽然返回 200,但内容其实是:
- 空页面
- 登录页
- 验证页
- 错误提示页
所以不能只看状态码,还要看响应内容。
练习题
练习 1
自己描述一遍浏览器打开网页的大致流程。
练习 2
解释 GET 和 POST 的区别,并分别举例。
练习 3
整理一份常见状态码清单,写出 200、403、404、500 的意义。
练习 4
思考一个问题:为什么同一个网站,浏览器能打开,爬虫代码却可能被拒绝?
练习 5
用浏览器开发者工具观察一个简单网页请求,看看它的请求方法、状态码和响应类型。
本节小结
爬虫真正的基础,不是某个框架,而是 HTTP。
你这一节最重要的收获应该是:
- 知道爬虫本质是在自动获取网络数据
- 理解浏览器访问网页的基本流程
- 理解 HTTP 请求和响应
- 分清 GET、POST、状态码、请求头、响应体
- 知道 Cookie 和抓包工具为什么重要
只要这一层建立起来,后面你学 requests、Scrapy 和反爬分析时,就不会只停留在“能跑就行”的层面。