跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 网络爬虫实战:从基础请求到数据可视化

Python 爬虫技术通过模拟浏览器行为自动抓取网页信息。演示了基于 FastAPI 搭建本地服务器作为目标站点,利用 requests 发送请求,结合正则表达式解析 HTML 内容。流程涵盖数据获取、清洗、入库以及使用 pyecharts 进行可视化展示,并集成 logging 模块记录运行日志,适合初学者掌握爬虫核心逻辑与工程化实践。

kaikai发布于 2026/3/26更新于 2026/10/2581 浏览

Python 网络爬虫实战:从基础请求到数据可视化

搭建本地测试环境

在开始爬取外部网站之前,为了演示爬虫原理,我们通常先搭建一个本地的 Web 服务器作为目标站点。这里使用 FastAPI 框架快速构建服务。

基础路由与响应

创建一个简单的 FastAPI 应用,用于返回 HTML 页面和图片资源。

from fastapi import FastAPI, Response
import uvicorn

app = FastAPI()

@app.get("/index.html")
def main():
    with open("source/html/index.html", "rb") as f:
        data = f.read()
    return Response(content=data, media_type="text/html")

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)

运行后,浏览器访问 http://127.0.0.1:8000/index.html 即可看到页面。需要注意的是,HTML 中引用的图片(如 0.jpg)也需要服务器支持对应的路由。

优化图片资源加载

如果每张图片都写一个函数,代码会非常冗余。我们可以利用 FastAPI 的路径参数功能,动态处理图片请求。

@app.get("/images/{path}")
def get_pic(path: str):
    # 路径拼接:source/images/0.jpg
    file_path = f"source/images/{path}"
    with open(file_path, "rb") as f:
        data = f.read()
    return Response(content=data, media_type="image/jpeg")

@app.get()
 ():
    file_path = 
     (file_path, )  f:
        data = f.read()
     Response(content=data, media_type=)
"/{path}"
def
get_html
path: str
f"source/html/{path}"
with
open
'rb'
as
return
"text/html"

这样无论有多少张图片,只需一个路由即可处理,大大减少了重复代码。

爬虫核心原理与步骤

网络爬虫本质上是一个模拟浏览器行为的程序。基本流程包括:确定起始 URL、发送请求获取响应、解析响应数据、存储数据。

安装依赖

我们需要 requests 库来发送 HTTP 请求。

pip install requests

发送请求

使用 requests.get() 模拟浏览器发起 GET 请求。注意,返回的 Response 对象中的内容需要通过 .content 属性获取原始字节,并解码为字符串。

import requests

response = requests.get("http://127.0.0.1:8000/index.html")
html_content = response.content.decode("utf-8")

图像资源爬取实战

假设我们要抓取页面上展示的所有图片,需要分三步走:获取 HTML、解析图片 URL、下载图片文件。

解析图片链接

通过正则表达式从 HTML 中提取图片地址。这里假设 HTML 结构中包含类似 <img src="..." width="..."> 的标签。

import re

def get_pic_urls(html):
    urls = []
    # 分割 HTML 内容以便匹配
    lines = html.split(' ')
    for line in lines:
        match = re.match(r'.*src="(.*)" width.*', line)
        if match:
            urls.append(match.group(1))
    return urls

保存本地文件

遍历提取到的 URL 列表,再次发起请求并将二进制流写入本地磁盘。

def save_pics(url_list):
    num = 0
    for url in url_list:
        # 去除可能的相对路径前缀
        clean_url = url[1:] if url.startswith('/') else url
        full_url = f"http://127.0.0.1:8000{clean_url}"
        pic_data = requests.get(full_url).content
        
        with open(f"./source/spyder/{num}.jpg", "wb") as f:
            f.write(pic_data)
        num += 1

结构化数据处理 (GDP 示例)

除了图片,我们常需要抓取表格或文本数据。以下示例演示如何抓取 GDP 排名数据。

数据清洗与整合

使用 zip 函数将国家名称和 GDP 数值合并成元组列表,方便后续处理。

import requests
import re

country_list = []
gdp_list = []

