🐍 Python 入门系列
Python 数据采集
图解教程
从零开始,通过图解 + 完整代码,掌握数据采集的每一个步骤
🌐 网络爬虫📁 文件读取🔌 API 调用🗄️ 数据库
- [① 什么是数据采集](#① 什么是数据采集)
- [② 数据来源](#② 数据来源)
- [③ 常用库](#③ 常用库)
- [④ 环境安装](#④ 环境安装)
- [⑤ 文件采集](#⑤ 文件采集)
- [⑥ 网络爬虫](#⑥ 网络爬虫)
- [⑦ API 采集](#⑦ API 采集)
- [⑧ 数据库](#⑧ 数据库)
- [⑨ 注意事项](#⑨ 注意事项)
🔍什么是数据采集?
数据采集是数据分析的第一步------将散落在各处的数据统一抓取到本地
🌐网页 / 爬虫📁本地文件🔌API 接口🗄️数据库📡实时流数据🐍Python 数据采集requests · pandas · scrapy📊 分析💾 存储
📥
输入
来自网页、文件、数据库、API 等各种来源的原始数据
⚙️
处理
Python 程序发送请求、解析内容、提取所需字段
📤
输出
结构化数据,可用于分析、可视化或机器学习
📡数据从哪里来?
了解不同来源的特点,选择合适的采集方式
| 来源类型 | 典型例子 | 常用工具 | 难度 | 支持格式 |
|---|---|---|---|---|
| 🌐 网页数据 | 商品信息、新闻、排行榜 | requests + BeautifulSoup | ⭐⭐ | HTML |
| 📁 本地文件 | 成绩表、销售记录、日志 | pandas、open() | ⭐ | CSV Excel JSON |
| 🔌 API 接口 | 天气、股票、地图、翻译 | requests | ⭐⭐ | JSON |
| 🗄️ 数据库 | MySQL、SQLite、MongoDB | pymysql、sqlite3 | ⭐⭐⭐ | SQL |
| 📡 实时流 | 传感器数据、微博热搜 | Kafka、WebSocket | ⭐⭐⭐⭐ | JSON |
📦必学的 Python 库
掌握这几个库,就能完成 90% 的数据采集任务
🌐
requests
发送 HTTP 请求,获取网页内容或调用 API。最基础、最常用的库。
网络请求
🍲
BeautifulSoup4
解析 HTML/XML 文档,轻松提取标签内容、属性、链接等。
HTML解析
🐼
pandas
读取 CSV、Excel 等文件,强大的数据处理与分析框架。
数据处理
🕷️
Scrapy
专业爬虫框架,支持并发采集、自动翻页、数据管道等高级功能。
爬虫框架
🤖
Selenium
操控浏览器,适合需要登录、点击、滚动等 JavaScript 动态页面。
动态页面
🗂️
sqlite3 / pymysql
连接 SQLite / MySQL 数据库,执行 SQL 查询,读写数据。
数据库
🛠️环境安装(第一步必做)
打开终端(CMD / PowerShell / Anaconda Prompt),依次执行以下命令
① 安装 Pythonpython.org② pip 安装库pip install ...③ 验证安装import 测试④ 开始写代码VSCode / PyCharm
$pip install requests
$pip install beautifulsoup4
$pip install pandas openpyxl
$pip install lxml
✅
Anaconda 用户已内置 pandas,只需额外安装 requests 和 beautifulsoup4 即可
💡
国内网络慢可加镜像:pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
📁方式一:读取本地文件
最简单的数据采集------直接读取电脑上的 CSV / Excel / JSON 文件
📂 准备文件CSV / Excel🐼 pandas 读取read_csv / read_excel🔎 查看数据df.head() / info()🧹 清洗数据dropna / fillna💾 保存结果to_csv / to_excel
file_collect.py --- 读取 CSV / Excel 文件Python
import pandas as pd
# ══════════════════════════════════
# 1. 读取 CSV 文件
# ══════════════════════════════════
df = pd.read_csv("scores.csv", encoding="utf-8")
# 2. 查看前 5 行数据
print(df.head())
# 3. 查看数据基本信息(列名、类型、非空数量)
print(df.info())
# 4. 查看基本统计(均值、最大最小值等)
print(df.describe())
# ══════════════════════════════════
# 读取 Excel 文件(需先 pip install openpyxl)
# ══════════════════════════════════
df2 = pd.read_excel("data.xlsx", sheet_name="Sheet1")
# 读取 JSON 文件
df3 = pd.read_json("data.json")
# ══════════════════════════════════
# 5. 数据清洗(去掉空行)
# ══════════════════════════════════
df_clean = df.dropna() # 删除含空值的行
df_fill = df.fillna(0) # 将空值填充为 0
# 6. 保存结果为新 CSV
df_clean.to_csv("output.csv", index=False)
print("✅ 数据已保存!")
💡
如果文件有中文乱码,尝试 encoding="gbk" 或 encoding="gb2312"
🕷️方式二:网络爬虫
自动访问网页,提取文字、图片、表格等内容------数据采集的核心技能
🌐① 发送请求requests.get(url)📄② 获取网页response.text🍲③ 解析 HTMLBeautifulSoup🔎④ 提取数据find / find_all💾⑤ 保存CSV / Excel网络爬虫 完整流程
1
发送 HTTP 请求
用 requests 库向目标网站发送 GET 请求,就像用浏览器打开网页一样
step1_request.pyPython
import requests
url = "https://quotes.toscrape.com/" # 练习用爬虫网站
# 添加请求头,模拟浏览器,避免被拒绝
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)
print("状态码:", response.status_code) # 200 = 成功
print("网页长度:", len(response.text), "字符")
2
解析 HTML 内容
用 BeautifulSoup 把网页 HTML 变成可以用 Python 操作的对象
step2_parse.pyPython
from bs4 import BeautifulSoup
# 用 lxml 解析器解析 HTML(速度快)
soup = BeautifulSoup(response.text, "lxml")
# 查看网页标题
print(soup.find("title").text)
# 查看网页结构(格式化输出)
print(soup.prettify()[:500]) # 只看前500字符
3
提取目标数据
用 find()(找第一个)和 find_all()(找所有)提取数据
step3_extract.pyPython
# 找所有名言(class="text"的span标签)
quotes = soup.find_all("span", class_="text")
# 找所有作者(class="author"的small标签)
authors = soup.find_all("small", class_="author")
# 打印前 3 条
for i in range(min(3, len(quotes))):
print(f"名言:{quotes[i].text}")
print(f"作者:{authors[i].text}")
print("-" * 40)
4
保存数据到 CSV
将采集到的数据整理成列表,用 pandas 保存为 CSV 文件
step4_save.pyPython
import pandas as pd
data = []
for q, a in zip(quotes, authors):
data.append({
"名言": q.text.strip(),
"作者": a.text.strip()
})
# 转换为 DataFrame
df = pd.DataFrame(data)
print(df)
# 保存为 CSV
df.to_csv("quotes.csv", index=False, encoding="utf-8-sig")
print("✅ 已保存到 quotes.csv")
🎯 完整爬虫代码(一键运行)
full_crawler.pyPython
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
def crawl_quotes(pages=3):
"""爬取名言网站前 N 页数据"""
all_data = []
for page in range(1, pages + 1):
url = f"https://quotes.toscrape.com/page/{page}/"
headers = {"User-Agent": "Mozilla/5.0"}
# ① 发请求
resp = requests.get(url, headers=headers, timeout=10)
if resp.status_code != 200:
print(f"第{page}页请求失败,跳过")
continue
# ② 解析
soup = BeautifulSoup(resp.text, "lxml")
items = soup.find_all("div", class_="quote")
# ③ 提取
for item in items:
all_data.append({
"名言": item.find("span", class_="text").text.strip(),
"作者": item.find("small", class_="author").text.strip(),
"页码": page
})
print(f"✅ 第{page}页采集完成,共{len(items)}条")
time.sleep(1) # 礼貌等待 1 秒,避免给服务器压力
# ④ 保存
df = pd.DataFrame(all_data)
df.to_csv("quotes_all.csv", index=False, encoding="utf-8-sig")
print(f"\n🎉 采集完成!共 {len(all_data)} 条,已保存到 quotes_all.csv")
return df
# 运行
df = crawl_quotes(pages=3)
print(df.head())
🔌方式三:调用 API 接口
许多平台提供官方 API,返回 JSON 格式数据,比爬虫更稳定
🐍Python 程序requests.get()📤 发送请求🏢第三方 API 服务器天气 / 股票 / 地图...📥 返回 JSON📊结构化数据解析 / 分析 / 存储
api_collect.py --- 调用免费天气 APIPython
import requests
import json
# ══════════════════════════════════
# 示例:调用 wttr.in 免费天气 API(无需注册)
# ══════════════════════════════════
city = "Changsha" # 长沙
url = f"https://wttr.in/{city}?format=j1"
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get(url, headers=headers, timeout=10)
if response.status_code == 200:
data = response.json() # 解析 JSON(自动转成字典)
current = data["current_condition"][0]
print("🌡️ 当前温度:", current["temp_C"], "°C")
print("💧 湿度:", current["humidity"], "%")
print("🌬️ 风速:", current["windspeedKmph"], "km/h")
print("🌤️ 天气描述:", current["weatherDesc"][0]["value"])
else:
print(f"请求失败,状态码:{response.status_code}")
# ══════════════════════════════════
# 保存原始 JSON 到文件
# ══════════════════════════════════
with open("weather.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("✅ JSON 已保存到 weather.json")
💡
常用免费 API:wttr.in (天气)、exchangerate-api.com (汇率)、pokeapi.co (练习用)、jsonplaceholder.typicode.com(测试数据)
🗄️方式四:从数据库采集
Python 内置 sqlite3,可直接操作 SQLite 数据库,无需安装额外软件
db_collect.py --- SQLite 数据库采集Python
import sqlite3
import pandas as pd
# ══════════════════════════════════
# 1. 连接(或创建)数据库
# ══════════════════════════════════
conn = sqlite3.connect("students.db")
cursor = conn.cursor()
# 2. 创建示例表并插入数据(首次运行)
cursor.execute("""
CREATE TABLE IF NOT EXISTS scores (
name TEXT, subject TEXT, score REAL
)
""")
sample = [
("李天宇", "数学", 92),
("刘文财", "数学", 85),
("陈扬", "数学", 78),
]
cursor.executemany("INSERT INTO scores VALUES (?,?,?)", sample)
conn.commit()
# ══════════════════════════════════
# 3. 查询数据(用 pandas 直接读取)
# ══════════════════════════════════
df = pd.read_sql_query("SELECT * FROM scores ORDER BY score DESC", conn)
print(df)
# 4. 关闭连接
conn.close()
print("✅ 数据库采集完成!")
⚠️重要注意事项
合理合法使用爬虫,避免踩坑
🚫 遵守 robots.txt
每个网站根目录下的 /robots.txt 文件说明了哪些页面禁止爬取,务必遵守。
👉https://example.com/robots.txt
⏱️ 控制请求频率
每次请求后加 time.sleep(1) 等待至少 1 秒,频繁请求会被封 IP,也会给服务器带来压力。
🔒 数据合法使用
不得爬取个人隐私、受版权保护的内容,采集的数据只能用于学习和合法用途。
📝 添加请求头
设置 User-Agent 模拟浏览器,部分网站会拒绝没有请求头的访问。
"User-Agent": "Mozilla/5.0 ..."
📚 学习路线推荐
① requests发网络请求② BeautifulSoup解析 HTML③ pandas整理/保存数据④ Selenium动态页面(进阶)⑤ Scrapy专业框架(进阶)
掌握前三步就能完成大多数数据采集任务,Selenium 和 Scrapy 属于进阶内容
网址:Python 数据采集完全指南 ------ 从零开始掌握网络爬虫与文件读取
https://lijunjie070318-maker.github.io/python-libraries-guide/