爬虫理论入门
1.什么是爬虫?
爬虫顾名思义,就像一个在互联网这张大网上沿着链接不断爬行的虫子,不断获取它收集到的所有信息
它按照一定的规则,自动地抓取互联网信息的脚本或程序
2.爬虫的工作原理是什么?
爬虫的本质其实是不断发送http请求
那么如何发送http请求呢?
可以用python的requests库
只要我们获取到了URL(统一资源定位符,每个网页都有自己对应的唯一的URL),就可以通过一些方法发送http请求
发送之后服务器就会收到我们的请求,向我们发出响应,为http响应,它通常包含状态码,头部信息,内容主体
通过服务器的响应,我们可以储存和分析数据,这里由于我们爬取的目的不同,做法也不尽相同。
3.什么是http协议?
我们经常可以看到http协议这个词,那么http到底是什么?
如果你学过计算机导论或者计算机网络,对这个名词一定不陌生
HTTP全称 “HyperText Transfer Protoca”即超文本传输协议,它是位于应用层的一种从客户到服务器的协议。
一个完整的Http请求包含三个部分
请求行,请求头,请求体
4.请求行(Request Line)
一个完整的请求行长这样
1 | “GET /index.html HTTP/1.1” |
方法: GET(获取资源)、POST(提交数据)、PUT、DELETE等
路径: /index.html(请求的资源路径)(有时候除了资源路径,我们还可以设置查询参数来查询信息,不同信息用&分割,查询参数通常在问号后面),比如
1
www.douban.com/movie/top250?start=75&filter=unwatched
协议版本: HTTP/1.1
5.请求方法有哪些?
| 方法 | 描述 |
|---|---|
| GET | 从服务器获取资源,不能更改数据,只能请求 |
| POST | 向服务器发送数据,创建新资源。可以提交表单,文件(发送的数据包含在请求体中) |
| PUT | 向服务器发送数据,更新现有资源(修改资源)。不存在则创新。与POST的区别是,PUT 通常是幂等的,即多次执行相同的 PUT 请求不会产生不同的结果。 |
| DELETE | 从服务器中删除指定资源,请求中包含要删除的资源符 |
| PATCH | 部分修改资源,与PUT类似,但是PATCH不替换整个资源,只修改部分数据 |
| HEAD | 类似于GET,服务器只返回响应头部,不返回实际数据 |
| OPTIONS | 返回服务器支持的HTTP方法,用于检查服务支持哪些请求方法,通常用于跨域资源共享的预检请求 |
| TRACE | 回显服务器收到的请求,主要用于诊断。客户端可以查看请求在服务器中的处理路径。 |
| CONNECTION | 建立一个到服务器的隧道,通常用于 HTTPS 连接。客户端可以通过该隧道发送加密的数据。 |
6.请求头(Request Headers)
它包含了关于客户端请求的附加信息,以键值对的形式传递给服务器
1.基础标识头 User-Agent(用户代理)
1 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 |
它告诉服务器,客户端的类型和版本
爬虫重要性:⭐⭐⭐⭐⭐
说明:服务器通过这个字段判断是浏览器还是爬虫。如果不设置或使用默认值,很容易被识别为爬虫。
Mozilla/5.0其实是一个出于兼容性考虑而保留的“遗产”令牌,当时很多网站会检查User-Agent,如果是Mozilla就提供高级功能(框架),否则提供基础页面。为了能接收到最好的网页,现在几乎所有浏览器都自称是Mozilla以保持兼容。
Windows NT 10.0; Win64; x64描述操作系统平台。
注意:由于 User-Agent字符串变得非常复杂、容易伪造,并且可能被用于指纹追踪用户,谷歌等公司正在推动一项名为 User-Agent Client Hints 的新标准来逐步取代它。新标准旨在让用户拥有更多隐私控制权,只在必要时向服务器提供特定的设备信息,而不是一次性全部发送。
2.主机(host)
1 | Host: cgyy.nenu.edu.cn |
它是HTTP/1.1必需字段,可以指定请求的目标服务器域名
3.内容协商头 Accept
1 | Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
告诉服务器,客户端能够处理哪些内容类型
常见值:
text/html HTML文档
application/json json数据
image/*- 所有图片类型
4.可接受语言Accept-Language
1 | Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 |
- 作用:告诉服务器客户端的语言偏好
- 爬虫重要性:⭐⭐⭐
zh-CN: 这是首选语言。zh代表中文,-CN是子标签,代表中国大陆地区使用的中文(简体中文)。zh;q=0.9: 这是次选语言。zh代表所有中文变体(如简体或繁体),如果没有zh-CN,也可以用其他中文版本。q=0.9表示优先级权重是 0.9(范围 0-1,1 是最高)。en;q=0.8: 这是第三选择。en代表英语,优先级权重是 0.8。
5.Accept-Encoding(可接受的编码)
1 | Accept-Encoding: gzip, deflate, br |
- 作用:告诉服务器客户端支持的压缩格式
- 说明:服务器可能会返回压缩后的内容,需要解压
- 连接管理头
1 | Connection: keep-alive |
- 作用:控制连接是否保持活跃
- 常见值:
keep-alive- 保持连接close- 关闭连接
7.缓存相关头If-Modified-Since
1 | If-Modified-Since: Wed, 18 Sep 2025 01:00:00 GMT |
- 作用:如果资源在此时间后没有修改,返回304状态码
8. 认证和安全头Authorization(认证)
1 | Authorization: Bearer eyJhbGciOiJSUzI1NiJ9... |
- 作用:包含认证凭证
- 常见类型:
Basic- 基本认证Bearer- Token认证Digest- 摘要认证
9.Cookie
1 | Cookie: session_id=abc123; user_token=xyz456 |
- 作用:向服务器发送之前存储的Cookie
- 爬虫重要性:⭐⭐⭐⭐⭐
- 格式:
name=value对,用分号分隔
10. 来源和引用头Referer(引用来源)
1 | Referer: https://cgyy.nenu.edu.cn/booking |
- 作用:告诉服务器当前请求是从哪个页面链接过来的
- 爬虫重要性:⭐⭐⭐⭐
- 注意:有些网站会检查Referer来防止盗链
Origin(来源)
1 | Origin: https://cgyy.nenu.edu.cn |
- 作用:表明请求的来源,用于CORS(跨域资源共享)
这是一个爬虫常用请求头举例
1 | headers = { |
除了这一种方法,还可以使用Session对象
1 | session = requests.Session() |
后续我会对这两种的使用进行扩展说明(其实是我觉得我现在水平还不够)
7.如何获取查看请求头?
浏览器开发者工具查看
- 按F12打开开发者工具
- 切换到Network(网络)标签
- 刷新页面或触发请求
- 点击具体请求,查看Headers标签
Python中查看响应头
1 | import requests |
注意!网站通常会检测以下头信息来识别爬虫:
- User-Agent:非浏览器或默认Python UA
- Accept、Accept-Language:缺失或不合理
- Referer:缺失或不符合正常浏览流程
- Cookie:缺失或异常
- 其他头字段:如
Sec-开头的安全头
8.HTTP状态码
1开头的状态码(信息类):表示请求正在处理
2开头的状态码(成功):请求正常处理
3开头的状态码(重定向):需要后续操作才能完成请求
4开头的状态码(客户端错误):请求包含语法错误或无法完成
5开头的状态码(服务器错误):服务器处理请求过程中发生错误了
常见状态码
| 200 | 请求成功 |
|---|---|
| 301 | 资源被永久移动到新地址 |
| 400 | 客户端不能被服务器理解 |
| 401 | 客户未经授权 |
| 403 | 服务器拒绝提供服务 |
| 404 | 请求资源不存在 |
| 500 | 服务器发生不可预期的错误 |
| 503 | 服务器不能处理客户端请求 |
1 | import requests |