Code en vrac
Extraction de données: discours politiques
Voici un script (qui fonctionne avec Python 3) qui permet d'extraire tous les discours des candidats aux présidentielles de 2007 et 2012. Ces discours sont stockés sur un serveur du "monde.fr" (minkfluence) et en libre accès.
Les données récupérées sont écrites dans des fichiers pour réutilisation. J'avais en effet écrit ce script pour passer les discours à la moulinette de TXM, logiciel utilisé en analyse quantitative textuelle.
Je le partage ici juste pour l'exemple, des fois que cela puisse inspirer quelqu'un...
# -*- coding:utf8 -*-
import urllib.request
from bs4 import BeautifulSoup
import re
import os
# exemples d'urls où sont stockés les discours
# http://linkfluence.com/projects/discours/2007/Bayrou-2007-04-25.html
# http://linkfluence.com/projects/discours/2012/Bayrou-2012-04-16.html
# On liste donc les deux urls racines qui nous intéressent
urls = ['http://linkfluence.com/projects/discours/2007/',
'http://linkfluence.com/projects/discours/2012/']
# on liste les candidats
candidats = {
'2007': ["Buffet", "Besancenot", "Schivardi", "Bayrou", "Bove", "Voynet",
"Villiers", "Royal", "Nihous", "LePen", "Laguiller", "Sarkozy"],
'2012': ["Joly", "LePen", "Sarkozy", "Melenchon", "Poutou",
"Arthaud", "Cheminade", "Bayrou", "Dupont", "Hollande"]
}
fin = '.html' # pour la concaténation "candidat" + "date" + ".html"
# booleen utilisé pour effacer quelques "<" qui résistent à beautifulSoup
sentinelle = False
l = 0
# on boucle sur les urls
for url in urls:
annee = url.split('/')
annee = annee[5]
print("Traitement de l'année " + annee)
for i in range(1,6): # les discours ont eu lieu entre janvier et juin
mois = '-' + '0' + str(i) + '-'
for j in range(1,32): # on itère au hasard sur chaque jour du mois
if i == 5:
if j > 6: break # après le 6 mai des deux années, plus de discours!
if i == 1 and j < 20: break # et aucun avant le 20 janvier...
# on cherche s'il existe une page pour chaque candidat
for candidat in candidats[annee]:
if j < 10:
jour = '0' + str(j)
site = url + candidat + '-' + annee + mois + jour
else: site = url + candidat + '-' + annee + mois + jour
try:
html = urllib.request.urlopen(site+fin).read() # une page existe-t-elle
except:
try:
# on gère ici quelques exceptions quand les candidats ont au moins deux discours par jour
for index in ('a', 'b', 'c', 'd'):
html = urllib.request.urlopen(site + index + fin).read()
except: continue # aucune page trouvée, on continue la boucle
print('Extraction réussie ########## ' + str(l) + ' ######### ' + candidat + '_' + annee + '_' + mois + '_' + jour + ' ###############')
l += 1
fichier = 'campagne' + annee + '/'
# on crée le fichier où stocker le discours
if not os.path.exists(fichier):
os.makedirs(fichier)
af = open(fichier + candidat + '_' + annee + '_' + mois + '_' + jour + '.txt', 'w')
soup = BeautifulSoup(html) # on traite le html avec Beautiful Soup
dateLieu = soup.find('h2').string
af.write(dateLieu + '\n')
texts = soup.find('p') # on récupère chaque paragraphe du discours
# on écrit dans le fichier, caractère par caractère pour retirer
#les dernières balises HTML
#qui subsistent malgré l'utilisation de BeautifulSoup
for t in str(texts):
if t == '<':
sentinelle = True
continue
if sentinelle and t == '>':
sentinelle = False
continue
if not sentinelle: af.write(t) # on écrit dans le fichier
af.close()
print(l)