当前位置: 首页 > news >正文

《Python爬虫 + 飞书自动化上传》全流程详细讲解


项目目标:从豆瓣电影 Top250 抓取前 100 条热门电影数据(含名称、评分、链接、详情),
然后一键上传到 飞书多维表格(Bitable)


🧩 项目结构

douban_host_to_feishu/
│
├── config.yaml           # 飞书配置文件(App ID、Token等)
├── feishu_uploader.py    # 飞书上传模块
└── douban_spider.py      # 爬虫主逻辑

📄 一、飞书上传模块(feishu_uploader.py)

💡 功能说明:

负责读取配置、获取 Feishu Access Token,并将 DataFrame 批量上传。


✨ 知识点 1:读取配置文件

import yamlwith open("config.yaml", "r", encoding="utf-8") as f:CONFIG = yaml.safe_load(f)

📘 解析:

  • with open():上下文语法,自动关闭文件。
  • yaml.safe_load():比 load() 更安全,只会解析基础类型。
  • encoding="utf-8" 避免中文乱码。

举例:

feishu:app_id: "cli_123456"app_secret: "abcdef"app_token: "bascnxxxx"table_id: "tbl12345"

解析结果就是一个 Python 字典:

CONFIG["feishu"]["app_id"]  # => "cli_123456"

✨ 知识点 2:发起 POST 请求获取 Token

import requestsdef get_token():url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"data = {"app_id": APP_ID, "app_secret": APP_SECRET}res = requests.post(url, json=data)return res.json().get("tenant_access_token")

📘 解析:

  • requests.post():发送 POST 请求,自动转 JSON。
  • .json():将返回的 JSON 转为 Python 字典。
  • .get():安全取值,不会抛 KeyError。

示例输出:

{"code": 0,"tenant_access_token": "t-g104anmeJCS...","expire": 7200
}

返回值为 "t-g104anme...",即 Token。


✨ 知识点 3:遍历 Pandas DataFrame

for _, row in df.iterrows():print(row["电影名称"], row["评分"])

📘 解析:

  • iterrows():逐行遍历 DataFrame。
  • _ 代表索引,我们不需要时用 _ 占位。

输出举例:

肖申克的救赎 9.7
霸王别姬 9.6

✨ 知识点 4:批量上传(分批处理)

for i in range(0, len(records), 10):batch = records[i:i + 10]res = requests.post(url, headers=headers, json={"records": batch})

📘 解析:

  • range(start, stop, step):步长循环,这里每次上传 10 条。
  • records[i:i + 10]:切片取 10 个元素。

代码逻辑举例:

records = [1,2,3,4,5,6,7,8,9,10,11,12]
# 第1批: [1..10]
# 第2批: [11..12]

✨ 知识点 5:条件判断与字符串格式化

if res.status_code == 200:print(f"✅ 上传成功:第 {i // 10 + 1} 批")
else:print(f"⚠️ 上传失败:HTTP {res.status_code}")

📘 解析:

  • f"..."f-string(Python3.6+),性能更高,可直接嵌变量。
  • // 是整除,% 是取余。

输出举例:

✅ 上传成功:第 3 批

📄 二、豆瓣爬虫模块(douban_spider.py)

💡 功能说明:

从豆瓣电影 Top250 抓取前 100 条电影,提取字段保存为 CSV,并上传。


✨ 知识点 1:requests 请求网页

res = requests.get(url, headers=headers, timeout=10)
res.encoding = "utf-8"

📘 解析:

  • headers 模拟浏览器,避免被反爬。
  • timeout=10 限制最长等待时间。
  • .encoding 强制使用 UTF-8,防止中文乱码。

调试技巧:

print(res.status_code)  # 200 正常
print(res.text[:500])   # 打印前 500 字符

✨ 知识点 2:BeautifulSoup 解析网页

from bs4 import BeautifulSoupsoup = BeautifulSoup(res.text, "html.parser")

📘 解析:

  • BeautifulSoup 是 Python 最常用的 HTML 解析库。
  • "html.parser" 是 Python 内置解析器。

示例:

html = "<div><p>Hello</p></div>"
soup = BeautifulSoup(html, "html.parser")
print(soup.p.text)  # 输出 Hello

✨ 知识点 3:CSS 选择器抓取标签

for item in soup.select("div.item"):title = item.select_one("span.title").get_text(strip=True)

📘 解析:

  • .select() 类似 JavaScript 的 document.querySelectorAll()
  • .select_one() 返回第一个匹配。
  • .get_text(strip=True) 去除空格换行。

豆瓣实际结构示例:

<div class="item"><a href="https://movie.douban.com/subject/1292052/"><span class="title">肖申克的救赎</span></a><span class="rating_num">9.7</span>
</div>

✨ 知识点 4:循环分页 + 防爬保护

for start in range(0, 100, 25):url = f"https://movie.douban.com/top250?start={start}"time.sleep(1)

📘 解析:

  • 豆瓣每页 25 条,用分页参数 start=25,50,75...
  • time.sleep(1) 每页暂停 1 秒防止被封。

