爬虫实战,Cookie和Session登录模拟,以及代理IP使用详解的内容。

一 爬虫的基本工作流程

步骤 操作 目的
1️⃣ 分析目标网页结构 使用浏览器开发者工具(F12)查看网络请求、HTML 结构
2️⃣ 构造请求头信息(headers) 设置 User-Agent、Referer、Cookie 等字段,模拟浏览器行为
3️⃣ 发送 HTTP 请求 GET / POST 方法选择,构造参数(params / data)
4️⃣ 接收响应内容(response) 获取 HTML / JSON / 图片等资源
5️⃣ 解析响应内容 使用 BeautifulSoup、json、lxml 等解析数据
6️⃣ 存储或处理数据 写入文件、数据库或进行可视化分析

二:静态资源爬取 —— 图片、音频、视频

2.1 下载网易云音乐封面图

import requests
from fake_useragent import UserAgent

url = "https://p1.music.126.net/W49WgaduTlqsGdb2H7qV7g==/109951171136346838.jpg?imageView&quality=89"
headers = {"User-Agent": UserAgent().random}

response = requests.get(url, headers=headers)
with open("网易云爬取.jpg", "wb") as f:
    f.write(response.content)

说明:使用 requests.get() 获取二进制数据,并以 wb 模式保存为图片文件。

2.2 下载歌曲音频(MP3)

url = "https://m804.music.126.net/.../57706dc05dee50ae43519481cf4aa678.m4a"
headers = {"User-Agent": UserAgent().random}

response = requests.get(url, headers=headers)
with open("网易云.mp3", "wb") as f:
    f.write(response.content)

⚠️ 注意:部分音乐平台对链接设置了防盗链,可能需要添加 Referer 或 Cookie 才能访问。

2.3 下载 MV 视频(MP4)

url = "https://vodkgeyttp8.vod.126.net/cloudmusic/c15f/core/...mp4?wsSecret=..."
headers = {"User-Agent": UserAgent().random}

response = requests.get(url, headers=headers)
with open("网易云.mp4", "wb") as mv:
    mv.write(response.content)

提示:大文件建议分块下载(使用 stream=True),避免内存占用过高。


第三章:百度贴吧数据爬取实战

3.1 单页贴吧爬取

url = "https://tieba.baidu.com/f?"
headers = {
    "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 ..."
}
params = {
    "kw": "蔡徐坤",
    "ie": "utf-8"
}
response = requests.get(url, headers=headers, params=params)

with open("蔡徐坤.html", "wb") as f:
    f.write(response.content)

3.2 多页贴吧爬取(带翻页)

Step 1:分析 URL 规律

  • 打开百度贴吧 → 搜索“蔡徐坤”
  • 在地址栏看到 URL:
    https://tieba.baidu.com/f?kw=%E8%94%A1%E5%BE%90%E5%9D%A4&ie=utf-8
  • 翻页后发现 URL 变为:
    https://tieba.baidu.com/f?kw=%E8%94%A1%E5%BE%90%E5%9D%A4&ie=utf-8&pn=50

规律总结

  • pn 表示页码偏移量
  • 每页显示 50 条帖子
  • 第一页 pn=0,第二页 pn=50,第三页 pn=100...
for i in range(pages):
    params = {
        "kw": word,
        "ie": "utf-8",
        "pn": i * 50
    }
    res = requests.get(url, headers=headers, params=params)
    with open(f"{word}{i+1}.html", "wb") as f:
        f.write(res.content)

规律总结

  • 百度贴吧每页显示 50 条帖子
  • 参数 pn 控制翻页:第一页 pn=0,第二页 pn=50,以此类推

3.3 面向对象版本封装

class TieBaInfoGet:
    def __init__(self):
        self.url = "https://tieba.baidu.com/f?"
        self.headers = {"User-Agent": "..."}
    
    def get(self, params):
        return requests.get(self.url, headers=self.headers, params=params).content
    
    def save(self, filename, content):
        with open(f"{filename}.html", "wb") as f:
            f.write(content)
    
    def run(self):
        word = input("请输入贴吧名称:")
        pages = int(input("请输入要爬取的页数:"))
        for page in range(pages):
            params = {"kw": word, "ie": "utf-8", "pn": page * 50}
            data = self.get(params)
            self.save(f"{word}_{page+1}", data)

优点:代码结构清晰、易于维护和扩展。


第四章:POST 请求与参数提交

4.1 GET vs POST 对比

特性 GET POST
参数位置 URL 中(查询字符串) 请求体中
安全性 不安全(暴露参数) 相对更安全
数据长度限制 有限(URL 长度限制) 几乎无上限
用途 获取数据 提交数据(如登录、注册)

