Index ¦ Archives ¦ Atom

Quels sont les articles de wikipedia les plus édités par les parlementaires français ?

21 mai 2020: Ajout de nouvelles IPs et mise à jour du code, migration de l'article vers le nouveau blog

26 décembre 2016: Ajout du code en fin d'article

29 juillet 2014: Ajout de précisions sur les plages ips utilisées: certaines appartiennent à la Présidence de la république, d'après le RIPE NCC (commande whois) et ajout d'une plage d'adresse ip pour le Sénat.


Inspiré par l'article « The Wikipedia Entries Which Are Most-Edited by Members of the U.S. Congress », j'ai eu envie de dresser un classement des pages de Wikipédia en version française les plus éditées anonymement (c'est-à-dire sans compte) par des adresses IP appartenant à l'assemblée nationale et/ou au sénat.

J'ai utilisé plusieurs plages d'adresses ip, plages trouvée sur un moteur de recherche, pour plusieurs centaines d'adresses:

  • De 80.118.139.160 à 80.118.139.191 (Présidence de la République)
  • De 62.160.71.0 à 62.160.71.255 (Présidence de la République)
  • De 37.71.15.112 37.71.127 (Assemblée Nationale)
  • De 37.71.111.192 à 37.71.111.207 (Assemblée Nationale)
  • De 86.64.10.32 à 86.64.10.63 (Assemblée Nationale)
  • De 84.233.174.48 à 84.233.174.63 (Assemblée Nationale)
  • De 109.2.174.128 à 109.2.174.143 (Assemblée Nationale)
  • De 195.68.34.96 à 195.68.34.127 (Assemblée Nationale)
  • De 158.255.107.192 à 158.255.107.255 (Le Sénat)

Il n'est pas garanti que ces ips appartiennent encore aux parlementaires, mais ce sont aussi les plages utilisées par le bot twitter @wikiAssemblee qui relaie en direct les modifications apportées à Wikipedia par ces ips. Il peut aussi s'agir d'éditions effectuées par des assistants, ou n'importe qui utilisant le réseau parlementaire, à relativiser donc.

Grâce à l'API mediawiki (Wikipedia) et à l'aide d'un script maison (globalement moche) écrit en python, on peut donc récupérer toutes les éditions effectuées sans compte depuis ces ips.

Ces données ont ensuite été mise en forme grâce à la bibliothèque d3.js, permettant la création de ce graphique (cliquez pour agrandir):

Texte alternatif

Chaque carré représente une édition pour l'article correspondant, et est coloré en rouge si on a affaire à une suppression de caractères (algébrique), ou en bleu si on a affaire à un ajout de caractères. La teinte reflète la différence en nombre de caractères: plus c'est foncé, plus le nombre de caractères enlevé/ajouté est important.

Par ailleurs, un click sur chaque carré mène à la page récapitulative de l'édition en question, sur wikipedia.

Les résultats semblent cohérents avec ce que l'on pourrait attendre de parlementaires. On compte ~2000 éditions pour ~800 articles différents, dont beaucoup de corrections d'orthographe/de grammaire/de syntaxe.

Les données utilisées sont disponibles au format json dans le format retourné par l'api mediawiki à cette adresse.

Le code utilisé pour générer ce fichier est reproduit ci-après. Même si il est crade, il a le mérite d'exister.

#!/usr/bin/python3
import json
import sys
import requests

user = 'Redacted'
passwd = 'Redacted'
baseurl = 'https://fr.wikipedia.org/w/'

# Présidence de la république
prefix = ['62.160.71.']
prefix += ["80.118.139."+str(i) for i in range(160, 191)]
# Assemblée Nationale
prefix += ["37.71.15."+str(i) for i in range(112, 127)]
prefix += ["37.71.111."+str(i) for i in range(192, 207)]
prefix += ["86.64.10."+str(i) for i in range(32, 63)]
prefix += ["84.233.174."+str(i) for i in range(48, 63)]
prefix += ["109.2.174."+str(i) for i in range(128, 143)]
prefix += ["195.68.34."+str(i) for i in range(96,127)]
# Sénat
prefix += ["158.255.107."+str(i) for i in range(192, 255)]

results = {}
# Add to the hash table
def addedit(ip, title, urlid, size, timestamp, table):
    if title in table:
        token = 0
        for rev in table[title]['rev']:
            if rev['urlid'] == urlid: token = 1
        if token == 0:
            table[title]['count'] += 1
            table[title]['rev'].append({
                'ip': ip,
                'urlid': urlid,
                'size': size,
                'timestamp': timestamp,
                'id': 0
            })
            table[title]['rev'].sort(key = lambda x: x['urlid'])

            for (index, edit) in enumerate(table[title]['rev']):
                edit['id'] = index + 1
    else :
        table[title] = {
            'title': title,
            'count': 1,
            'rev': [{
                'ip': ip,
                'urlid': urlid,
                'size': size,
                'timestamp': timestamp,
                'id': 1
            }]
        }

#Login request
tokenRetrievalParameters = { 'action': 'query', 'meta': 'tokens', 'type': 'login', 'lgname': user, 'format': 'json' }
print('Retrieval of login token…')
tokenRequest = requests.post(baseurl + 'api.php', data=tokenRetrievalParameters)
token = tokenRequest.json()['query']['tokens']['logintoken']
print("Token retrieved: " + token)
print("Login…")
loginParameters = { 'action': 'login', 'lgname': user, 'lgpassword': passwd, 'lgtoken': token, 'format': 'json'}
loginRequest = requests.post(baseurl + 'api.php', data=loginParameters)
print("Logged in. Starting the requests!")

for ips in prefix:
    print("Requesting edits for " + ips)
    editLogParameters = {'action': 'query', 'list': 'usercontribs', 'uclimit': '499', 'format': 'json', 'ucprop': 'sizediff|ids|title|timestamp', 'ucuserprefix': ips}
    editLogRequest = requests.post(baseurl + 'api.php', data=editLogParameters, cookies = loginRequest.cookies)
    print(str(len(editLogRequest.json()['query']['usercontribs'])) + " edits…")
    for edit in editLogRequest.json()['query']['usercontribs']:
        addedit(edit['user'], edit['title'], edit['revid'], edit['sizediff'], edit['timestamp'], results)
    while "continue" in editLogRequest.json():
        editLogParameters['uccontinue'] = editLogRequest.json()['continue']['uccontinue']
        editLogRequest = requests.post(baseurl + 'api.php', data=editLogParameters, cookies = loginRequest.cookies)
        print(str(len(editLogRequest.json()['query']['usercontribs'])) + " edits…")
        for edit in editLogRequest.json()['query']['usercontribs']:
            addedit(edit['user'], edit['title'], edit['revid'], edit['sizediff'], edit['timestamp'], results)

with open('output.json', 'wt') as out:
    values = sorted(results.values(), key = lambda x: x['count'], reverse = True)
    indexed_values = []

    for i, val in enumerate(values):
        for rev in val['rev']:
            rev['parent_index'] = i
        indexed_values.append(val)
    res = json.dumps(indexed_values, indent = 4, separators = (',', ': '))
    out.write(res)
    out.close()

© Rémy Grünblatt 🍃. Built using Pelican. Theme by Giulio Fidente on github.