Files
ipi/scraping.py
2026-02-02 22:17:32 +01:00

126 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 30120 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()