Publicatie:Archiveren van sociale media in Amsab-ISG

From Meemoo Kennisbank
Jump to navigation Jump to search


Samenvatting

Sinds maart 2020 archiveren we in Amsab-ISG sociale media, in het bijzonder facebook, twitter, instagram en youtube. Deze pagina is een work in progress van onze bevindingen.


Referentie
Titel Archiveren van sociale media in Amsab-ISG (Voorkeurstitel)
Locatie
Uitgever
Jaar van uitgave 2020
Rechten CC-BY-SA
Persistent ID


Inleiding: het archiveren van sociale media in Amsab-ISG

Sociale media geeft een stem aan onder-gerepresenteerde groepen doordat iedereen -met internetverbinding- kan deelnemen aan het publieke debat zonder redactionele tussenkomst. We moeten methodes ontwikkelen om die verborgen geschiedenissen, deze vormen van activisme die zich voor een stuk online afspelen, in al zijn diversiteit te capteren, te waarderen en te verzamelen. De software die ons in staat stelt om dit te doen kan onderverdeeld worden in twee categorieën:

1. Programma’s waarmee we de oorspronkelijke ‘look and feel’ (structuur en lay-out) kunnen archiveren. De gearchiveerde versie is opgeslagen in het standaard WARC formaat (Web ARChive). Om WARC-bestanden te raadplegen is wel nog aparte software nodig (cf. infra), maar het resultaat is een gearchiveerde versie van de sociale media-pagina dat visueel het beeld geeft dat de gebruiker destijds ook zag en waarin kan gebrowsed worden.

Idealiter gebruiken we dit soort software voor de periodieke archivering van de sociale media-pagina’s van onze archiefvormers, zodat we deze net zoals onze websitecollectie kunnen bewaren in het standaardformaat WARC, waarbij we de ‘look and feel’ behouden. Wanneer er naar aanleiding van bepaalde actuele gebeurtenissen nieuwe organisaties of initiatieven ontstaan die relevant zijn voor onze collectie, dan worden deze ook op dezelfde manier opgenomen. In de praktijk is het echter niet altijd mogelijk om sociale media correct te archiveren omdat de for-profit sociale media-organisaties nu eenmaal hun geld verdienen aan de data van hun gebruikers, en het daarom zeer moeilijk maken voor derden om handelingen (vb. archiveren) uit te voeren op die data.

2. Programma’s die alle data en bijhorende metadata gestructureerd scrapen, maar zonder de ‘look and feel’. Hierbij worden de sociale media-pagina’s niet in zijn geheel gearchiveerd, maar alle elementen (teksten, foto’s, video’s,…) worden apart gescraped en bewaard. We hebben niet langer een visuele gearchiveerde versie waarin we kunnen browsen. In de plaats daarvan krijg je een bestandsmap met allerhande bestandsformaten en bijhorende csv’s/json’s/etc met beschrijvingen van alle elementen. Deze programma’s maken bijna altijd gebruik van de API (application programming interface) van het sociale media platform. Aan de hand van de API kunnen we toegang krijgen tot de data, maar de sociale media-bedrijven behouden er ook de controle over doordat zij bepalen wat jij mag doen (cf. infra).

Dit soort software gebruiken we voor event-driven archivering wanneer de gebeurtenis/online campagne aanleiding geeft tot het gebruik van een hashtag. Er kan ook op trefwoorden worden gearchiveerd. Gedurende de BLM protesten werd ‘Leopold II’ bijvoorbeeld niet gebruikt als hashtag, maar het was wel een trefwoord dat in zeer veel tweets voorkwam en relevant was voor onze collectie. Er is nood aan een actieve prospectie waarbij we de actualiteit nauw opvolgen. Wegens bepaalde softwarelimieten (cf. infra) moet idealiter om de 7 dagen beslist worden naar aanleiding van welke gebeurtenissen we archiveren. Momenteel is hier nog geen waarderingsinstrument voor opgesteld. Dit zal ook moeten afgestemd worden met andere erfgoedorganisaties om te voorkomen dat sociale media-data dubbel wordt gearchiveerd, of omgekeerd dat een belangrijke gebeurtenis door de mazen van het net valt. Het is zeer moeilijk om retroactief de online media-activiteit rondom een gebeurtenis te gaan archiveren, daarom is het belangrijk dat er kort op de bal gespeeld wordt.

Software: archiveringsstrategieën

Twitter

Inleiding

We hebben een verschillende strategie voor het periodieke archiveren van de Twitterpagina’s van onze archiefvormers en het event-driven archiveren van tweets op basis van hashtags en trefwoorden. Voor de periodieke archivering maken we gebruik van het programma Brozzler. Dit programma willen we ook gebruiken voor Instagram en Facebook, maar zover staan we momenteel nog niet. Hashtags en trefwoorden archiveren we met Twarc. In de beginfase hebben we ook gebruik gemaakt van Nodexl, maar we zijn hiermee gestopt omdat dit geen open source is.

Nodexl

Inleiding

Nodexl is een add-in voor excel. Een add-in is een programma dat extra functionaliteiten toevoegt aan het bestaande programma. Er bestaat een gratis versie die kan gedownload worden op https://www.smrfoundation.org/nodexl/, maar dit volstaat niet voor hashtagarchivering. De gratis versie laat enkel toe om de laatste 2000 tweets met een bepaalde hashtag te archiveren. Het programma gaat ook maar 7 dagen terug in de tijd. Die limiet van 7 dagen is normaal voor Twitter, dat is één van de regels bij gebruik van de API. Daarnaast is het ook zeer moeilijk om doelgericht te archiveren met Nodexl: stel dat er een Engelstalige hashtag is (vb. #extinctionrebellion) waarvan je enkel de Belgische tweets wilt, dan lijkt het niet doenbaar om te filteren op bijvoorbeeld locatie of taal.

