如何抓取Pinterest趋势数据以进行电商研究

Pinterest是一个需求信号的金矿——同时也是一个较难的目标,因为页面上没有JSON。以下是如何渲染、选择图钉、跟踪趋势,并防止无头模式被封锁的方法。

Pinterest是一个需求信号引擎:人们现在保存的东西预测了他们下个季节会购买的东西,这使得其图钉、板块和搜索建议对电商和内容研究非常有用。它也是一个较为棘手的目标,因为与大多数市场不同,它的页面中没有结构化数据。所有内容都是动态渲染的,没有整齐的JSON块可以用正则表达式提取。这意味着你需要先渲染,然后读取DOM。本指南涵盖了渲染和选择的方法,如何挖掘趋势和关键词信号,以及防止无头模式被封锁的代理和头部选择。请在Pinterest的条款范围内工作,并坚持使用公共数据。

为什么隐藏JSON的技巧在这里不起作用

在许多网站上,数据存在于源代码中的JavaScript变量中,因此一个简单的请求加上正则表达式就足够了。Pinterest的所有内容都是客户端生成的,并且没有在页面上留下这些结构。如果你下载原始HTML,图钉并不在其中——它们是在JavaScript运行后注入的。因此,可靠的方法是使用无头浏览器(Playwright效果很好)加载页面,等待内容,然后从实时DOM中提取。图钉深度嵌套但标记一致:每个图钉都位于一个带有data-test-id="pinWrapper"div中,这比哈希类名更稳定。

渲染和选择图钉

最重要的细节:设置一个真实的桌面User-Agent。在无头模式下,Pinterest会直接封锁默认的自动化UA,而换成正常的Chrome字符串通常是空列表和完整页面之间的区别。加载搜索URL,给内容一些时间渲染,然后查询所有图钉包装器并从每个中提取标题、URL和缩略图:

import asyncio, json
from playwright.async_api import async_playwright

UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
      "(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36")

PROXY = {"server": "http://gate.quantumproxies.io:8000",
         "username": "USER", "password": "PASS"}

async def scrape_pins(query):
    url = f"https://www.pinterest.com/search/pins/?q={query}&rs=typed"
    results = []
    async with async_playwright() as p:
        browser = await p.chromium.launch(proxy=PROXY)
        page = await browser.new_page(user_agent=UA)   # real UA is mandatory
        await page.goto(url, timeout=30000)
        await page.wait_for_timeout(2500)              # let pins render
        pins = await page.query_selector_all("div[data-test-id='pinWrapper']")
        for pin in pins:
            link = await pin.query_selector("a")
            if not link:
                continue
            img = await link.query_selector("img")
            results.append({
                "title": await link.get_attribute("aria-label"),
                "url": await link.get_attribute("href"),
                "img": await img.get_attribute("src") if img else None,
            })
        await browser.close()
    return results

pins = asyncio.run(scrape_pins("minimalist home office"))
print(len(pins), "pins")

这提供了趋势工作的基本要素:图钉标题(由钉子自己撰写的丰富描述性文本)、目标URL和缩略图。如果你想要超过第一个视口的内容,在选择之前循环滚动页面——Pinterest会随着你的滚动懒加载。

比较图示显示隐藏JSON网站与需要渲染才能读取DOM的Pinterest
Pinterest通过JavaScript注入内容,因此你需要先渲染再读取DOM——没有页面JSON可以捷径。

从图钉到趋势信号

原始图钉只是第一步。研究价值来自于将它们聚合成你的商品或内容团队可以采取行动的信号:

因为这些信号在比较市场时最强,所以对出口IP进行地理定位:美国购物者看到的内容与英国或德国的不同,而这种差距往往是机会。每次运行通过特定国家的住宅代理,并将市场与数据一起存储。

趋势工作的一条实用建议:以固定的每周节奏捕捉相同的搜索并存储每个快照,而不是覆盖。"cottagecore kitchen"的图钉数量单独看没有意义,但八周的上升线是真正的领先指标——Pinterest的保存先于购买,因此现在在平台上获得动量的主题是下季度的商品信号。一旦你有了稳定的快照,差异化是微不足道的;关键是可靠地收集它们,这正是干净的IP和稳定的选择器的价值所在。

保持无头模式的活力

Pinterest监控自动化,因此在数据中心IP上的浏览器具有机器人指纹会很快被标记。三种习惯保持会话健康:一致的真实User-Agent(已涵盖),每个会话使用新的旋转住宅IP,以免一个地址与数十个搜索相关联,以及人性化的节奏——加载后短暂等待,轻柔滚动,没有成千上万的请求爆发。我们关于抓取JavaScript密集型网站的指南深入探讨了渲染加代理的组合,其他社交平台也适用相同的反封锁卫生——参见抓取Instagram公共数据的并行。

获取专为社交抓取构建的住宅IP

当浏览器群不再值得时

渲染每个页面既慢又昂贵——无头浏览器的每页成本比简单请求高出一个数量级,无论是在时间还是带宽上。在研究规模上,这会累积。一个Scraper API按需渲染并返回结构化数据,让你跳过浏览器群、代理轮换和阻止处理,因此你可以将时间花在分析而不是维护上。它还提取更丰富的字段——关注者数量、保存和评论数量、类别和标签——而快速DOM抓取则会遗漏。

Pinterest抓取的做与不做规则清单,包括真实User-Agent和住宅IP轮换
真实User-Agent和旋转住宅IP是不可协商的——默认的无头UA会立即被封锁。

常见问题

如何用Python抓取Pinterest?

使用像Playwright这样的无头浏览器而不是简单请求,因为Pinterest通过JavaScript渲染内容,并且在原始HTML中没有数据。设置一个真实的桌面User-Agent,加载搜索或板块URL,等待图钉渲染,然后选择每个div[data-test-id="pinWrapper"]并读取每个的标题、URL和图片。

Pinterest有公共API吗?

Pinterest为商业和开发者账户提供了官方API,但它是范围有限的、速率限制的,并且主要集中在管理你自己的内容和广告,而不是在整个网络上进行广泛的趋势研究。对于跨小众市场和市场的公共图钉、板块和搜索趋势数据,大多数研究人员渲染公共页面。

为什么Pinterest会封锁我的抓取器?

两个最常见的原因是默认的无头User-Agent,Pinterest会立即封锁,以及与许多快速请求相关联的数据中心IP。修复这两点:发送正常的Chrome UA,每个会话旋转一个住宅IP,并通过等待和滚动来调整请求的节奏,而不是快速爆发。

抓取Pinterest合法吗?

收集公开可见的数据处于法律灰色地带,取决于司法管辖区、目的和Pinterest的服务条款。坚持公共图钉和板块,避免个人数据和登录后的任何内容,并为商业用途咨询法律顾问。这是一般信息,而非法律建议。

Pinterest奖励耐心:渲染页面,定位稳定的图钉包装器,将描述性标题和搜索建议聚合成趋势信号,并保持你的指纹和IP干净。按市场这样做,你将获得一个大多数竞争对手未关注的需求领先指标。

使用Scraper API大规模渲染Pinterest