Scrape Instagram to find Nigerian creators in the "Make Money Online" and "Educational Content" niches. Target: 500 creators with minimum 1,000 followers.
- Spreadsheet ID:
19iH5Due87qCKMhBlHCsrBk1mE8liS9ycfqrssO2UZSs - Columns: Name, Email, Platform, Profile Name, Profile Link, Subscriber Count, Country, Niche, Language, Status, Instagram, Telegram, Twitter, Website, TikTok, Facebook
Uses Playwright with a persistent browser session to avoid repeated logins:
this.context = await chromium.launchPersistentContext('./instagram-session', {
headless: false,
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
viewport: { width: 1280, height: 800 },
locale: 'en-US',
timezoneId: 'Africa/Lagos'
});Uses Instagram's search keyword endpoint instead of hashtag pages:
https://www.instagram.com/explore/search/keyword/?q=%23{hashtag}&hl=en
This approach is more reliable than /explore/tags/{hashtag}/ which often returns empty results.
Instead of navigating to each post page:
- Click post thumbnail to open modal
- Extract username from modal's article header
- Press Escape to close modal
- Visit profile to get follower count
// Click post to open modal
await postElement.click();
await this.page.waitForTimeout(2500);
// Extract username from modal
const username = await this.page.evaluate(() => {
const usernameLink = document.querySelector('article header a[href^="/"]');
if (usernameLink) {
const href = usernameLink.getAttribute('href');
const match = href.match(/^\/([a-zA-Z0-9._]+)\/?$/);
if (match) return match[1];
}
return null;
});
// Close modal
await this.page.keyboard.press('Escape');- Session limit: 50 profiles per session
- Random delays: 4-8 seconds between actions
- Longer delays: 10-15 seconds between hashtags
- Re-scroll after returning: Load more posts after visiting a profile
const CONFIG = {
maxCreators: 500,
maxProfilesPerSession: 50,
minFollowers: 1000,
sessionDir: './instagram-session',
outputFile: '/tmp/instagram_creators.json',
progressFile: '/tmp/instagram_progress.json'
};const HASHTAGS = {
'make_money_online': [
'makingmoneyonlinenigeria', 'makemoneyonlinenigeria', 'makemoneyonline',
'onlinebusinessnigeria', 'passiveincomenig', 'passiveincome',
'hustlenigeria', 'digitalincomenigeria', 'freelancingnigeria',
'naijahustle', 'nigeriaentrepreneur', 'makemoneynaija',
'onlineincomenigeria', 'sidehustlenigeria', 'financialfreedomnigeria',
'wealthbuilding'
],
'educational_content': [
'educationnigeria', 'learnonlinenigeria', 'skillacquisitionnigeria',
'techtutorialnigeria', 'personaldevelopmentnigeria', 'naijaeducation',
'onlinelearningnigeria', 'codinginnigeria', 'nigeriatutorial',
'selfimprovementnaija', 'financialliteracy', 'investmenttips', 'moneytips'
]
};- Run login script to create persistent session:
node instagram_login.js- Manually log in to Instagram in the browser window
- Session is saved to
./instagram-session/
# Reset session counter (keeps existing creators)
cat /tmp/instagram_progress.json | node -e "
const data = require('fs').readFileSync('/dev/stdin', 'utf8');
const progress = JSON.parse(data);
progress.stats.profilesVisited = 0;
require('fs').writeFileSync('/tmp/instagram_progress.json', JSON.stringify(progress, null, 2));
console.log('Reset session counter. Total creators:', progress.creators.length);
"
# Run scraper
node instagram_scraper.jsExtract new creators and append to Google Sheets:
// Get new creators (adjust slice index based on previous count)
const creators = require('/tmp/instagram_creators.json');
const newCreators = creators.slice(PREVIOUS_COUNT);
// Format for Google Sheets
const rows = newCreators.map(c => [
c.name, c.email, c.platform, c.profileName, c.profileLink,
c.subscriberCount, c.country, c.niche, c.language, c.status,
c.instagram, c.telegram, c.twitter, c.website, c.tiktok, c.facebook
]);Each creator object:
{
name: 'username or display name',
email: '',
platform: 'instagram',
profileName: '@username',
profileLink: 'https://www.instagram.com/username/',
subscriberCount: 50000, // numeric
country: 'NG',
niche: 'instagram make money online nigeria' | 'instagram educational content nigeria',
language: '',
status: 'Not Contacted',
instagram: 'https://www.instagram.com/username/',
telegram: '',
twitter: '',
website: '',
tiktok: '',
facebook: ''
}The scraper maintains a progress file (/tmp/instagram_progress.json) with:
creators: Array of all collected creatorsvisited: Set of usernames already visited (prevents duplicates)stats: Session statisticslastUpdate: Timestamp
- Persistent session - Reuses logged-in state
- Realistic user agent - Chrome on macOS
- Random delays - Variable timing between actions
- Human-like scrolling - Gradual page scrolling
- WebDriver detection bypass:
await this.page.addInitScript(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
});- Total Instagram creators: 265
- Target: 500
- Sessions completed: Multiple (each adds ~40-50 creators)
- Google Sheet rows: 1,666 (includes YouTube creators from rows 1-1538)
- @layiwasabi - 2.4M followers
- @bammybestowed - 2.1M followers
- @odumodublvck - 1.9M followers
- @diaryofanaijagirl - 987K followers
- @tanimzamanofficial - 458K followers
- @derrickpwhitehead - 441K followers
instagram_scraper.js- Main scraper scriptinstagram_login.js- Login helper script./instagram-session/- Browser session data/tmp/instagram_creators.json- All collected creators/tmp/instagram_progress.json- Progress tracking/tmp/instagram_new_rows.json- Formatted rows for current session