Nodexl is wel gebruiksvriendelijk omdat je niet via de command line moet werken. Dit maakt het laagdrempelig voor de basisfuncties, maar voor complexere analyses is toch behoorlijk wat kennis van het programma nodig.

Netwerkanalyses

Interessant aan Nodexl zijn de netwerkanalyses die je kan uitvoeren. Hieronder een mogelijke werkwijze:

Stap 1: ga naar de Nodexl tab van het excel bestand en importeer via ‘from Twitter search network’ de hashtag

Stap 2: we maken gebruik van het algoritme ontwikkeld door David Harel en Yehuda Koren. Dit is een algoritme dat helpt bij het opstellen van grafieken

Nodexl1.png


Stap 3: we groeperen de tweets in clusters. Clusters zijn sub-groepen, ‘communities’, dit zijn personen die met elkaar in connectie staan, ze volgen-antwoorden-retweeten elkaar, maar het kan ook indirecter geïnterpreteerd worden: ze zijn een volger van een volger of ze hebben gemeenschappelijke interesses,…

Nodexl2 netwerkanalyse2.png


Stap 4: om ervoor te zorgen dat de grafiek visueel duidelijk is zorgen we ervoor dat het Harel-Koren algoritme de clusters opsplitst in aparte rechthoeken. In realiteit horen tweets vaak thuis binnen meerdere communities (clusters), denk bijvoorbeeld aan een reactie van een politicus op een bericht van een activist, waarna de volgers van beide partijen zich in de conversatie mengen door te antwoorden, retweeten, eigen posts op te stellen, posts van anderen te liken,… Dit zijn twee zeer verschillende communities, maar het algoritme zou ze samen (boven op elkaar) groeperen omdat ze inhoudelijk een reactie zijn op elkaar. Door ervoor te zorgen dat elke cluster een eigen ‘box’ krijgt wordt het visueel veel duidelijker. Het feit dat twee clusters inhoudelijk in relatie staan tot elkaar blifjt duidelijk door de verbindingslijnen. Als je met de muis over de gekleurde bollen (tweets) gaat kun je de inhoud lezen en zien hoe ze in relatie tot elkaar staan.

Nodexl3 netwerkanalyse3.png


Nodexl4 netwerkanalyse4.png


