Skip to content

Instantly share code, notes, and snippets.

@jdelacueva
Created November 1, 2012 23:40
Show Gist options
  • Save jdelacueva/3997575 to your computer and use it in GitHub Desktop.
Save jdelacueva/3997575 to your computer and use it in GitHub Desktop.
Script para la obtención de las URLs de las referencias del Consejo de Ministros del Gobierno central
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Copyright: Javier de la Cueva
Licencia: Affero GPL V3
Script para generar un archivo csv con las URLs de las páginas web
con las referencias de los Consejos de Ministros habidas hasta la
fecha de ejecución del script. Util como punto de partida para
*scraping* del contenido de las referencias.
Uso:
----
Ejecute en una línea de comandos:
$ python consejo_ministros.py
Encontrará el archivo generado mediante dicha orden en el mismo
directorio que el script.
"""
import csv
import urllib2
from datetime import datetime
from lxml.html import parse
URL = "http://www.lamoncloa.gob.es"
URL_BASE_MES = "http://www.lamoncloa.gob.es/ConsejodeMinistros/Referencias/index.htm?mts="
OUTFILE = "url_consejos_de_ministros.csv" # nombre del archivo csv generado
# La web de La Moncloa incluye las referencias de cada Consejo de
# Ministros agrupadas por meses. Los pasos serán (1) construir las
# URLs de los meses y (2) de cada mes extraer las URLs de los Consejos
# habidos. Los datos se inician en octubre de 1996, lo que se ha
# verificado manualmente en fecha 2012-11-01.
#
# Funciones
# ---------
#
# Hay 5 funciones:
#
# 1. get_tree(url)
#
# Descarga una página web y genera su árbol.
#
# 2. make_urls_mes(years, months)
#
# Construye una lista de las urls de los meses desde el primer
# Consejo de Ministros cuya referencia consta en la web (octubre de
# 1996) y el mes de la fecha en que se ejecute la función.
#
# 3. get_urls_mes(url)
#
# De cada página web correspondiente a cada mes en el que ha habido
# un Consejo de Ministros, extrae las URLs que corresponden a los
# Consejos habidos en ese mes.
#
# 4. urls_consejos_ministros(urls)
#
# Crea la lista de urls de los Consejos de Ministros con los datos
# extraidos por la función `get_urls_mes(url)`.
#
# 5. crear_csv(urls, outfile)
#
# Crea un archivo de valores separados por comas con un sólo valor,
# que es la url obtenida mediante la función
# `urls_consejos_ministros(urls)`. Toma como parámetros la lista de
# urls y el nombre del archivo que se genera.
#
# A partir de la lista de URLs de cada Consejo de Ministros, happy
# scraping.
def get_tree(url):
"""Genera el árbol de una página web
Uso::
>>> homepage = get_tree('http://www.congreso.es')
"""
# TODO: Crear excepción si no hay conexión.
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
sock = opener.open(url)
tree = parse(sock).getroot()
sock.close()
return tree
now = datetime.now()
first_month= "199610"
last_month = str(now.year) + str(now.month)
years = range(1996, now.year+1)
months = range(1, 13)
def make_urls_mes(years, months):
"""Crea una lista de URLs de meses desde el inicio hasta el mes
actual"""
lista_urls = list()
for y in years:
for m in months:
url = str(y) + str("%02d" % m)
if url >= first_month and url <= last_month:
lista_urls.append(URL_BASE_MES + url)
return lista_urls
def get_urls_mes(url):
"""Extrae de la página web de un mes las URLs de los consejos de
ministros habidos en el mismo"""
lista_urls = list()
tree = get_tree(url)
consejos = tree.xpath("//*[@class='intervencionesSumarioTitulo']//a")
for item in consejos:
lista_urls.append(URL + item.get('href'))
return lista_urls
def urls_consejos_ministros(urls):
"Crea una lista de urls de los Consejos de Ministros"
lista_urls = list()
for item in urls:
consejos = get_urls_mes(item)
lista_urls.extend(consejos)
return lista_urls
def crear_csv(urls, outfile):
"Crea un archivo csv con las URLs del Consejo de Ministros"
out = csv.writer(open(outfile,"w"), delimiter=',', quoting=csv.QUOTE_ALL)
cabeceras = ['url']
out.writerow(cabeceras)
for item in urls:
row = [item]
print row # Para debug, también útil para ver la marcha del script
out.writerow(row)
if __name__ == '__main__':
urls = make_urls_mes(years, months)
urls_consejos = urls_consejos_ministros(urls)
crear_csv(urls_consejos, OUTFILE)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment