Python爬虫实战:自动化抓取 Pinterest 热门趋势与创意!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~

㊙️本期爬虫难度指数:⭐⭐⭐

🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。

全文目录:

      • [🌟 开篇语](#🌟 开篇语)
      • [0️⃣ 前言(Preface)](#0️⃣ 前言(Preface))
      • [1️⃣ 摘要(Abstract)](#1️⃣ 摘要(Abstract))
      • [2️⃣ 背景与需求(Why)](#2️⃣ 背景与需求(Why))
      • [3️⃣ 合规与注意事项(必写)](#3️⃣ 合规与注意事项(必写))
      • [4️⃣ 技术选型与整体流程(What/How)](#4️⃣ 技术选型与整体流程(What/How))
      • [5️⃣ 环境准备与依赖安装(可复现)](#5️⃣ 环境准备与依赖安装(可复现))
      • [6️⃣ 核心实现:请求层(Fetcher)](#6️⃣ 核心实现:请求层(Fetcher))
      • [7️⃣ 核心实现:解析层(Parser)](#7️⃣ 核心实现:解析层(Parser))
      • [8️⃣ 数据存储与导出(Storage)](#8️⃣ 数据存储与导出(Storage))
      • [9️⃣ 运行方式与结果展示(必写)](#9️⃣ 运行方式与结果展示(必写))
      • [🔟 常见问题与排错(强烈建议写)](#🔟 常见问题与排错(强烈建议写))
      • [1️⃣1️⃣ 进阶优化(可选但加分)](#1️⃣1️⃣ 进阶优化(可选但加分))
      • [1️⃣2️⃣ 总结与延伸阅读](#1️⃣2️⃣ 总结与延伸阅读)
      • [🌟 文末](#🌟 文末)
        • [✅ 专栏持续更新中|建议收藏 + 订阅](#✅ 专栏持续更新中|建议收藏 + 订阅)
        • [✅ 互动征集](#✅ 互动征集)
        • [✅ 免责声明](#✅ 免责声明)

🌟 开篇语

哈喽,各位小伙伴们你们好呀~我是【喵手】。

运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO

欢迎大家常来逛逛,一起学习,一起进步~🌟

我长期专注 Python 爬虫工程化实战 ,主理专栏 《Python爬虫实战》:从采集策略反爬对抗 ,从数据清洗分布式调度 ,持续输出可复用的方法论与可落地案例。内容主打一个"能跑、能用、能扩展 ",让数据价值真正做到------抓得到、洗得净、用得上

📌 专栏食用指南(建议收藏)

  • ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
  • ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
  • ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
  • ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用

📣 专栏推广时间 :如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。

💕订阅后更新会优先推送,按目录学习更高效💯~

0️⃣ 前言(Preface)

Pinterest 不仅仅是图片站,它是全球趋势的风向标。今天我们要手搓一个"灵感挖掘机",利用 Python 自动化技术绕过复杂的瀑布流加载,将那些被疯狂保存的热门 Pin 收入囊中。

  • 目标:抓取 Pinterest 热门分类(如家居、穿搭)下的 Pin 信息。
  • 工具:Python + Playwright (异步) + Pandas。
  • 产出:一份包含创意描述、热度及发布者信息的 CSV 趋势报告。

💡 读完这篇你能获得:

  1. 搞定 Pinterest 变态级 CSS 混淆(类名全是乱码)的抓取技巧。
  2. 学会处理"无限滚动"页面,实现自动翻页采集。
  3. 拥有一套可复用的动态网页数据采集框架。

1️⃣ 摘要(Abstract)

本文将以 Pinterest "Ideas" 页面为例,演示如何使用 Playwright 模拟真实用户浏览行为,攻克 Infinite Scroll(无限滚动) 带来的分页难题。我们将通过提取 DOM 节点属性清洗出 Pin 描述、创建者、保存数 等核心字段,并最终将数据结构化导出。

💡 核心收获:

  • 动态渲染页面的抓取逻辑。
  • 基于 aria-labeldata-test-id 的高鲁棒性定位策略。
  • 从 0 到 1 的工程化爬虫代码。

2️⃣ 背景与需求(Why)

  • 为什么要爬:设计师需要建立灵感库,电商从业者需要捕捉流行趋势(比如"今年春天流行什么颜色的桌布")。

  • 目标站点https://www.pinterest.com/ideas/ (或具体分类页)

  • 目标字段清单

    • description: Pin 的核心描述(对应 SEO 关键词)。
    • creator: 内容发布者/品牌(用于分析头部账号)。
    • save_count: 保存/收藏数(判断热度的核心指标)。
    • category: 所属分类(打标用)。

3️⃣ 合规与注意事项(必写)

🚧 爬虫千万条,安全第一条:

  1. robots.txt :Pinterest 对爬虫非常严格,明确禁止未授权抓取。本项目仅供学习研究 Python 自动化技术,请勿用于商业用途或大规模采集。
  2. 频率控制 :Pinterest 极其敏感,强烈建议每页滚动后 sleep 3-5 秒。不要试图 1 秒并发 100 次,那样会被秒封 IP。
  3. 账号安全 :Pinterest 浏览特定也面需要登录。建议注册小号测试,不要使用你的主账号进行高频爬虫测试,以免被风控限制。
  4. 数据隐私:只采集公开可见的 Pin 信息,绝不触碰用户私密看板。

4️⃣ 技术选型与整体流程(What/How)

🤔 为什么不选 requests/bs4?

Pinterest 是典型的 PWA (Progressive Web App) ,页面源代码里只有一大堆 JavaScript,没有 HTML 内容。且它的 CSS 类名是随机生成的(如 class="XbT zI7"),这让传统解析器直接报废。

🚀 为什么选 Playwright?

  • 所见即所得:它能完美渲染 JS,解决空壳问题。
  • 选择器强悍:支持通过文本、ARIA 属性定位,无视 CSS 混淆。
  • 反爬能力:比 Selenium 更难被检测。

整体流程:

5️⃣ 环境准备与依赖安装(可复现)

Python 版本 :推荐 3.9 以上

安装命令:

bash 复制代码
# 安装核心库
pip install playwright pandas openpyxl

# 安装浏览器驱动(这一步很关键!)
playwright install chromium

项目结构推荐:

text 复制代码
Pinterest_Spider/
├── outputs/            # 结果存放
├── cookies/            # 如果做登录持久化,放这里
├── pinterest_bot.py    # 主程序
└── README.md

6️⃣ 核心实现:请求层(Fetcher)

这里我们必须处理一个核心问题:登录墙 。Pinterest 浏览几下就会弹窗让你登录。为了演示方便,我们假设你已经有一个账号,或者我们利用 Playwright 强大的 user_data_dir 来复用你本地 Chrome 的登录状态(最稳妥)。

python 复制代码
import asyncio
from playwright.async_api import async_playwright
import pandas as pd
import random

# 全局配置
HEADLESS = False  # 设为 False 可以看到浏览器运行,方便调试
TARGET_URL = "https://www.pinterest.com/ideas/home-decor/935249272048/" # 示例:家居装饰分类
SCROLL_TIMES = 5  # 滚动多少页(分页深度)

async def run_scraper():
    async with async_playwright() as p:
        # 启动浏览器,注意这里没有用 user_data_dir,如果是生产环境建议加上以保存登录态
        browser = await p.chromium.launch(headless=HEADLESS, slow_mo=50)
        
        # 伪装 User-Agent,防止一眼被识破
        context = await browser.new_context(
            user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
            viewport={'width': 1280, 'height': 800}
        )
        
        page = await context.new_page()
        
        print(f"🚀 正在潜入 Pinterest: {TARGET_URL}")
        try:
            await page.goto(TARGET_URL, timeout=60000)
            await page.wait_for_load_state("networkidle")
            
            # --- 处理登录弹窗逻辑(如果出现) ---
            # 这里留个口子,如果弹出登录框,建议手动扫码或填号,或者用代码定位关闭按钮
            # await page.pause() # 调试时解开这行,可以在控制台手动操作
            
        except Exception as e:
            print(f"❌ 页面加载超时或失败: {e}")
            await browser.close()
            return
            
        # ... 接下文解析层

7️⃣ 核心实现:解析层(Parser)

这是最精彩的部分。因为 CSS 类名会变,我们不能写死 .class123。我们要用 XPath 或者 Role 来定位。

Pinterest 的 Pin 通常是一个带有 data-test-id="pin-visual-wrapper" 或者特定 aria-label 的容器。

python 复制代码
        # ... 接上文
        all_pins_data = []
        
        for i in range(SCROLL_TIMES):
            print(f"🔄 正在进行第 {i+1}/{SCROLL_TIMES} 次滚动加载...")
            
            # 模拟真实人类滚动:滚下去,停顿,再滚一点
            await page.mouse.wheel(0, 3000)
            await asyncio.sleep(random.uniform(2, 4)) 
            
            # === 解析当前屏幕内的 Pin ===
            # 定位所有 Pin 的容器。注意:Pinterest 结构常变,最稳的是找图片的 alt 描述
            # 这里的 selector 是寻找所有包含图片的特定容器
            pin_elements = await page.locator('div[data-test-id="pin"] >> visible=true').all()
            
            print(f"   👀 当前视窗检测到 {len(pin_elements)} 个 Pin,开始解析...")
            
            for pin in pin_elements:
                try:
                    # 1. 提取描述 (通常在图片的 alt 属性里最全)
                    img_tag = pin.locator("img").first
                    description = await img_tag.get_attribute("alt")
                    if not description: description = "No Description"
                    
                    # 2. 提取创建者 (通常在下方的链接文本里)
                    # 这是一个容错写法,因为有时不显示作者
                    creator_loc = pin.locator('div[data-test-id="pinner-name"] a')
                    if await creator_loc.count() > 0:
                        creator = await creator_loc.inner_text()
                    else:
                        creator = "Unknown"

                    # 3. 提取链接 (去重关键)
                    link_loc = pin.locator("a").first
                    raw_url = await link_loc.get_attribute("href")
                    pin_url = f"https://www.pinterest.com{raw_url}"
                    
                    # 4. 提取分类 (这里我们直接用当前抓取的主题作为分类)
                    category = "Home Decor" 

                    # *注意:保存数(Save Count) 在列表页往往被隐藏,
                    # 只有点击详情页才能看到准确数字。为了效率,这里我们暂存列表页可见信息。
                    
                    data = {
                        "description": description,
                        "creator": creator,
                        "category": category,
                        "url": pin_url
                    }
                    all_pins_data.append(data)
                    
                except Exception as e:
                    # 某个 Pin 解析失败不影响整体
                    continue
        
        await browser.close()
        return all_pins_data

8️⃣ 数据存储与导出(Storage)

采集到的数据会有大量重复,因为滚动时上面的元素还在 DOM 里。我们需要用 Pandas 做最后一道防线。

python 复制代码
def save_data(data_list):
    if not data_list:
        print("⚠️ 没抓到数据,请检查网络或选择器!")
        return

    df = pd.DataFrame(data_list)
    
    # 核心步骤:根据 URL 去重
    df.drop_duplicates(subset=['url'], keep='first', inplace=True)
    
    # 清洗:去除不需要的换行符
    df['description'] = df['description'].str.replace('\n', ' ').str.strip()
    
    print(f"📊 去重后剩余 {len(df)} 条有效灵感数据")
    
    # 导出
    filename = "pinterest_trends_output.csv"
    df.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"✅ 文件已保存至: {filename}")

9️⃣ 运行方式与结果展示(必写)

启动命令:

bash 复制代码
python pinterest_bot.py

示例输出(文件内容):

description creator category url
Minimalist Bedroom Design Ideas 2024 NordicHome Home Decor https://pinterest.com/pin/123...
DIY Coffee Table rustic style CraftyMom Home Decor https://pinterest.com/pin/456...
Small apartment living room hack CityLiving Home Decor https://pinterest.com/pin/789...

🔟 常见问题与排错(强烈建议写)

  1. Q: 跑着跑着不动了,报错 Timeout?

    • A : 可能是网络慢,图片加载卡住了。把 timeout=60000 设大一点,或者在 launch 时开启 headless=False 看看是不是弹出了登录框挡住了操作。
  2. Q: description 全是 None?

    • A : Pinterest 更新了 DOM 结构。按 F12 检查图片的标签,是不是 alt 属性移除了,改到了 aria-label 或者兄弟节点的 title 里。爬虫需要灵活应变!
  3. Q: 只能抓到 10 条?

    • A : 页面还没滚动到底部,Playwright 解析就结束了。适当增加 asyncio.sleep 的时间,给 React 渲染多一点时间。

1️⃣1️⃣ 进阶优化(可选但加分)

  • 保存图片 :你可以在解析 img_tag 时,直接获取 src 属性,并使用 requests.get(src) 将高清大图下载到本地 images/ 文件夹,建立你的本地素材库。
  • 断点续跑 :维护一个 SQLite 数据库,记录已爬取的 pin_id(从 URL 里提取)。下次启动时,如果遇到数据库里有的 ID,就跳过解析,节省资源。
  • Headless 模式 :调试通了之后,把 HEADLESS = True 打开,让它在后台静默运行,甚至可以部署到服务器上定时跑。

1️⃣2️⃣ 总结与延伸阅读

复盘:

今天我们完成了一个反反爬能力极强的 Pinterest 爬虫。它避开了基于 Requests 的各种陷阱,利用 Playwright "大力出奇迹",成功拿到了动态加载的灵感数据。

下一步:

如果你想成为全栈数据高手,可以尝试:

  1. Hook API :使用 page.on("response", handler) 监听 Pinterest 的底层 JSON 数据包,这比解析 HTML 更快更全(但难度更高)。
  2. 图像识别:结合 OpenCV 或 AI 模型,自动分析爬下来的图片色系,生成"年度流行色报告"。

🌟 文末

好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~
三连就是对我写作道路上最好的鼓励与支持! ❤️🔥

✅ 专栏持续更新中|建议收藏 + 订阅

墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以"入门 → 进阶 → 工程化 → 项目落地"的路线持续更新,争取让每一期内容都做到:

✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

📣 想系统提升的小伙伴 :强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~

✅ 互动征集

想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?

评论区留言告诉我你的需求,我会优先安排实现(更新)哒~


⭐️ 若喜欢我,就请关注我叭~(更新不迷路)

⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力)

⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


✅ 免责声明

本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。

使用或者参考本项目即表示您已阅读并同意以下条款:

  • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
  • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
  • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
  • 使用或者参考本项目即视为同意上述条款,即 "谁使用,谁负责" 。如不同意,请立即停止使用并删除本项目。!!!
相关推荐
凌晨一点的秃头猪2 小时前
Python文件操作
开发语言·python
小张贼嚣张2 小时前
数据分析全流程实战:Python(Pandas/Matplotlib/Numpy)+ MySQL(附可下载数据源+多图形绘制)
python·数据分析·pandas
努力的小白o(^▽^)o2 小时前
面向课堂考勤场景的桌面端人脸识别签到系统
python·人脸识别
sa100273 小时前
淘宝商品详情 API 接口开发实战:item_detail 调用、参数与 Python 示例
linux·数据库·python
Dapenson3 小时前
腾讯小龙虾WorkBuddy技能与插件深度解析
python·ai
无心水3 小时前
【常见错误】2、Java并发编程避坑指南:从加锁失效到死锁,10个案例教你正确使用锁
java·开发语言·python
困死,根本不会4 小时前
Python 连接 iBeacon 蓝牙设备超详细学习笔记
python·蓝牙服务·ibeacon
AI_56784 小时前
基于智优达平台的Python教学实践:从环境搭建到自动评测
开发语言·前端·人工智能·后端·python
怪侠_岭南一只猿4 小时前
爬虫阶段一实战练习题二:爬取当当网图书列表
css·爬虫·python·html