Dit soort netwerkanalyses laat toe om interessante nieuwe actoren /initiatieven te ontdekken. Het geeft inzicht in de verspreiding van een hashtag: gebeurde dit bottom-up of was het een campagne vanuit een bepaalde organisatie? Het laat ook eventuele pre-selectie toe wanneer je wilt overgaan tot het archiveren van de media (foto’s/video’s). Nodexl scraped namelijk enkel de tekstuele inhoud en metadata. Een preselectie kan nuttig zijn bij zeer algemene hashtags (vb. #groen), waarbij ook inhoud zal meegekomen zijn die niet relevant is voor de collectie.

Vergelijkbaar met Nodexl is TAGS (https://tags.hawksey.info/), dit is een google sheets template. Hier hebben we (nog) geen testen mee gedaan.

We gaan niet dieper ingaan op Nodexl omdat we er geen gebruik meer van maken. We zijn overgeschakeld naar Twarc aangezien dit volledig open source is en meer functionaliteiten heeft.

Twarc

Inleiding

Twarc (TWitter ARChiving) is open source software dat enkele jaren geleden ontwikkeld is door de Documenting the Now- community naar aanleiding van Black Lives Matter protesten in de VS. DocNow is een groep van activisten, archivarissen en onderzoekers die zeer ethisch te werk gaan bij het achiveren van sociale media.

Het programma Twarc gebruiken wij enkel voor de event-driven archivering van hashtags en trefwoorden, maar het kan in theorie ook gebruikt worden voor het archiveren van Twitterpagina’s. Dit is niet aangeraden aangezien Twarc geen WARC bestanden kan aanmaken en de ‘look and feel’ dus niet bewaard wordt. Er worden JSON-datasets aangemaakt die de tekstuele inhoud en metadata bevatten. Alle media (foto’s en video’s) moeten vervolgens nog apart gedownload worden. Het feit dat er geen WARC bestanden wordt aangemaakt bij het archiveren van hashtags is niet erg, integendeel het is een voordeel zowel voor ons als archivaris als voor onderzoekers. Het laat ons toe om veel gerichter te harvesten door bijvoorbeeld enkel de media van de unieke tweets te archiveren, anders kom je in een situatie waarbij je bepaalde foto’s en video’s honderden keren dubbel hebt staan doordat de media van de retweets ook zijn gedownload. Ook voor onderzoekers kunnen er heel wat meer analyses worden uitgevoerd op een JSON dataset, dan met een WARC bestand.

Installatie en configuratie op Linux

Installeer Twarc via de Linux terminal, bijvoorbeeld:

Pip3 install twarc 

Om Twarc te kunnen configureren heb je een Twitter developer account nodig: https://developer.Twitter.com/en/apply-for-access (apply – create an app – generate access tokens)

Geef nu het programma Twarc toegang tot de Twitter API: voer in de linux terminal ‘twarc configure’ in en geef de gevraagde gegevens op: de consumer_key, consumer_secret, access_token en access_token_secret

Opmerking: het feit dat Twarc gebruik maakt van de Twitter API heeft grote implicaties op toegang en gebruik van de datasets (cf. infra). Ook tijdens het harvesten van de data worden er limieten gesteld op hetgeen je mag doen, zo zal een archiveringssessie dikwijls gepauzeerd worden voor 15minuten (rate limiting per user access token).

Harvesten van hashtags of trefwoorden
Stap 1: scrapen van de tekstuele content en metadata

Mogelijkheid 1: de hashtag of trefwoord is uniek voor België

Typ in de terminal:

twarc search [hashtag/trefwoord] > [zelfgekozen_naam].jsonl

Voorbeeld:

twarc search beternacorona > beternacorona_27april.jsonl

De media (foto’s en video’s) hebben we nu nog niet gearchiveerd. Dit komt later (cf. infra).

Opgelet! De ‘search’-functie beperkt zich tot de voorbije 7 dagen, dit is een limiet van de Twitter API. Indien een hashtag of trefwoord gedurende een lange periode moet gearchiveerd worden kan gebruik gemaakt worden van de optie ‘filter’. Zolang je computer aan staat en je internet hebt ‘luistert’ het programma naar de Twitterstroom of er nieuwe berichten zijn. Wij kiezen er echter voor om dit niet te doen, wij archiveren de hashtags om de 7dagen en gooien later die datasets samen en halen er eventuele dubbels uit.

Opmerking: wij kiezen ervoor om de data de bewaren in het JSONL formaat (JSON line). Dit is niet verplicht, je kan evengoed .json bestanden aanmaken. Bij JSON line is elke lijn een JSON-object. Met andere woorden één line = één tweet. Je kan gemakkelijk tellen hoeveel tweets zijn gearchiveerd door in de terminal dit in te geven:

wc –l < [bestandsnaam].jsonl 

Het JSON Line formaat is ook handig voor bepaalde Linux command line tools / acties die we eventueel willen uitvoeren, maar heeft ook nadelen: JSONL is niet meer zuivere JSON, het kan ook niet zomaar in één stap omgezet worden naar een CSV,… (cf. infra)

Mogelijkheid 2: De hashtag of trefwoord wordt ook internationaal gebruikt

Werkwijze: we maken gebruik van de geocode setting van Twarc. We vertrekken vanuit de coördinaten van het geografisch middelpunt van Vlaanderen/België en berekenen de afstand naar de verste hoeken van Vlaanderen/België en zetten deze afstand om naar mijl. We archiveren op die manier alles in een cirkel van x mijl rondom dit geografische middelpunt van Vlaanderen. Hiermee halen we natuurlijk ook materiaal van sommige delen uit Nederland en Frankrijk binnen, maar dit lijkt de enige methode te zijn om op locatie te archiveren.

Voorbeeld:

twarc search “black lives matter” –geocode 51.0378,4.2405,75mi > black_lives_matter_19april.jsonl

Opmerking: in het bovenstaande voorbeeld hebben we gezocht op een (vaste) combinatie van trefwoorden, dit verduidelijk je best met aanhalingsteken kwestie van geen problemen te hebben met de spaties. Vb. “samen tegen corona”

Stap 2: we voegen de datasets samen en halen dubbels eruit

We hebben gedurende een bepaalde periode om de 7dagen een hashtag gearchiveerd. Vervolgens gooien we al deze datasets samen tot één groot bestand. Het is hiervoor nodig dat er telkens een gelijkaardige naam is gekozen. Wij doen dit in de vorm: hashtag_datum.jsonl

Nu kunnen we met de concatenate command (cat) deze files samenvoegen:

cat [naam_waarmee_elk_bestand_begint]* > [zelfgekozen_naam.jsonl

Bijvoorbeeld drie datasets van de hashtag beternacorona met als naam beternacorona_1april.jsonl, beternacorona_8april.jsonl en beternacorona_15april.jsonl. Dit wordt vervolgens in de terminal:

Cat beternacorona* > combined_beternacorona.jsonl

Aangezien we natuurlijk niet tot de minuut perfect om de 7 dagen archiveren, zal er dubbele data zitten in dit bestand. Een tweet van maandagochtend 6juli om 11u zal bijvoorbeeld ook in de dataset zitten die genomen is de week erna op maandagochtend 13juli om 9u.

De makers van Twarc hebben al een python script opgesteld dat we hiervoor kunnen gebruiken: kopieer deduplicate.py van https://github.com/DocNow/twarc/tree/main/utils (en voer hierin de locatie van jouw python toe: vb. #!/bin/env/python3) Vul nu de volgende command line in:

python3 deduplicate.py [naam_van_je_bestand].jsonl > [kies_een_naam].jsonl

Bijvoorbeeld:

python3 deduplicate.py combined_beternacorona.jsonl > deduplicated_beternacorona.jsonl
Stap 3: harvesten van de media: afbeeldingen en video’s

3.1 we halen de retweets uit de dataset

De dubbels zijn nu uit de dataset, maar de retweets zitten er nog in. Retweets zijn op zich wel belangrijk aangezien dit zeer interessante data is, maar voor het archiveren van afbeeldingen en video’s willen we niet dat een foto die 100 keer is geretweet, ook 100 keer wordt gearchiveerd.

Hiervoor kunnen we ook weer gebruik maken van een script ontwikkeld door de Docnow-community: kopieer noretweets.py en gebruik het op de volgende wijze:

python3 noretweets.py [deduplicated].jsonl > [nieuwe_naam].jsonl

Voorbeeld:

python3 noretweets.py deduplicated_BLM.jsonl > BLM_noretweets.jsonl

We hebben nu een bestand met alle unieke tweets. Hiervan willen we de media archiveren. We kunnen deze JSONL file niet zomaar ingeven in een webcrawler, we moeten eerst alle unieke URL’s van de tweets eruit halen. Hiervoor maken we opnieuw gebruik van een script opgesteld door de Docnow-community: media_urls.py

3.2 we stellen een seedlist op

Maak nu gebruik van het media_urls.py script en voeg er nog enkele command line opties aan toe:

python3 media_urls.py [naam_van_je_bestand].jsonl | sort | uniq > [kies_een_naam].txt 

Voorbeeld:

python3 media_urls.py BLM_noretweets.jsonl | sort | uniq > urls_media.txt

Je krijgt nu een tekstbestand met daarin de twitter-id’s (van de unieke tweets) en bijhorende URL’s van afbeeldingen en video’s.

We maken een apart bestand met enkel de URL’s: open/importeer de .txt in Excel, splits op spatie en kopieer de kolom met URL’s naar een nieuwe tekstbestand. We hebben nu een seedlist.txt

3.3 we archiveren de foto’s en video’s

Maak nu een map media aan waar de afbeeldingen en video’s moeten komen (mkdir), en ga er naar toe (cd)

Harvest de foto’s en video’s met wget:

wget –i /locatie/naar/het/bestand/[bestandsnaam].txt

3.4 het beschrijven van een Twitter-dataset

Meer informatie over het beschrijven en registreren van sociale media volgt onder punt 4. Registratie en metadata. Enkele vragen die we nog moeten uitwerken: we hebben een JSONL bestand met alle tweets en metadata, kunnen (en moeten) we dit beter omzetten naar een CSV? Hoe zit het met de beschrijving van de gearchiveerde foto’s en video’s? Kunnen we gebruik maken van tekstbestand met ID’s en bijhorende URL’s van het media_urls.py script?

Er bestaat een script om jsonl om te zetten naar csv: https://github.com/DocNow/twarc/blob/main/utils/json2csv.py De werkwijze is dan als volgt:

python3 json2csv.py [naam].jsonl > [naam].csv
Stap 4: de data analyseren

We maken gebruik van enkele open source scripts die terug te vinden zijn op [1]. Er kan gekozen worden om de instructies op die Github pagina te volgen en ook je harvest binnen die structuur uit te voeren. Wij kiezen er echter voor om ons te beperken tot enkele scripts (en die deels aan te passen). We klonen wel de gehele github-pagina (code -> download zip), en plaatsen de datasets waarop we willen werken tijdelijk binnen die map.

4.1 Maak een tijdlijn

We maken gebruik van het d3times.py:

python3 d3times.py -a -t local -i 24H beternacorona_week14december.jsonl > timebar_beternacorona_week14dec.html

Het kan interessant zijn om de dataset eerst op te splitsen per dag en vervolgens een timebar per uur op te stellen: 1) We maken gebruik van het script vermeld in dit artikel: [2], dit moet deels aangepast worden:

#!/usr/bin/env python3
#CC0 1.0 Universal
from __future__ import print_function

import sys
import json
import fileinput
import dateutil.parser
import dateutil.rrule
import pytz
import pandas as pd
import datetime
import io
tijdzone = pytz.timezone('Europe/Brussels')
start_date = dateutil.parser.parse("14-june-2020")
start_date = eastern.localize(start_date)
end_date = dateutil.parser.parse("21-june-2020")
end_date = tijdzone.localize(end_date)
dates = pd.date_range(start_date, end_date).tolist()
for date in dates:
date_plus_one = date + pd.DateOffset(1)
pretty_print = date.to_pydatetime().strftime('%Y%m%d')
filename = 'Beternacorona-tweets' + pretty_print + '.json'
f = io.open(filename, 'w', encoding='utf-8')
for line in fileinput.input():
tweet = json.loads(line)
created_at = dateutil.parser.parse(tweet["created_at"])
created_at = created_at.astimezone(eastern)
if ((created_at >= date) and (created_at < date_plus_one)):
f.write(unicode(json.dumps(tweet, ensure_ascii=False) + '\n'))
f.close()

2) We maken datasets per dag: python3 twitterperdag.py beternacorona.jsonl 3) We maken een tijdlijn per uur:

