python 爬虫
🐍 Python 爬虫入门笔记
一、Requests 模块(发送 HTTP 请求)
✅ 基本概念
requests
是一个用于发送 HTTP 请求的第三方库,遵循 HTTP 协议,通过构造请求头和请求体,向服务器发起请求并获取响应结果。
✅ 发送 GET 请求
import requests
url = "https://baidu.com"
res = requests.get(url)
✅ 常用属性
res.status_code
:HTTP 响应状态码(200 表示成功)res.headers
:响应头信息res.text
:响应正文(字符串格式)res.content
:响应正文(字节流,适合下载图片/文件)res.json()
:将响应内容解析为 JSON 格式(适用于 API 接口)
✅ 添加请求头(模拟浏览器访问)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0 Safari/537.36'
}
res = requests.get(url, headers=headers)
✅ 异常处理(推荐做法)
try:
res.raise_for_status() # 如果状态码不是 2xx,抛出异常
except requests.exceptions.HTTPError as err:
print(f"HTTP 错误: {err}")
except requests.exceptions.RequestException as e:
print(f"请求失败: {e}")
你说得非常对!在使用 requests
进行网页爬取时,模拟浏览器请求头(Headers) 是绕过网站反爬机制的重要手段。下面是对你这段话的 详细补充与实战建议,帮助你系统掌握请求头的添加顺序和策略。
✅ 请求头添加策略(逐步增强)
📌 第一步:添加 User-Agent
这是最基本的伪装方式,用于告诉服务器你是浏览器访问而不是爬虫。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0 Safari/537.36'
}
res = requests.get(url, headers=headers)
💡 常见 User-Agent 可以通过 https://www.whatismybrowser.com/guides/the-latest-user-agent/ 获取最新版本。
自动随机 User-Agent 推荐:
pip install fake-useragent
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
📌 第二步:添加 Referer
有些网站会检查请求来源,防止图片或资源被其他网站盗用。添加 Referer
模拟从某个页面跳转过来。
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.google.com/'
}
res = requests.get(url, headers=headers)
常见 Referer 示例:
https://www.google.com/
https://www.baidu.com/
- 或者目标网站本身的首页地址
📌 第三步:添加 Cookie
如果前两步仍无法获取正确内容,说明网站可能依赖登录状态或 Cookie 来识别用户身份。
你可以手动复制浏览器中的 Cookie,或者通过登录接口获取。
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.google.com/',
'Cookie': 'your_cookie_string_here;'
}
res = requests.get(url, headers=headers)
如何获取 Cookie?
- 打开浏览器开发者工具(F12)
- 切换到 Network 标签
- 刷新页面,点击任意请求 → Headers → 查看 Request Headers 中的
Cookie
📌 第四步:添加完整 Headers(进阶)
某些网站会检测多个 Header 字段,如:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8',
'Referer': 'https://www.google.com/',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
# 'Cookie': 'your_cookie_here'
}
这些字段可以更真实地模拟浏览器行为,适用于对抗较复杂的反爬机制。
🧠 总结:请求头添加顺序推荐
步骤 | 添加字段 | 目的 |
---|---|---|
1️⃣ | User-Agent |
最基本的浏览器伪装 |
2️⃣ | Referer |
防止资源盗链 |
3️⃣ | Cookie |
维持登录状态或用户标识 |
4️⃣ | 其他 Headers(Accept、Encoding 等) | 更高仿浏览器特征 |
🔒 提示:关于 Cookie 和 Session 的高级操作
如果你需要模拟登录,建议使用 requests.Session()
来保持 Cookie:
session = requests.Session()
# 登录请求
login_data = {'username': 'test', 'password': '123'}
session.post('https://example.com/login', data=login_data)
# 后续请求自动携带 Cookie
res = session.get('https://example.com/dashboard')
🚀 实战建议
- 先简单再复杂:先只加
User-Agent
,不行再加Referer
,还不行再加Cookie
。 - 使用抓包工具辅助:Chrome DevTools、Postman、Charles、Fiddler。
- 避免硬编码敏感信息:如 Cookie,应考虑安全存储或使用 API 接口登录。
如果你提供具体的 URL 或你想爬取的目标网站,我可以帮你定制完整的 Headers 和请求策略 😊
二、正则表达式 re 模块(提取数据)
✅ 基本概念
正则表达式是一种强大的文本匹配工具,可以用于从 HTML 页面中提取特定结构的数据。
✅ 常用方法
re.findall(pattern, string)
:返回所有匹配的内容,以列表形式呈现
✅ 示例
import re
pattern = r"<title>(.*?)</title>" # 匹配<title>标签中的内容
result = re.findall(pattern, res.text)
print(result)
💡 可将
res.text
作为源字符串传入re.findall()
中,实现对网页内容的提取。
三、with open 文件操作(保存数据)
✅ 基本概念
在 Python 中,使用 with open(...)
可以安全地打开和关闭文件。它自动管理资源释放,避免因异常导致文件未关闭。
✅ 写入文件(UTF-8 编码)
with open("output.txt", "w", encoding="utf-8") as f:
f.write("这是写入的内容")
✅ 读取文件
with open("output.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
✅ 为什么使用 with?
- 自动调用
file.close()
,无需手动关闭文件 - 提高代码可读性和健壮性
- 类似于
try...finally
的结构,即使发生异常也会正确关闭文件
✅ 实现原理
with
语句依赖上下文管理器:
__enter__()
:进入with
块时执行__exit__()
:退出with
块时自动执行(无论是否发生异常)
例如:
with open("data.txt", "r") as f:
data = f.read()
等价于:
f = open("data.txt", "r")
try:
data = f.read()
finally:
f.close()
非常棒的笔记!你已经对 with open
的使用、原理和文件对象 f
有了清晰的理解。下面我来为你补充两个重点内容:
为什么 Windows 系统推荐使用 UTF-8 编码?
🧩 背景知识:
Windows 系统默认的文本编码是 GBK 或 CP1252(根据不同地区),而 Linux/macOS 默认使用 UTF-8。
但在现代开发中,尤其是涉及网络请求、爬虫、跨平台协作时,强烈建议统一使用 UTF-8 编码。
✅ 使用 UTF-8 的好处:
原因 | 说明 |
---|---|
✅ 支持全球语言 | UTF-8 可以表示几乎所有语言的字符(包括中文、日文、韩文、阿拉伯语等) |
✅ 避免乱码问题 | 如果不指定 encoding='utf-8',读写含中文的文件可能会出现乱码 |
✅ 跨平台兼容性好 | 在不同操作系统之间传输文件不会出错 |
✅ Web 和 API 默认编码 | 网络数据通常使用 UTF-8,本地保存也用 UTF-8 更一致 |
💡 示例对比:
# 不加 encoding 参数(在 Windows 上默认是 gbk),遇到中文会报错
with open("data.txt", "r") as f:
print(f.read()) # 报错:UnicodeDecodeError
# 推荐写法
with open("data.txt", "r", encoding="utf-8") as f:
print(f.read())
⚠️ 如果你不确定文件的编码格式,可以用文本编辑器(如 VS Code、Notepad++)查看或转换为 UTF-8。
文件对象 f
是什么?有哪些常用方法?
当你使用 with open(...) as f:
时,f
是一个 文件对象(file object),也被称为 文件句柄(file handle)。
- 文件句柄是一个用于操作打开文件的对象。
- 它提供了读取、写入、定位等方法(如 .read(), .write(), .seek() 等)。
- 在操作系统层面,它是一个指向文件资源的引用,用于管理文件的输入输出。
🔹 常用方法一览:
方法 | 说明 |
---|---|
f.read() |
一次性读取整个文件内容(字符串) |
f.readline() |
每次读取一行 |
f.readlines() |
读取所有行并返回一个列表 |
f.write(content) |
写入字符串到文件 |
f.writelines(lines) |
写入多个字符串组成的列表 |
f.seek(offset) |
移动文件指针位置(用于定位读写位置) |
f.tell() |
获取当前文件指针的位置 |
f.close() |
关闭文件(使用 with 时自动调用) |
🔹 示例代码:
1. 读取所有内容
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
2. 按行读取
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip() 去除换行符
3. 写入多行内容
lines = ["第一行\n", "第二行\n", "第三行\n"]
with open("output.txt", "w", encoding="utf-8") as f:
f.writelines(lines)
四、总结流程(爬虫基本步骤)
- 使用
requests.get()
获取网页内容 - 使用
res.text
或res.content
提取响应正文 - 使用
re.findall()
提取所需数据 - 使用
with open(...)
将提取的数据保存到本地文件
🔁 完整示例(爬取百度首页标题)
import requests
import re
url = "https://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0 Safari/537.36"
}
res = requests.get(url, headers=headers)
# 提取 <title> 标签内容
title = re.findall(r"<title>(.*?)</title>", res.text)
print("页面标题:", title)
# 保存响应内容到本地
with open("baidu.html", "w", encoding="utf-8") as f:
f.write(res.text)