def fetch_gdp():
    resp = requests.get("http://localhost:8000/gdp.html")
    html = resp.content.decode("utf-8")
    
    for line in html.split(' '):
        # 提取国家名
        c_match = re.match(r'.*<a><font>(.*)</font></a>', line)
        if c_match:
            country_list.append(c_match.group(1))
        
        # 提取 GDP 数值
        g_match = re.match(r'.*¥(.*)亿元', line)
        if g_match:
            gdp_list.append(g_match.group(1))
    
    # 合并数据
    return list(zip(country_list, gdp_list))

多任务并发优化

当爬取目标较多时,单线程效率较低。可以使用 multiprocessing 模块实现多进程并行处理。

import multiprocessing

def task_pic():
    # 执行图片爬取逻辑
    pass

def task_gdp():
    # 执行 GDP 数据爬取逻辑
    pass

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=task_pic)
    p2 = multiprocessing.Process(target=task_gdp)
    
    p1.start()
    p2.start()
    
    p1.join()
    p2.join()

数据可视化呈现

爬取的数据最终需要直观展示。pyecharts 是 Python 中常用的图表库,支持生成交互式图表。

绘制饼图

from pyecharts.charts import Pie
import pyecharts.options as opts

def render_chart(data):
    pie = Pie(init_opts=opts.InitOpts(width="1400px", height="800px"))
    pie.add("GDP 排名", data, label_opts=opts.LabelOpts(formatter='{b}:{d}%'))
    pie.set_global_opts(title_opts=opts.TitleOpts(title="2020 年世界 GDP 排名"))
    pie.render("gdp_chart.html")

日志监控与调试

在生产环境中,记录日志至关重要。它有助于追踪程序运行状态和排查错误。

配置 Logging

使用 Python 内置的 logging 模块,可以灵活控制日志级别和输出格式。

import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
    filename="app.log",
    filemode="w"
)

logging.info("系统启动成功")
logging.error("发生异常")

日志级别从低到高依次为:DEBUG、INFO、WARNING、ERROR、CRITICAL。默认情况下,只有 WARNING 及以上级别的日志会被记录。在 Web 项目中,建议在入口文件统一配置一次,整个应用即可生效。


通过以上步骤,我们完成了一个包含数据采集、处理、存储及可视化的完整爬虫流程。实际开发中,还需考虑反爬策略、异常处理和分布式部署等问题。

目录

  1. Python 网络爬虫实战:从基础请求到数据可视化
  2. 搭建本地测试环境
  3. 基础路由与响应
  4. 优化图片资源加载
  5. 爬虫核心原理与步骤
  6. 安装依赖
  7. 发送请求
  8. 图像资源爬取实战
  9. 解析图片链接
  10. 保存本地文件
  11. 结构化数据处理 (GDP 示例)
  12. 数据清洗与整合
  13. 多任务并发优化
  14. 数据可视化呈现
  15. 绘制饼图
  16. 日志监控与调试
  17. 配置 Logging

更多推荐文章

查看全部
  • Spring AOP 核心概念与实战解析
  • Qoder AI 编程指南:从安装配置到核心功能实战
  • Web 服务架构与 I/O 模型详解
  • 基于 OpenCV 的 Python 自动扫雷实现
  • 网络安全行业自学与转行建议
  • Unitree RL Gym 强化学习仿真与实物部署指南
  • 位运算实战:位图与异或消消乐高频算法题解析
  • pycdc 反编译 Python 字节码的实用经验
  • C++ 红黑树封装笔记:从泛型复用看 Map 与 Set 的实现
  • VMware 安装 Kali Linux 虚拟机教程
  • Docker 部署 Music-Tag-Web 音乐标签编辑工具
  • Python+Agent 入门实战:0 基础搭建可复用 AI 智能体
  • ChatGPT 实用技巧:文本与数据结构化方法解析
  • Qwen2.5-VL 多模态模型 LoRA 微调实战:LLaMA-Factory WebUI 指南
  • Python 包管理工具 UV 功能介绍及安装
  • 基于 Chainlit 的 Phi-3 模型插件开发:思维链可视化与 Token 统计
  • FPGA 入门教程:基于 Quartus 的 LED 点亮流程
  • AI 自动化测试:接口测试全流程自动化实现方法
  • 环形链表、两个数组中的交集与随机链表复制算法解析
  • Android 程序员转行车载开发技术指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online