python3 d3times.py -a -t local -i 1H beternacorona-tweets-14062020.jsonl > timebar_beternacorona_14juni.html

4.2 Grafieken en statistieken

We maken gebruik van het script reportprofile.py. Om dit script te kunnen laten werken moet je de structuur nabouwen zoals uitgelegd op de wiki en een metadata.json bestand aanmaken.

python3 reportprofile.py beternacorona.jsonl -o html > report_beternacorona.html

Je kan zelf kiezen of je dit doet voor de volledige dataset, of je beperkt tot de wekelijkse dataset, of de dataset opsplitst per dag.

4.3 Tekstanalyse adhv wordclouds

Tijdens de BLM-protesten van eind mei, begin juni 2020 hebben we meerdere hashtags gearchiveerd. We hebben die datasets opgesplitst per dag en wordclouds gemaakt.

We maken gebruik van het wordcloud script van [3]. Om dit script goed te kunnen laten werken is het noodzakelijk dat je zelf termen Nederlandse toevoegt onder 'stop_words' om ervoor te zorgen dat woorden zoals 'en' of 'van' niet in je wordcloud komen te staan.

4.4 Analyse van de hashtags

Maak gebruik van het script d3cotags.py. In de praktijk is het resultaat vaak nogal onoverzichtelijk.

Brozzler

Inleiding

We archiveren de Twitter-pagina’s van onze archiefvormers (minstens) jaarlijks met het programma Brozzler. Wanneer er naar aanleiding van bepaalde actuele gebeurtenissen nieuwe interessante initiatieven / organisaties ontstaan, dan worden deze ook met Brozzler gearchiveerd.

Brozzler is ontwikkeld door het Internet Archive voor het archiveren van sociale media en andere soorten dynamische websites (vb. wix websites) die moeilijk via de normale webcrawlers kunnen worden gearchiveerd. Het grote verschil is dat Brozzler gebruik maakt van een echte webbrowser tijdens het archiveren om de interactie te kunnen opnemen. Je zou kunnen zeggen dat Brozzler zich voordoet als een echte gebruiker die interageert (scrollen, klikken,…) met de webpagina in plaats van een crawlbot die louter de links volgt en niet in staat is om te scrollen door een sociale media pagina (informatie op sociale media-pagina’s wordt dikwijls niet opgeladen door het klikken op een nieuwe link naar een ander gedeelte van de website, maar door te scrollen en zo nieuwe informatie op te laden). De informatie wordt geïndexeerd in WARC bestanden.

