Python爬虫教程(最新实战版)

遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私!

一、环境配置与基础验证

# 验证 Python 版本(需 ≥3.8)
import sys
print(sys.version)  # 应输出类似 3.8.12 的信息

# 安装 requests 库(若未安装)
# 命令行执行:pip install requests

# 基础请求验证
import requests
response = requests.get("https://httpbin.org/get")
print("状态码:", response.status_code)  # 成功返回 200

二、HTTP 请求全流程解析

1. GET 请求原理与实现

# GET 请求参数传递
import requests

params = {"category": "books", "page": 2}
response = requests.get(
    "https://httpbin.org/get",
    params=params,
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
        "Referer": "https://www.example.com"
    }
)
print("最终请求 URL:", response.url)  # 显示自动拼接的完整 URL

# 响应内容解析
print("响应头:", response.headers)
print("JSON 数据:", response.json()["args"])  # 获取查询参数

原理说明

  • GET 请求将参数附加在 URL 后面,通过 ?key1=value1&key2=value2 形式传递
  • headers 参数用于伪装浏览器,避免被反爬机制拦截

  • 2. POST 请求原理与实现

    # 表单数据提交
    import requests
    
    form_data = {"username": "test_user", "password": "p@ssw0rd"}
    response = requests.post(
        "https://httpbin.org/post",
        data=form_data,
        headers={
            "Content-Type": "application/x-www-form-urlencoded"
        }
    )
    print("表单响应:", response.json()["form"])
    
    # JSON 数据提交
    json_data = {"title": "Python 教程", "views": 1500}
    response = requests.post(
        "https://httpbin.org/post",
        json=json_data,
        headers={
            "Content-Type": "application/json"
        }
    )
    print("JSON 响应:", response.json()["json"])
    

    原理说明

  • POST 请求通过请求体传递数据,需显式设置 Content-Type
  • json= 参数会自动序列化字典并设置正确头信息
  • response 的核心属性

    # 文本形式
    print("文本形式:", response.text)  # 返回文本形式
    
    # 解析JSON格式响应
    print("JSON格式响应:", response.json())  # 解析JSON格式响应
    
    # 状态码(HTTP协议标准代码)
    print("状态码:", response.status_code)  # 200表示成功 
    
    # 响应头(HTTP头信息)
    print("响应头:", response.headers)  # 包含Content-Type、Server等信息  
    
    # 编码格式(自动检测或手动设置)
    print("编码:", response.encoding)  # 默认为'utf-8',可通过response.encoding = 'gbk'修改 
    
    # 原始响应内容(二进制形式)
    print("原始内容:", response.content[:100])  # 前100字节  
    
    # 请求URL(可能因重定向改变)
    print("实际请求URL:", response.url)  # 包含重定向后的最终地址 
     
    

    三、Cookie 全场景管理

    1. 手动设置 Cookie

    import requests
    
    # 通过字典直接设置
    cookies = {"session_id": "a1B2c3D4", "user_token": "x9y8z7"}
    response = requests.get(
        "https://httpbin.org/cookies",
        cookies=cookies
    )
    print("服务器收到的 Cookie:", response.json()["cookies"])
    
    # 使用 RequestsCookieJar 精确控制
    from requests.cookies import RequestsCookieJar
    
    jar = RequestsCookieJar()
    jar.set("tracking", "t1", domain=".example.com", path="/api")
    response = requests.get("https://httpbin.org/cookies", cookies=jar)
    print("精确控制的 Cookie:", response.json())
    

    关键点

  • domainpath 参数需与目标网站匹配
  • RequestsCookieJar 支持复杂 Cookie 操作(如过期时间设置)

  • 2. 会话级 Cookie 管理

    # 使用 Session 对象自动管理
    import requests
    
    with requests.Session() as s:
        # 首次登录设置 Cookie
        login_data = {"user": "admin", "pass": "admin123"}
        s.post("https://httpbin.org/post", data=login_data)
        
        # 后续请求自动携带 Cookie
        response = s.get("https://httpbin.org/cookies")
        print("会话 Cookie:", response.json())
    

    优势

  • 自动复用 TCP 连接,提升请求效率
  • 跨请求保持 Cookies 和 Headers

  • 四、高级特性

    1. 智能重试机制

    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    # 配置重试策略
    retry = Retry(
        total=3,
        backoff_factor=0.5,
        status_forcelist=[500, 502, 503, 504]
    )
    
    # 创建带重试的会话
    session = requests.Session()
    session.mount("https://", HTTPAdapter(max_retries=retry))
    
    try:
        response = session.get(
            "https://httpbin.org/delay/5",  # 模拟慢速响应
            timeout=3  # 超时设置(秒)
        )
    except requests.exceptions.Timeout:
        print("请求超时,已重试 3 次")
    

    参数说明

  • backoff_factor 控制重试间隔时间(如 0.5 秒→1秒→2秒)
  • status_forcelist 指定需要重试的 HTTP 状态码

  • 2. 大文件流式下载

    # 下载网络图片(避免内存溢出)
    import requests
    
    image_url = "https://httpbin.org/image/png"
    response = requests.get(image_url, stream=True)
    
    with open("demo_image.png", "wb") as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)
    print("图片下载完成,文件大小:", len(response.content), "字节")
    

    技术要点

  • stream=True 启用流式传输
  • iter_content() 分块读取响应内容

  • 五、爬虫注意:数据隐私保护

    遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私!

    作者:软件测试技术

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python爬虫教程(最新实战版)

    发表回复