#!/usr/bin/env python3 """ Script per estrarre la lista dei seguiti (following) di un profilo Instagram → salva in CSV. Usa Instaloader - richiede login con tuo account. Utilizzo: python scraping.py --username TUO_USERNAME --password TUA_PASSWORD --target TARGET_USERNAME [--output seguiti.csv] [--limit 500] """ import argparse import sys import time import random from datetime import datetime import csv try: import instaloader except ImportError: print("Errore: installa instaloader con → pip install instaloader") sys.exit(1) def main(): parser = argparse.ArgumentParser(description="Estrae seguiti Instagram e salva in CSV") parser.add_argument("--username", required=True, help="Tuo username IG (per login)") parser.add_argument("--password", required=True, help="Tua password IG") parser.add_argument("--target", required=True, help="Username del profilo target") parser.add_argument("--output", default=None, help="File CSV di output (default: following_{target}_YYYY-MM-DD.csv)") parser.add_argument("--limit", type=int, default=0, help="Limita il numero di seguiti estratti (0 = tutti)") args = parser.parse_args() # Nome file di default if args.output is None: today = datetime.now().strftime("%Y-%m-%d") args.output = f"following_{args.target}_{today}.csv" print(f"Target: @{args.target}") print(f"Salvataggio in: {args.output}\n") L = instaloader.Instaloader() # Login try: print("Login...", end=" ") L.login(args.username, args.password) print("OK") except instaloader.exceptions.BadCredentialsException: print("Credenziali non valide") sys.exit(1) except Exception as e: print(f"Errore login: {e}") sys.exit(1) # Carica profilo target try: print(f"Caricamento @{args.target}...", end=" ") profile = instaloader.Profile.from_username(L.context, args.target) print("OK") except Exception as e: print(f"Errore caricamento profilo: {e}") sys.exit(1) if profile.is_private: print("ATTENZIONE: Profilo privato → devi seguirlo per vedere i seguiti.") followees_data = [] count = 0 start_time = time.time() print("Inizio estrazione seguiti... (pausa tra richieste per evitare blocchi)") try: for followee in profile.get_followees(): count += 1 username = followee.username full_name = followee.full_name if followee.full_name else "" followees_data.append([username, full_name]) print(f" {count:5d} | @{username} | {full_name}") if args.limit > 0 and count >= args.limit: print(f"\nLimite raggiunto: {args.limit} seguiti") break # Anti-ban: pausa random più lunga time.sleep(random.uniform(6.0, 15.0)) # era 2.0-5.5 → ora molto più lento ma più sicuro except instaloader.exceptions.LoginRequiredException: print("\nSessione scaduta o login richiesto → riprova") sys.exit(1) except instaloader.exceptions.ConnectionException as e: print(f"\nBlocco Instagram? Errore connessione: {e}") print("Aspetta 30–120 minuti prima di riprovare") sys.exit(1) except Exception as e: print(f"\nErrore durante scraping: {e}") sys.exit(1) # Salvataggio in CSV try: with open(args.output, mode="w", newline="", encoding="utf-8") as f: writer = csv.writer(f) # Header writer.writerow([ "username", "full_name", "estratto_il", f"@{args.target} - {datetime.now().strftime('%Y-%m-%d %H:%M')}" ]) writer.writerow([]) # riga vuota per separare header da dati # Dati for row in followees_data: writer.writerow(row + [""]) # colonna vuota per allineamento print(f"\nCompletato!") print(f"Estratti {len(followees_data)} seguiti") print(f"Tempo: {(time.time() - start_time):.1f} secondi") print(f"File salvato: {args.output}") except Exception as e: print(f"Errore salvataggio CSV: {e}") if __name__ == "__main__": main()