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,或者通过登录接口获取。

headers = {
    'User-Agent': 'Mozilla/5.0',
    'Referer': 'https://www.google.com/',
    'Cookie': 'your_cookie_string_here;'
}
res = requests.get(url, headers=headers)
  1. 打开浏览器开发者工具(F12)
  2. 切换到 Network 标签
  3. 刷新页面,点击任意请求 → 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 等) 更高仿浏览器特征

如果你需要模拟登录,建议使用 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)

四、总结流程(爬虫基本步骤)

  1. 使用 requests.get() 获取网页内容
  2. 使用 res.textres.content 提取响应正文
  3. 使用 re.findall() 提取所需数据
  4. 使用 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)

posted @ 2025-05-30 14:29  玉米面手雷王  阅读(19)  评论(0)    收藏  举报