Het programma heeft nog heel wat problemen. Zelfs de peperdure Archive-It service van het Internet Archive heeft het er nog moeilijk mee, en hebben heel wat regels opgesteld die gevolgd moeten worden om het archiveren van sociale media zo goed mogelijk te laten verlopen, bijvoorbeeld: https://support.archive-it.org/hc/en-us/articles/208333113-Archiving-Facebook. Heel wat van die aanbevelingen lijken niet mogelijk met de gratis open source versie van Brozzler. Er wordt ook amper documentatie aangeboden over de open source versie: https://github.com/internetarchive/brozzler.

Installatie en gebruik

pre-vereisten

Om Brozzler te kunnen gebruiken heb je nood aan Python 3.5, Chromium of Google Chrome (versie 64 of later) en rethinkDB (https://rethinkdb.com/docs/install/). Het gebruik van rethinkDB kan problemen geven in de toekomst aangezien dit niet langer wordt ontwikkeld en ondersteund.

installeer Brozzler

De Github van Brozzler kan verwarrend zijn aangezien er verschillende methodes van installatie en gebruik door elkaar vermeld staan. Er kan gebruikt gemaakt worden van pip3 install brozzler, pip install brozzler[easy] en pip install brozzler[dashboard].

Start een crawl

Eerst moeten we RethinkDB starten. De default-port is 8080, maar deze is bij ons al in gebruik voor Openwayback. Daarom dat we RethinkDB verbinden aan een andere poort, en we laten het ook in de achtergrond lopen (‘&’ in bash), maar wel met een logfile:

rethinkdb –bind all –http-port 8081 &>>rethink.db.log &

Open vervolgens http://localhost:8081 om naar RethinkDB te gaan

Het archiveren van een Twitter-pagina kun je gemakkelijk van de terminal starten:

brozzler-new-site https://Twitter.com/amazone_be

Brozzler zal nu automatisch Google Chrome of Chromium opstarten en het archiveringsproces laten lopen. Open op een andere browser nog eens http://localhost:8081 voor de Brozzler-dashboard, je zal zien dat er daar een profiel is aangemaakt voor de crawl. Wanneer de crawl gedaan is kun je via de Brozzler-dashboard de gearchiveerde Twitter-pagina bekijken (het maakt gebruik van python wayback (pywb) voor de visualisatie van WARC’s). De WARC’s kun je kopiëren naar je digitaal depot vanuit een bestandsmap ‘warcs’ die zal aangemaakt zijn in de folder waar je Brozzler hebt gedownload.

Start een crawl met een configuratie in een YAML-bestand

Een betere methode om crawls te starten is door gebruik te maken van YAML-files, waarin per type sociale media een specifieke configuratie moet worden opgesteld. We zijn dit nog aan het testen. Gebruik hiervoor best een code editor zoals Notepad++, Atom of Visual Studio Code.

Youtube

Inleiding

We maken gebruik van het command line programma Youtube-dl om video’s van Youtube te archiveren. De ‘look and feel’ van de officiële pagina’s van onze archiefvormers doet er bij Youtube minder toe doordat er maar één type bron is, namelijk video. Bij de video’s horen ook wel tekstuele data in de vorm van de titel, description, ondertitels en reacties. Maar het heeft weinig meerwaarde om dit als geheel in een WARC bestand te bewaren. Voor toegang kan het namelijk een voordeel zijn dat de video’s in aparte bestanden worden bewaard met bijhorende tekstbestanden met de metadata.

Youtube-dl

Youtube-dl is zeer simpel te installeren: https://github.com/ytdl-org/Youtube-dl

Onze command line bestaat uit de volgende elementen:

- f best: we willen de video’s downloaden in het best mogelijke formaat

- ciw: dit is een combinatie van 3 opties: continue (deels gedownloade bestanden worden weer gestart), ignore-errors (het programma stopt niet wanneer er een probleem is, bijvoorbeeld een video is unavailable in een playlist) en no-overwrites

- write-description: de beschrijving van de uploader

- write-info-json: we bewaren de bijhorende metadata in een JSON bestand

- write-annotations: we downloaden eventuele annotaties

- write-sub: we downloaden eventuele ondertitels

- write-thumbnail: we downloaden de afbeelding die zichtbaar is als je door de video’s browsed

- dateafter [jaarmaanddag]: via deze optie kunnen we zeer gemakkelijk jaarlijks een harvest maken als we dit combineren met:

- datebefore [jaarmaanddag]

- -o "%(id)s.%(ext)s": we zorgen dat de videos een unieke id krijgen

- URL van de Youtubepagina / playlist

Voorbeeld:

Youtube-dl -f best -ciw --write-description --write-info-json --write-annotations --write-sub --write-thumbnail --dateafter 20190101 --datebefore 20191231 -o "%(id)s.%(ext)s" https://www.Youtube.com/channel/UCymlAQzmFJw-sJ2n96RTl-w/videos


Error 429 too many requests

Wanneer je teveel metadata opvraagt kan Youtube je een 'soft ban' opleggen. Je zal in je webbrowser Youtube moeten openen en op een willekeurige video klikken. Vervolgens ga je een captcha moeten oplossen. Dat is de eerste stap, maar daarmee werkt Youtube-dl nog niet. Er zijn meerdere mogelijke oplossingen: 1) kijk na of je de nieuwste versie hebt van Youtube-dl: pip3 --upgrade youtube-dl, misschien lost dit het probleem vanzelf op; 2) volg de instructies van https://github.com/ytdl-org/youtube-dl#http-error-429-too-many-requests-or-402-payment-required waarbij je de cookies van je browser exporteert en toevoegt aan de command line met --cookies cookies.txt; 3) je kan --force-ipv4 proberen toevoegen aan de commandline; 4) wacht gewoon enkele dagen, het is maar een tijdelijke ban

Nadere toegang opstellen

Youtube-dl ---skip-download -ciw --get-title --get-id --dateafter 20190101 --datebefore 20191231 https://www.Youtube.com/channel/UCymlAQzmFJw-sJ2n96RTl-w/videos > kieseennaam.txt

