Created
November 1, 2012 23:40
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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