爬虫理论入门

爬虫

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. 连接管理头
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
2
3
4
5
6
7
8
9
10
11
headers = {
'Host': 'cgyy.nenu.edu.cn',
'Connection': 'keep-alive',
'Accept': '*/*',
'Content-Type': 'application/json',
'Cookie': 'acw_tc=ac11000117581585555872261e488f4d176bbf7b6670727206b5636e12a130',
'Origin': 'https://cgyy.nenu.edu.cn',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36',
'token': 'eyJhbGciOiJSUzI1NiJ9...',
'Referer': 'https://cgyy.nenu.edu.cn/'
}

除了这一种方法,还可以使用Session对象

1
2
3
4
5
6
7
session = requests.Session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9'
})

response = session.get('https://example.com')

后续我会对这两种的使用进行扩展说明(其实是我觉得我现在水平还不够)

7.如何获取查看请求头?

浏览器开发者工具查看

  1. 按F12打开开发者工具
  2. 切换到Network(网络)标签
  3. 刷新页面或触发请求
  4. 点击具体请求,查看Headers标签

Python中查看响应头

1
2
3
4
5
import requests

response = requests.get('https://httpbin.org/headers')
print("请求头:", response.request.headers)
print("响应头:", response.headers)

注意!网站通常会检测以下头信息来识别爬虫:

  1. User-Agent:非浏览器或默认Python UA
  2. AcceptAccept-Language:缺失或不合理
  3. Referer:缺失或不符合正常浏览流程
  4. Cookie:缺失或异常
  5. 其他头字段:如Sec-开头的安全头

8.HTTP状态码

1开头的状态码(信息类):表示请求正在处理

2开头的状态码(成功):请求正常处理

3开头的状态码(重定向):需要后续操作才能完成请求

4开头的状态码(客户端错误):请求包含语法错误或无法完成

5开头的状态码(服务器错误):服务器处理请求过程中发生错误了

常见状态码

200 请求成功
301 资源被永久移动到新地址
400 客户端不能被服务器理解
401 客户未经授权
403 服务器拒绝提供服务
404 请求资源不存在
500 服务器发生不可预期的错误
503 服务器不能处理客户端请求
1
2
3
4
5
6
7
import requests

response = requests.get("URL")
if response.ok:
print(response.text)
else:
print("请求失败")