We krijgen een tekstbestand met daarin een oplijsting van alle unieke id's en bijhorende titels. Open dit bestand in notepad++, druk op 'ctrl' en 'h' (zoeken en vervangen), aanvinken onderaan 'regular expression', zoeken naar \n([a-zA-Z0-9_-]{11}\n) en dit vervangen door \t\1 en vervolgens importeren in excel en op tab scheiden.

We moeten nog uitzoeken hoe we deze metadata uit de JSON bestanden kunnen halen.

Instagram

Inleiding

Waarschuwing: de huidige versie van Instaloader is niet langer in staat om Instagram veilig te scrapen. Als je een account gebruikt om in te loggen via Instaloader zal dit geband worden.

Normaal gezien is het aangeraden om een verschillende strategie te gebruiken voor event-driven archivering van hashtags/trefwoorden (individuele afbeeldingen/posts) en periodieke archivering van archiefvormers (Instagrampagina’s). Bij Instagram kan er echter beargumenteerd worden dat het weinig meerwaarde heeft om ook de ‘look and feel’ te bewaren. Tegenwoordig wordt Instagram ook al meer gebruikt voor tekstberichten en video’s, maar de dominante bron blijft foto’s. Het is een afweging dat je zal moeten maken tussen de meerwaarde van een browse-baar WARC-bestand versus een bestandsmap waarbij elk object apart wordt bewaard.

Instagram is sinds 2012 eigendom van het bedrijf Facebook. Sinds enkele jaren maakt Facebook het steeds moeilijker om hun data te scrapen (cf. infra). Instagram is op dit moment nog relatief goed te archiveren, maar dit zal wellicht in de toekomst ook steeds moeilijker worden. De oorspronkelijke API werd bijvoorbeeld gewijzigd naar een graph-API waardoor sommige programma’s zoals Lentil niet meer werken.

Instaloader

Installatie

Instaloader kan zeer simpel geïnstalleerd worden met pip3: https://instaloader.github.io/

Archiveren van hashtags

Hashtags kunnen worden gearchiveerd door in de terminal gebruik te maken van de command line ‘instaloader “#hashtag”, bijvoorbeeld:

instaloader “#BLM_belgium”

Het is helaas niet mogelijk om op locatie/taal te archiveren. Bij algemene, Engelstalige hashtags zijn we dus niet in staat om enkel de Belgische posts te archiveren. Er bestaat wel een location id setting, maar dit is niet geschikt hiervoor. Tot nu toe archiveren we enkel zeer concrete hashtags die enkel in België in gebruik waren naar aanleiding van een bepaalde gebeurtenis.

Archiveren van Instagramprofielen

Er bestaan heel wat configuratieopties voor de instaloader-command line. Wij houden het echter zeer beperkt: instaloader profile profielnaam

Indien gebruik gemaakt wordt van een uitgebreide configuratie kan het handig zijn om dit op te stellen in een tekstbestand met als naam ‘args.txt’. Vervolgens kun je de crawl in gang steken in de terminal met ‘instaloader +args.txt’. Dit bestand kan ook gebruikt worden als seedlist voor het automatisch archiveren van meerdere profielen (nog niet getest).

Naar aanleiding van de corona crisis hebben we een crawl beperkt in tijd gemaakt aan de hand van deze code: https://instaloader.github.io/codesnippets.html#download-posts-in-a-specific-period. Hieronder een voorbeeld waarin we alle Instagram-berichten van het account comacstudenten downloaden van de periode 1 februari tot 28 april:

from datetime import datetime
from itertools import dropwhile, takewhile
import instaloader
L = instaloader.Instaloader()
posts = instaloader.Profile.from_username(L.context, 'comacstudenten').get_posts()
SINCE = datetime(2020, 4, 28)
UNTIL = datetime(2020, 2, 1)
for post in takewhile(lambda p: p.date > UNTIL, dropwhile(lambda p: p.date > SINCE, posts)):
print(post.date)
L.download_post(post, 'comacstudenten')

Instagrampagina’s bewaren in het WARC formaat

Wij kiezen er momenteel voor om Instagram niet in het WARC formaat te bewaren. Indien dit toch gewenst is, kan gebruik gemaakt worden van Brozzler (cf. supra) en Webrecorder. De uitleg over Webrecorder zal volgen bij het gedeelte over Facebook (cf. infra).

Facebook

Inleiding

Facebook schermt zijn platform succesvol af, dit maakt het zeer moeilijk om de content te archiveren. Een gewone webcrawler loopt er op vast. Er zijn wel strategieën om de beveiliging deels te omzeilen, bijvoorbeeld door javascript uit te zetten en de URL van de mobile site op te geven, maar ook deze methodes werken niet perfect. De creator/admin van een Facebook-pagina of groep kan de inhoud wel zelf archiveren, maar dat is geen gebruiksvriendelijke datadump en hierbij wordt de ‘look and feel’ ook niet bewaard. Als derde partij die in het algemeen belang wilt archiveren moet je gebruik maken van de Facebook APIs (Pages API en groups API). Maar Facebook laat zeer weinig toe, en treed ook steeds strenger op. Dit is een evolutie begonnen als reactie op het Cambridge Analytica schandaal in 2018.

We hebben op dit moment nog geen geschikte methode gevonden voor het efficiënt archiveren van Facebook. Hieronder volgen de resultaten van enkele tests.

Webrecorder

Webrecorder.io is recent van eigenaar verandert, de huidige link is https://conifer.rhizome.org/. Op het eerste zicht zijn er geen praktische wijzigingen. Er bestaat een online versie waarbij je een account moet aanmaken en 5 GiB gratis krijgt alvorens je moet betalen voor opslag, en er is een open source versie: https://github.com/Rhizome-Conifer/conifer