4.2 示例:金山词霸翻译接口

url = "https://ifanyi.iciba.com/index.php?c=trans"
data = {
    "from": "auto",
    "to": "auto",
    "q": input("请输入要翻译的内容:")
}
headers = {"User-Agent": "Mozilla/5.0 ..."}

res = requests.post(url, data=data, headers=headers)
result = json.loads(res.text)
print(result['out'])

说明:使用 requests.post(data=...) 提交表单数据,返回 JSON 格式结果。


第五章:Cookie 和 Session 登录模拟

5.1 Cookie 的作用

  • Cookie 是服务器在客户端存储的一段小文本,用于标识用户身份。
  • 常用于模拟登录,访问受保护页面。

5.2 示例:Bilibili 登录后访问首页

url = "https://www.bilibili.com/"
headers = {
    "User-Agent": "...",
    "Cookie": "你的完整 Cookie 字符串"
}
res = requests.get(url, headers=headers)
print(res.text)

⚠️ 缺点:Cookie 有时效性,容易过期,且手动复制易出错。

5.3 Session 自动管理 Cookie

session = requests.Session()
session.post(login_url, data=login_data)
res = session.get(protected_url)

优势

  • 自动保存 Cookie
  • 自动携带到后续请求中
  • 更适合模拟登录流程

5.4 Cookie 和 Session 的核心作用

1. Cookie 的核心作用

  • 状态保持:在无状态的 HTTP 协议中,Cookie 是一种让服务器“记住”客户端状态的方式。
  • 身份识别:通过存储用户标识(如 Session ID 或 Token),帮助服务器识别用户身份。
  • 跨请求共享数据:可以在多个页面或请求之间共享少量数据。

典型应用场景:

  • 用户登录状态保持
  • 购物车信息记录
  • 个性化设置(如语言偏好)
  • 网站访问统计与行为分析

2. Session 的核心作用

  • 会话管理:在服务器端维护用户的会话状态,存储敏感信息或复杂结构的数据。
  • 安全性更高:因为数据存储在服务器端,不容易被窃取或篡改。
  • 持久性:可以根据需要设定过期时间,支持更灵活的状态管理。

典型应用场景:

  • 用户登录后的权限控制
  • 存储敏感信息(如购物车内容、支付信息等)
  • 多步骤表单填写过程中的状态保持

Cookie 和 Session 的主要区别

特性 Cookie Session
存储位置 客户端(浏览器) 服务端(内存 / 数据库 / 缓存)
安全性 较低,容易被篡改或窃取 较高,敏感数据不暴露给客户端
数据量限制 每个 Cookie 不超过 4KB,每个域名最多 20 个 Cookie 取决于服务器配置,理论上可以存储更多数据
生命周期 可以设置过期时间(如 Max-Age 或 Expires),也可以是会话级别的(关闭浏览器即失效) 一般由服务器控制,可以设置较长时间的有效期
传输方式 每次请求都会自动携带 Cookie 到服务器 需要通过某种方式(如 Cookie 中的 Session ID)关联到 Session 数据
适用场景 存储轻量级、非敏感的数据 存储敏感信息、复杂结构数据,适合需要高安全性的场景

第六章:代理 IP 使用详解

6.1 什么是代理 IP?

  • 代理 IP 是一个中间服务器地址,代替我们向目标服务器发送请求。
  • 作用:
    • 防止 IP 被封
    • 绕过地域限制
    • 提高并发能力

6.2 代理类型

类型 特点
透明代理 服务器知道你在用代理,也知道真实 IP
匿名代理 服务器知道用了代理,但不知道真实 IP
高匿代理 服务器不知道用了代理,也不知道真实 IP

6.3 使用代理的格式

proxies = {
    "http": "http://ip:port",
    "https": "https://ip:port"
}
res = requests.get(url, proxies=proxies, headers=headers)

6.4 实战示例

proxies = {
    "http": "http://47.26.117.24:9527"
}
res = requests.get("https://www.baidu.com", proxies=proxies, headers=headers)
print(res.text)

⚠️ 注意

  • 代理 IP 可能不稳定,建议设置超时机制(timeout=5
  • 免费代理质量较低,可考虑购买商业代理服务

6.5 代理池设计思路

proxy_pool = [
    {"http": "http://ip1:port"},
    {"http": "http://ip2:port"},
    ...
]

import random
proxies = random.choice(proxy_pool)

建议

  • 搭建定时任务,定期更新代理池
  • 结合数据库或 Redis 存储有效代理

你可能感兴趣的:(数据库,开发语言,python)