循环结果:

start = 0, 25, 50, 75
共抓取 100 条

✨ 知识点 5:Pandas 数据保存

df = pd.DataFrame(movies)
df.to_csv("douban_top100.csv", index=False, encoding="utf-8-sig")

📘 解析:

  • pd.DataFrame():将列表字典转为表格。
  • index=False:不保存行号。
  • encoding="utf-8-sig":兼容 Excel 中文显示。

保存结果:

电影名称评分链接详情
肖申克的救赎9.7https://…美国剧情片

✨ 知识点 6:主入口控制

if __name__ == "__main__":df = get_douban_top100()token = get_token()upload_to_feishu(df, token)

📘 解析:

  • __name__ 是 Python 内置变量。
  • 当文件直接运行时,__name__ == "__main__" 为真。
  • 当被其他文件 import 时,则不会执行这段。

优点:
方便模块复用,比如:

from douban_spider import get_douban_top100

不会执行上传逻辑,只爬取数据。


🧱 项目核心 Python 技能总表

分类技能点说明代码位置
文件读写open() with自动关闭文件feishu_uploader
网络请求requests.get / post爬取网页、调用 API两个文件都有
数据结构list / dict 嵌套存储电影信息douban_spider
数据解析BeautifulSoup提取 HTML 标签douban_spider
循环控制for range(start, stop, step)分页处理douban_spider
异常预防if not token:保证运行稳定feishu_uploader
模块导入from feishu_uploader import ...结构化项目douban_spider
函数封装def upload_to_feishu(df, token):高复用性设计feishu_uploader
Pandas 操作DataFrame + to_csv数据清洗与存储douban_spider
条件判断if "error" not in res.text过滤 API 错误feishu_uploader

💎 小结:项目背后的“编程思想”

编程思想表现方式
模块化设计爬虫逻辑与上传逻辑分离,易维护
数据驱动一切逻辑都围绕 DataFrame 操作
防御式编程判断错误、限速、类型转换
可扩展性可替换数据源、可接企业微信、Notion 等
API 优先上传部分严格遵循 Feishu API 文档

🚀 实际运行结果

🎬 正在爬取豆瓣 Top100...
📄 已抓取 25...
📄 已抓取 50...
📄 已抓取 75...
📄 已抓取 100...
✅ 共抓取到 100 条电影数据
✅ 已保存到 douban_top100.csv
🔐 正在连接飞书...
✅ 上传成功:第 1 批
✅ 上传成功:第 2 批
✅ 上传成功:第 3 批
✅ 上传成功:第 4 批
✅ 上传成功:第 5 批
✅ 上传成功:第 6 批
✅ 上传成功:第 7 批
✅ 上传成功:第 8 批
✅ 上传成功:第 9 批
✅ 上传成功:第 10 批
🚀 全部上传完毕!

http://www.dtcms.com/a/520242.html

相关文章:

  • ELK——logstash
  • 图像进行拼接-后进行ocr检测识别
  • 登封网站设计wordpress终极简码
  • 网站服务器关闭建设网站需要的安全设备
  • STM32 RS422异步UART通信测试全方案C++软件开发,嵌入式软件开发,Linux
  • Qt笔记:的初次使用Qt-Advanced-Docking-System
  • 基于PyTorch和CuPy的GPU并行化遗传算法实现
  • Apollo Canbus模块技术深度解析
  • DeepSeek-OCR 嵌入dify工作流
  • Linux小课堂: Vim与Emacs之Linux文本编辑器的双雄格局及Vim安装启动详解
  • 江宁外贸网站建设国内付费代理ip哪个好
  • 多种大连网站建设景观设计公司理念
  • KP201FLGA电机驱动电源方案SOT23-6恒压恒流恒功率电路原理图分析
  • Hadoop报错 Couldn‘t find datanode to read file from. Forbidden
  • 【案例实战】HarmonyOS分布式购物车:多设备无缝协同的电商体验
  • OpenCV工程中直接包含调用vs2022
  • 怎么看一个网站用什么做的北京建设公司有哪些
  • 上海交大刘鹏飞:智能不在于数据堆砌,78个样本训练出超强Agent,数据效率提升128倍
  • SpringAI1-快速⼊⻔
  • 本地局域网邮件管理系统:从原理到实现的完整指南
  • 面向小样本蜂窝网络故障诊断的模型与知识互增强方法
  • 上海网站推广方法河北石家庄属于几线城市
  • 专业购物网站建设哪家好免费找客户网站
  • 受欢迎的网站开发php源码搭建网站流程
  • 第八章 排序——课后习题解练【数据结构(c语言版 第2版)】
  • 如果有大量的key需要设置同一时间过期,一般需要注意什么?
  • 【nvidia-GB200】(2) 18 台 GB200 服务器集群 NCCL All-to-All 性能深度测评:72 张 GPU 多对多通信的效率与潜力
  • MYSQL数据库--基本练习
  • Harbor VS Hadess,开源制品管理工具一文详细对比分析
  • 查找企业信息的网站哪个好广州网站外包