De Webrecorder heeft als voordeel tegenover andere webcrawlers dat het in staat is om dynamic content beter te archiveren doordat het een opname maakt van je interactie met de webpagina. Het nadeel is dat dit handmatig moet gebeuren. Men heeft dit proberen automatiseren door een autopilot in te bouwen, maar deze werkt nog niet goed genoeg. Het succes van de autopilot hangt af van heel wat factoren, bijvoorbeeld de keuze van gebruikte browser, of je al dan niet ingelogd bent op de sociale media website, of er ondertussen nog andere processen aan het lopen zijn op de computer, … Daar komt nog bij dat de autopilot haast nooit volledig is, zo worden comments en video’s vaak overgeslagen. Dit ga je later nog handmatig moeten corrigeren. Vooral de browserkeuze lijkt een groot verschil te maken voor het succes of falen van de autopilot. De aangeboden virtual browsers lijken ook vaak drukbezet te zijn.

Momenteel gebruiken wij Webrecorder enkel voor kleine pagina’s die moeilijk te archiveren zijn met andere methodes. Bijvoorbeeld petitie-websites, evenement-pagina’s op Facebook, private groepen waarbij je eerst moet inloggen,… Het programma maakt WARC bestanden aan, maar deze WARC’s werken niet op andere visualisatie-programma’s zoals Openwayback. Het is een vergelijkbaar probleem als bij de WARC’s die worden aangemaakt door Wget. Indien gebruik gemaakt wordt van de online versie van Webrecorder waarbij je maar 5 GiB gratis opslagruimte krijgt, dan wordt aangeraden om na elke harvest de WARC’s te downloaden (klik op de job, vervolgens op collection manager) en vervolgens te verwijderen.

Brozzler

Zie de uitleg bij het onderdeel over Twitter.

Browsertrix

Dit hebben we nog niet getest. https://github.com/webrecorder/browsertrix

Toegang

Ethiek

Amsab-ISG wilt de geschiedenis van onder-gerepresenteerde groepen vastleggen. Sociale media geven een stem aan deze groepen, maar er moet een afweging gemaakt worden tussen enerzijds het persoonlijk belang van individuen die zich meestal niet bewust zullen zijn dat hun online reacties worden gearchiveerd, en het feit dat als we dit niet zouden archiveren, we bedragen aan het feit dat deze groepen niet gehoord worden. Deze afweging wordt nog meer prangend wanneer we online content archiveren van bijvoorbeeld betogingen of rellen, in extreme gevallen kun je mensen in gevaar brengen als hun uitingen op sociale media in verkeerde handen vallen. Een ander voorbeeld is het archiveren van besloten Facebookgroepen: moet je toestemming vragen, en zo ja aan wie? Volstaat het als de eigenaar van de groep toestemming geeft en moeten de leden van die besloten groep daarvan op de hoogte worden gesteld? Iedere instelling zal zelf de afweging moeten maken op welke wijze met dit soort vragen wordt omgegaan. Er zijn nog geen kant-en-klare antwoorden.

Gebruiksvoorwaarden

Twitter

De software die we gebruiken voor het archiveren van Twitter maakt gebruik van de officiële Twitter-API. In de gebruiksvoorwaarden van Twitter worden heel wat beperkingen gesteld op hetgeen we mogen doen met de Twitter data dat we scrapen.

Er zijn grote restricties op de reproductie en republicatie van Twitter-data. Zo mag dit in principe enkel voor eigen gebruik geharvest worden, en niet zomaar gedeeld worden met derden op de website/online catalogus. Om dit voor onderzoek toegankelijk te make moeten we de datasets eerst ‘dehydreren’, daarmee wordt bedoeld dat de datasets wordt gereduceerd tot een oplijsting van Twitter ID’s van de unieke tweet (vb. 1231941191819808769). Deze lijst ID’s moet dan met een ‘hydrator’-tool door de onderzoeker omgezet worden naar een doorzoekbare en werkbare dataset. Dit kan lang duren: de Twitter API laat 180 requests toe elke 15 minuten. Elke request kan 100 ID’s omzetten naar tweets met behulp van de status REST API. Dit komt neer op 18 000 tweets / 15min. Om een idee te geven van hoelang het kan duren voor onderzoekers om een dataset te kunnen raadplegen: onze BLM-dataset bestaat uit meer dan 200 000tweets, dat is bijna 3uur dat een onderzoeker nodig gaat hebben om die dataset werkende te krijgen.

Een bijkomend gevolg van het aanbieden van datasets in de vorm van ID’s, is dat tweets die in de tussentijd zijn verwijderd, niet door de onderzoekers kunnen geraadpleegd worden aangezien de ‘hydrator’ de online tweets gaat ophalen die horen bij de ID’s (die dus niet langer verwijzen naar een bestaande tweet). De verwijderde tweets zijn wel nog terug te vinden in onze destijds gearchiveerde JSON dataset, maar deze mag niet toegankelijk worden gemaakt. Daarnaast moeten in principe tweets die door de gebruiker worden verwijderd van Twitter, binnen 24uur ook door de erfgoedinstelling uit de dataset worden gehaald. Dit is ondoenbaar (we kunnen onmogelijk weten als er een tweet wordt verwijderd), en onwenselijk (verwijderde content is vaak de meest interessantste). Gelukkig lijkt Twitter steeds meer af te wijken van deze regel en mogen verwijderde tweets toch nog bewaard worden als dit in het openbaar belang is. Dit heeft wellicht meer te maken met de Amerikaanse politiek (Trump verwijdert nogal vaak zijn tweets), dan met een bekommernis om archiefinstellingen.

Facebook en Instagram

[deze informatie volgt later]

Wetgeving

Auteursrecht

