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.

Instagram scraper

Il 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.
Per molti progetti di machine learning (computer vision o natural language processing), sono necessari dati con una label ed immagini ad alta risoluzione.
Poter scaricare immagini con un particolare hashtag sarebbe un risparmio di tempo perché eliminerebbe o ridurebbe il processo di labelling per la creazione del training dataset.  Altro possibile utilizzo di analizzare le immagini è la possibilità di trasformare un contenuto visivo in uno testuale rendendolo accessibile ad uno screen-reader per persone cieche o ipovedenti.
Lo scraping del contenuto testuale come i commenti  può aiutarci ad identificare i migliori commentatori del nostro profilo, la frequenza con cui commentano,  le emozioni che esprimono i nostri followers.

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.
Dalla barra degli indizzi del browser prendiamo l’url del post con l’immagine delle empanadas:

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.

Endpoints

Il 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.

Starting today (January 30), we are launching three new features on the Instagram Graph API designed to help businesses better manage their organic presence on Instagram. As part of our API changes, we will also be deprecating the older Instagram API Platform over the next two years beginning on July 31, 2018

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.
Creiamoci una classe con i diversi endpoints che andremo a chiamare, partendo dal metodo per ricavarci l’url GraphQL che abbiamo utilizzato per le empanadas di Doña Cecilia:

Datamodel

Avere una classe per gestire solo gli endpoints è molto pratico considerando la velocità con cui Instagram cambia e depreca le diverse chiamate.

Strumenti per sviluppatori

Google 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


Possiamo così iniziare a comprendere dai cookies la struttura dei dati necessari per il login e analizzare quella delle queries GraphQL.

Cookies

Ispezionando 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:

Sessione

Iniziamo 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:

Token e user-agent

Facendo 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.
L’user-agent può contenere dettagli come: il tipo di browser, il sistema operativo, il fornitore o la versione dell’user-agent.

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.

Datamodel

Sitografia

Instagram

[1] Nilay Patel , No, Instagram can’t sell your photos: what the new terms of service really mean, The Verge, 18/12/2012
[2] Josh Ocampo, Instagram Doesn’t Own Your Photos, But They Can Still Use Them Forever, LifeHacker, 21/8/2019
[3] Ben Gilbert , No, you don’t have to publicly declare that Instagram can’t use your photos — you already said yes when you signed up, Insider, 21/08/2019
[4] Instagram and Copyright: What are the terms of use?, Copyrightlaws, 11/01/2021

GraphQL
[1] Frederic Lardinois, Facebook’s GraphQL gets its own open-source foundation, Techcrunch, 6/11/2018
[2] Instagram Team, Ora puoi programmare i post con l’API Instagram Graph, Facebook for business, 30/01/2018
[3] Instagram Team, Instagram API changes 2020: Instagram Graph API and Basic Display API, 2018

Emoji
[1] Kralj Novak P, Smailović J, Sluban B, Mozetič I (2015) Sentiment of Emoji.