python爬虫小案例


准备工作

安装必要库(仅需基础库):

pip install requests beautifulsoup4 lxml

案例1:爬取豆瓣电影Top250(基础HTML解析)

目标:提取豆瓣电影Top250的电影名称、评分、评价人数(适合学习静态页面解析)。

import requests
from bs4 import BeautifulSoup

# 目标URL(豆瓣电影Top250第一页)
url = "https://movie.douban.com/top250?start=0"

# 模拟浏览器请求头(关键:避免被识别为爬虫)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Referer": "https://movie.douban.com/"  # 模拟从豆瓣主页跳转
}

try:
    # 发送GET请求
    response = requests.get(url, headers=headers, timeout=10)
    response.encoding = "utf-8"  # 确保中文正常显示

    # 解析HTML
    soup = BeautifulSoup(response.text, "lxml")  # 使用lxml解析器(高效)

    # 定位电影列表(每个电影项在class为"info"的div中)
    movie_list = soup.find_all("div", class_="info")

    # 提取前5部电影信息
    print("豆瓣电影Top250(前5部):")
    for i, movie in enumerate(movie_list[:5], 1):
        # 电影名称(取第一个class为"title"的span标签)
        title = movie.find("span", class_="title").text.strip()
        # 评分(class为"rating_num"的span标签)
        rating = movie.find("span", class_="rating_num").text.strip()
        # 评价人数(找到包含"人评价"的span标签)
        comment_count = movie.find("div", class_="star").find_all("span")[-1].text.strip()

        print(f"{i}. {title} | 评分:{rating} | {comment_count}")

except Exception as e:
    print(f"爬取失败:{e}")

运行结果:会输出前5部电影的名称、评分和评价人数(如《肖申克的救赎》《霸王别姬》等)。

案例2:下载Unsplash免费图片(二进制文件处理)

目标:从Unsplash(免费图片网站)下载指定图片到本地(适合学习二进制数据保存)。

import requests
import os

# 稳定的Unsplash测试图片链接(2张示例图)
img_urls = [
    "https://images.unsplash.com/photo-1518655048521-f130df041f66",  # 风景图
    "https://images.unsplash.com/photo-1505761671935-60b3a7427bad"   # 动物图
]

# 模拟浏览器请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36",
    "Referer": "https://unsplash.com/"  # 防盗链验证
}

# 创建保存图片的文件夹
if not os.path.exists("unsplash_photos"):
    os.makedirs("unsplash_photos")

# 循环下载图片
for i, url in enumerate(img_urls, 1):
    try:
        # 发送请求获取图片二进制数据(用content属性)
        response = requests.get(url, headers=headers, timeout=10)

        if response.status_code == 200:
            # 保存图片(二进制模式"wb")
            img_path = f"unsplash_photos/photo_{i}.jpg"
            with open(img_path, "wb") as f:
                f.write(response.content)
            print(f"第{i}张图片下载成功,保存至:{img_path}")
        else:
            print(f"第{i}张图片下载失败,状态码:{response.status_code}")

    except Exception as e:
        print(f"第{i}张图片下载出错:{e}")

运行结果:当前目录会生成unsplash_photos文件夹,内含2张下载的图片。

案例3:调用GitHub公开API(JSON数据解析)

目标:通过GitHub公开API获取指定仓库的信息(适合学习API接口调用和JSON解析)。

import requests

# GitHub公开API(获取"requests"库的仓库信息,无需认证)
repo_owner = "psf"  # 仓库所有者(Python软件基金会)
repo_name = "requests"  # 仓库名(requests库)
url = f"https://api.github.com/repos/{repo_owner}/{repo_name}"

# 请求头(GitHub API要求必须有User-Agent)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}

try:
    # 发送GET请求
    response = requests.get(url, headers=headers, timeout=10)

    if response.status_code == 200:
        # 解析JSON数据(直接用response.json()转为字典)
        repo_info = response.json()

        # 提取关键信息
        print(f"仓库名称:{repo_info['name']}")
        print(f"描述:{repo_info['description']}")
        print(f"星标数:{repo_info['stargazers_count']}")
        print(f"分支数:{repo_info['forks_count']}")
        print(f"最后更新时间:{repo_info['updated_at']}")
    else:
        print(f"API请求失败,状态码:{response.status_code}")

except Exception as e:
    print(f"请求出错:{e}")

运行结果:输出requests库的仓库信息(如星标数、分支数等)。

案例4:模拟表单提交(POST请求)

目标:通过测试接口模拟表单提交,查看服务器返回的结果(适合学习POST请求用法)。

import requests

# 公开测试接口(会返回提交的表单数据,无反爬)
url = "https://httpbin.org/post"

# 表单数据(模拟用户登录信息)
form_data = {
    "username": "test_user",
    "password": "123456",
    "hobby": ["reading", "coding"],  # 列表会自动转为多值参数
    "remember_me": "true"
}

try:
    # 发送POST请求(用data参数传递表单数据)
    response = requests.post(url, data=form_data, timeout=10)

    if response.status_code == 200:
        # 解析JSON响应,查看服务器收到的数据
        result = response.json()
        print("服务器收到的表单数据:")
        print(result["form"])  # 服务器返回的表单数据
    else:
        print(f"提交失败,状态码:{response.status_code}")

except Exception as e:
    print(f"请求出错:{e}")

运行结果:输出服务器收到的表单数据(与提交的form_data一致)。

案例5:爬取维基百科表格数据(表格解析)

目标:提取维基百科“编程语言列表”表格的前5行数据(适合学习HTML表格解析)。

import requests
from bs4 import BeautifulSoup

# 维基百科“编程语言列表”页面(结构稳定,无反爬)
url = "https://en.wikipedia.org/wiki/List_of_programming_languages"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
}

try:
    response = requests.get(url, headers=headers, timeout=10)
    soup = BeautifulSoup(response.text, "lxml")

    # 定位表格(维基百科表格通常有class="wikitable")
    table = soup.find("table", class_="wikitable")

    if table:
        # 提取表头(表格第一行的th标签)
        headers = [th.text.strip() for th in table.find_all("th")[:3]]  # 取前3列
        print("表头:", headers)

        # 提取表格内容(跳过表头行,取前5行数据)
        rows = table.find_all("tr")[1:6]  # 从第2行开始,取5行
        for i, row in enumerate(rows, 1):
            # 提取每行的单元格文本(前3列)
            cols = [td.text.strip() for td in row.find_all("td")[:3]]
            print(f"行{i}:", cols)
    else:
        print("未找到表格数据")

except Exception as e:
    print(f"爬取失败:{e}")

运行结果:输出编程语言列表的表头和前5行数据(如语言名称、设计者、年份等)。

关键说明

  1. 可运行性:所有案例均使用公开稳定的网站/接口(豆瓣、GitHub、维基百科、httpbin等),无复杂反爬,复制代码即可运行。
  2. 核心知识点
  3. 案例1:静态页面解析(BeautifulSoup提取标签内容)
  4. 案例2:二进制文件下载(response.content保存图片)
  5. 案例3:API接口调用(JSON数据解析)
  6. 案例4:POST请求(表单提交)
  7. 案例5:HTML表格解析(提取结构化数据)
  8. 反爬提示:代码中已添加基础请求头(User-Agent、Referer),避免被简单反爬拦截;若运行失败,可尝试更换User-Agent(浏览器F12开发者工具中获取)。

通过这5个案例,可掌握爬虫入门的核心技能:发送请求、解析数据、处理文件、应对基础反爬。