Als gebruiker van een sociale media-platform behoud je het auteursrecht van je eigen foto’s, video’s en teksten. Door toe te stemmen met de gebruiksvoorwaarden geef je wel stilzwijgend te toestemming dat jouw berichten mogen gebruikt worden in een ruime licentievorm. Die bepaling is in eerste instantie bedoeld om te zorgen dat bijvoorbeeld jouw (auteursrechtelijk beschermde) Facebook-foto’s ook mogen gezien en gedeeld worden op de pagina’s van je vrienden, of met de groep waarin je ze deelt. Het aspect ‘bekijken/delen van auteursrechtelijk beschermd materiaal’ is op die manier geregeld in de gebruiksvoorwaarden. Het probleem zit op vlak van kopiëren (‘harvesten’/’scrapen’/’archiveren’) en vervolgens het opnieuw openbaar maken / reproduceren. In theorie is hiervoor telkens expliciete toestemming noodzakelijk, wat in de praktijk volkomen ondoenbaar is als je bijvoorbeeld Facebook-groepen archiveert. Allerhande ethisch-juridische vragen kunnen hierover gesteld worden: aangezien de eigenaars (de oorspronkelijke creator en de admins) van een Facebook-groep de data kunnen archiveren, volstaat het dan om enkel aan een admin toestemming te vragen? Een andere aspect dat in de praktijk vaak tegenkomt is dat mensen allerhande materiaal posten waar ze niet de rechten op hebben.

Privacy

Het wordt aangeraden om datasets enkel in de studiezaal beschikbaar te stellen en onderzoekers een geheimhoudingsclausule te laten ondertekenen. Sommige software laat wel toe dat datasets worden geanonimiseerd, wat het online toegankelijk maken zou kunnen vergemakkelijken. In het geval van Twitter wordt dit zelfs verplicht gemaakt doordat enkel de ID’s van de unieke tweets mogen worden gedeeld, maar hier komt dan weer de beperking dat er maar 50 000 tweets per dag zouden mogen gedeeld worden aan een onderzoeker als dit delen online gebeurd. Bij het merendeel van de software is dit anonimiseren echter niet zomaar technisch mogelijk. De vraag kan ook gesteld worden of het wel wenselijk is. Stel dat we de toestemming krijgen van een archiefvormer om hun Facebook-pagina te archiveren: mogen we dan ook de comments en likes archiveren? Het belang van sociale media zit hem juist in de interactie en discussie. Het niet archiveren van comments vermindert de historische waarde van de dataset aangezien je een eenzijdig beeld creëert.

Toegang tot de collectie: software

Het WARC-formaat: de oorspronkelijke ‘look and feel’ wordt bewaard

Het Web ARChive (WARC)-formaat is het standaardformaat geworden voor het archiveren van websites. Ook bij het archiveren van sociale media maken sommige archiveringsprogramma’s dit bestandsformaat aan, maar het gebruik ervan is minder belangrijk dan bij het website-archiveren. Het voordeel van WARC is dat het een soort ‘container’ vormt waarin alle verschillende bestandsformaten (waaruit een website is opgebouwd) samen worden bewaard. Dit is nuttig voor websites aangezien zij bestaan uit een grote verscheidenheid aan onderdelen, zowel inhoudelijk (foto’s, video’s, teksten) als structureel (nagenoeg elke website heeft een eigen opbouw en lay-out). Maar als we bijvoorbeeld Youtube archiveren wordt het veel minder belangrijk om gebruik te maken van het WARC-formaat aangezien er maar één dominante bron is, namelijk video. Het gebruik van het WARC-formaat is daarom in de eerste instantie nuttig voor sociale-media profielen, pagina’s en groepen aangezien we daar de verscheidenheid aan brontypes hebben (tekst, foto, video) en het een meerwaarde heeft dat dit als geheel wordt bewaard en we bij het toegankelijk maken dezelfde ‘look and feel’ hebben zoals vroeger.

Op dit moment zijn we nog steeds in de testfase van visualisatieprogramma’s. We maken momenteel gebruik van het programma Openwayback, maar gaan misschien overschakelen naar Solrwayback. Andere mogelijkheden zijn onder meer Pywb, Webrecorder en Replayweb.page

Toegankelijk maken van datasets (vb. Twarc)

Zie alvast de opmerkingen bij het onderdeel gebruiksvoorwaarden in verband met het toegankelijk maken van Twitter-datasets. Dit onderdeel wordt nog verder uitgewerkt.

Registratie en metadata

Internationale normen

In 2018 zijn er richtlijnen verschenen van de OCLC voor het beschrijven van het gearchiveerde web. Het ‘gearchiveerde web’ is een ruim begrip, maar in de praktijk zijn dit richtlijnen voor het beschrijven van websites. De woorden ‘sociale media’ komen bijvoorbeeld maar vier keer voor in het 54-pagina’s lange document. Deze OCLC richtlijnen zijn in theorie geldig voor zowel bibliotheken en archieven, maar sommige van de metadata-elementen lijken toch meer gericht op bibliotheken. Er wordt ook te weinig aandacht besteed aan technische metadata. Dit is op zich begrijpbaar, het zijn nu eenmaal richtlijnen voor ‘descriptive metadata’, maar er is nu 2 jaar later nog steeds geen aanzet gekomen tot richtlijnen voor de technische metadata.

We gaan gebruik maken van de mapping naar ISAD(G). Voor de verantwoording van deze keuze zie https://www.projectcest.be/wiki/Publicatie:Project:_Catching_the_digital_heritage

Hoe beschrijven?

In de OPAC beperken we ons tot een beschrijving op het URL-niveau per harvest. Hiermee geven we een inhoudelijk overzicht van de archiefvormers waarvan-, en gebeurtenissen waarover we sociale media hebben gearchiveerd. Afhankelijk van de gebruikte archiveringssoftware beschikken we wel over nadere toegangen. Bij Youtube beschikken we bijvoorbeeld over een lijst met alle gearchiveerde video’s. Deze nadere toegangen zijn zeer belangrijk voor onderzoekers, maar zijn niet altijd even gemakkelijk om op automatische wijze op te stellen. Meer info hierover volgt bij het onderdeel toegankelijk maken van datasets.