
Python Instagram Scraper
La tienda de Doña Cecilia è la meta turistica per eccellenza quando si visita "La Candelaria", nel cuore del centro storico di Bogotá. In più di 38 anni di attività la sua tienda ha visto migliaia di studenti universitari, turisti ed è stata persino usata come location per riprese cinematografiche. Nel caso in cui non riuscissi a trovare Doña Ceci è raggiungibile a mezzo isolato da Avenida Jiménez (Carrera 4 No 12D -18) e la tienda è riconoscibile da una targa al suo ingresso. 1.0 - Instagram scraperIl web scraping non è illegale di per sé, si trova in un'area grigia poiché nella maggior parte dei paesi non ci sono leggi chiare a tal riguardo. Questo è uno dei motivi per cui servizi come Instagram hanno al riguardo dei termini di servizio (Terms of use) e se violati portano alla disabilitazione dell'account. Perché creare uno scraper? La prima cosa che mi viene in mente sono gli '#' hashtag. Un classico di Doña Cecilia sono le empanadas che sono molto simili ad involtini fritti ripieni di carne o pollo, da condire con l’ajì, salsa piccante immancabile nelle tavole colombiane. Instagram proibisce qualsiasi operazione di crawling, scraping ciò significa che se raccogliamo dati potremmo incorrere nella disabilitazione dell'account, ma non ci dovrebbero essere ripercussioni legali.
Aggiungiamo all'url la stringa di query ?__a=1 per avere il nostro primo endpoint e guardiamo che cosa succede:
Abbiamo così recuperato con una chiamata in get il contenuto json di un post e più avanti analizzandolo scopriremo che essendo costiuito da una sola immagine prende il nome di GraphImage. 2.0 - EndpointsIl 9 aprile del 2012 Facebook compra Instagram, ma inizia solo nel gennaio del 2018 ad avviare il processo di migrazione di Instagram da un'app con logica API Rest ad una che API Graph, progettata sulla base di quella esistente di Facebook.
Per le pagine profilo Instagram ha iniziato così ad utilizzare l'API di GraphQL, progetto che era nato nel 2010 dal team di sviluppo di Facebook per poi essere rilasciato pubblicamente nel 2015. Ed infine diventando nel 2018 una fondazione senza scopo di lucro.
2.1 - DatamodelAvere una classe per gestire solo gli endpoints è molto pratico considerando la velocità con cui Instagram cambia e depreca le diverse chiamate.
3.0 - Strumenti per sviluppatoriGoogle Chrome ci fornisce una serie di strumenti utili per ispezionare il nostro profilo Instagram. Per farlo è necessario fare click con il pulsante destro del mouse in un punto qualsiasi della pagina e selezionare l'opzione Ispeziona o la scorciatoria da tastiera Ctrl + Maiusc + I
4.0 - CookiesIspezionando la pagina facciamo click sulla tab Application (1) , e dal menù a sinista Storage possiamo accedere alla voce Cookies (2) e vedere la tipologia di dati (3) che utilizza Instagram. Dobbiamo quindi scrivere una classe per gestire i cookies che ci restituisca in un dizionario i dati che ci servono per il login ed avere un sessione attiva:
4.1 - SessioneIniziamo a scrivere la nostra classe creando un oggetto requests.session() che ci consentirà di mantenere determinati parametri fra le richieste e soprattutto di poter accedere ai cookies. Se dobbiamo fare più di una chiamata al servizio di Instagram ci conviene utilizzare un oggetto sessione.
Ed è questo è il motivo per cui dalla nostra istanza di sessione usiamo session.get () e session.post () anziché i metodi di get e post di requests. Omettendo un valore alla volta ho scoperto che la richiesta fallisce se la voce Referer non è impostata su un URL. Visto che dobbiamo loggarci e fare lo scrapping di singoli post, dobbiamo impostarlo sull'url del login:
Utilizzando il metodo della classe Endpoints che abbiamo precedentemente scritto:
4.2 - Token e user-agentFacendo sempre tentativi ed errori ho scoperto che la richiesta fallisce anche nel caso in cui manchi un x-csrftoken valido e la corrispondente voce negli headers. Probabilmente questo token viene utilizzato per prevenire false richieste.
Instagram inizialmente era stato pensato solo come un'applicazione da utilizzare da smartphone, e faceva un controllo dell'user agent per bloccare le richieste che non fossero da un dispositivo mobile. Ora che Instagram è accessibile anche da desktop, questo non è più un problema.
Inoltre può essere utilizzato per identificare il device da cui ci connettiamo. Motivo per cui cambiando l'user-agent a volte Instagram può identificare l'accesso da un device che non conosce. 4.3 - Datamodel
Sitografia[1] Nilay Patel , No, Instagram can't sell your photos: what the new terms of service really mean, The Verge, 18/12/2012 GraphQL Emoji |