Using Puppeteer to Crawl Public Instagram Reels from a Location

Yes Lee
4 min readJul 14, 2024

--

Minnano Beta | Paaaack 是最近開始的一個小 project,是個預期能讓大家方便查詢抱石 Beta 的網站,而 Beta 的來源是大家公開在 Instagram 上的 Reels 影片。

在手動詢問陌生岩友影片授權,和手動建立 Beta 影片進資料庫當作試水溫後,覺得這可能是一個 scalable 而且可以持續做下去的 idea(因為岩館會持續換線,所以會一直有新的 Beta 產生),所以決定開始自動化一部分流程,首先想試的就是自動爬公開 Beta 影片的 Crawler。

原岩攀岩館南港店 IG 上地標的 Recent Tab

測試的結果使用 Puppeteer 滿適合的,步驟如下:

  1. 打開 IG 上岩館地標的 Recent Tab,以原岩攀岩館南港店為例。
  2. 因為 Minnano Beta | Paaaack 目前只支援 Reels 並不支援 Post,所以利用 svg[aria-label="Clip"] 的 selector 篩選出 Reels。
  3. 再從 svg 利用 closest() Web API 找出 Reels 的 url,就完成囉!

P.S. Code 是用 TypeScript 寫的,所以需要用 ts-node 跑。

import puppeteer from 'puppeteer';

const HEADLESS = false;
const REELS_SVG_SELECTOR = 'svg[aria-label="Clip"]';
const IG_URL = 'https://www.instagram.com/explore/locations/108625251849306/-t-up-climbing-nangang/recent/';

(async () => {
const browser = await puppeteer.launch({ headless: HEADLESS });
const page = await browser.newPage();

await page.goto(IG_URL);
await page.waitForSelector(REELS_SVG_SELECTOR);
const reels = await page.evaluate((reelsSvgSelector) => {
const svgs = Array.from(document.querySelectorAll(reelsSvgSelector));
return svgs.reduce((ids, svg) => {
const link = svg.closest('a');
if (link) ids.push([link.href, link.href.split('/')[4]]);
return ids;
}, []);
}, REELS_SVG_SELECTOR);

console.log(reels);
await browser.close();
})();

爬蟲的結果如上,這樣子就能省下非常多手動查詢的時間了。

接下來,也預計會再加上跟資料庫的連結以及 queue 的實作!

--

--