Congreso de los Diputados

scrapers.es_congreso - Extracción de datos de la web del Congreso de los Diputados

Módulo que contiene clases y funciones para extraer y tratar texto de las páginas web del Congreso de los Diputados

Todo

docstring incompleto

Dependencias

  • Módulo BeautifulSoup
  • Módulo datetime
  • Módulo re
  • Módulo urllib2

Todo

Revisar dependencias

Uso:

Todo

Revisar uso

Iniciativas a seguir

Las iniciativas a seguir son las siguientes:

  • Proyectos de Ley
  • Proposiciones de Ley

Agentes

Deben definirse los agentes del sistema en varios niveles de catalogación:

  • Individual
  • Organización administrativa de la cámara.
  • Organización política de la cámara.
  • Organización de trabajo legislativo.
build_metadata_soup(soup)

Función que filtra los datos de las páginas de índices de proyectos y proposiciones de ley

extract_url(lista_metadata)

Extrae los urls de una lista de webs.

Uso:

>>> extract_url(homepage)
get_grupos_iniciativas(url='http://www.congreso.es/portal/page/portal/Congreso/Congreso/Iniciativas/Indice%20de%20Iniciativas')
get_iniciativa(url)
get_iniciativas_por_grupo(url)
get_soup(url)

Descarga una página web y crea una instancia de la clase soup.

Uso:

>>> homepage = get_soup('http://derecho-internet.org')

Devuelve una instancia de la clase soup.

URL_DIPUTADOS

http://www.congreso.es/public_oficiales/L9/CONG/DS/PL/

# -*- coding: utf-8 -*-
"""
=========================================================================================
:mod:`scrapers.es_congreso` - Extracción de datos de la web del Congreso de los Diputados
=========================================================================================

Módulo que contiene clases y funciones para extraer y tratar texto de
las páginas web del Congreso de los Diputados

.. todo::

   docstring incompleto

Dependencias
------------

* Módulo BeautifulSoup
* Módulo datetime
* Módulo re
* Módulo urllib2

.. todo::

   Revisar dependencias

Uso:
----

.. todo::

   Revisar uso

Iniciativas a seguir
--------------------

Las iniciativas a seguir son las siguientes:

- Proyectos de Ley
- Proposiciones de Ley

.. todo

   Revisar las iniciativas a seguir

Agentes
-------

Deben definirse los agentes del sistema en varios niveles de
catalogación:

- Individual
- Organización administrativa de la cámara.
- Organización política de la cámara.
- Organización de trabajo legislativo.

"""

__author__ = 'Javier de la Cueva'
__copyright__ = 'Javier de la Cueva'
__license__ = "GNU AGPLv3"
__url__ = 'http://derecho-internet/proyectos/kelsen'
__version__ = '$Revision: 321 $'


import urllib2
import re
from datetime import datetime
from BeautifulSoup import BeautifulSoup

# Cadenas para construir urls

URL_BASE_CONGRESO = 'http://www.congreso.es/'
URL_MEDIA_CONGRESO = 'portal/page/portal/Congreso/Congreso/'
URL_PROYECTOS = URL_BASE_CONGRESO + 'Iniciativas/ProydeLey?_piref73_1335538_73_1335535_1335535.next_page=/wc/servidorCGI&CMD=VERLST&BASE=IWI9&FMT=INITXLBA.fmt&DOCS=1-25&DOCORDER=FIFO&DES1=Proyectos+de+Ley+en+tramitaci%F3n&QUERY=121.cini.+no+@fcie+no+concluido.fase.'
URL_PROPOSICIONES = URL_BASE_CONGRESO + 'Iniciativas/PropLey?_piref73_1335476_73_1335473_1335473.next_page=/wc/servidorCGI&CMD=VERLST&BASE=IWI9&FMT=INITXLBA.fmt&DOCS=1-25&DOCORDER=FIFO&DES1=Proposiciones+de+Ley&QUERY=(proposicion+adj2+ley).tipo.'
URL_TODAS_INICIATIVAS = URL_BASE_CONGRESO + URL_MEDIA_CONGRESO + 'Iniciativas/Indice%20de%20Iniciativas'
URL_DIPUTADOS = URL_BASE_CONGRESO + 'Diputados'


# En la url de cada diputado hay dos parámetros: idDiputado=368 e idLegislatura=9
# TODO función para extraer los datos

## Cadenas para boletines

# Boletín del pleno
'http://www.congreso.es/public_oficiales/L9/CONG/DS/PL/'

# Serie A: Proyectos de ley
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/A/'

# Serie B: Proposiciones de ley
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/B/'

# Serie D: General
'http://www.congreso.es/public_oficiales/L9/CONG/BOCG/D/'

# Funciones auxiliares

def get_soup(url):
    """
    Descarga una página web y crea una instancia de la clase soup.

    Uso:

        >>> homepage = get_soup('http://derecho-internet.org')

    Devuelve una instancia de la clase soup.
    """
    # TODO: Crear excepción si no hay conexión.
    # Si no se utiliza urllib2 y se declara el agente, da excepción
    opener = urllib2.build_opener()
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    sock = opener.open(url)
    soup = BeautifulSoup(sock)
    sock.close()
    return soup

def get_grupos_iniciativas(url=URL_TODAS_INICIATIVAS):
    soup = get_soup(url)
    now = datetime.now()
    elementos = soup.findAll('li')[17:]
    lista = []
    for elemento in elementos:
        diccionario = {}
        diccionario['grupo_iniciativa'] = elemento.a.string
        diccionario['url'] = URL_BASE_CONGRESO + elemento.a.attrs[0][1][1:]
        diccionario['cantidad'] = int(elemento.span.string.strip('()'))
        diccionario['update'] = now
        lista.append(diccionario)
    return lista

def get_iniciativas_por_grupo(url):
    soup = get_soup(url)
    elementos = soup.findAll('p', {'class': 'titulo_iniciativa'})
    lista = []
    for elemento in elementos:
        diccionario = {}
        diccionario['iniciativa'] = elemento.a.string
        diccionario['url'] = URL_BASE_CONGRESO + elemento.a.attrs[0][1][1:]
        lista.append(diccionario)
    return lista

def get_iniciativa(url):
    soup = get_soup(url)
    diccionario = {}
    iniciativa = soup.findAll('p', {'class': 'titulo_iniciativa'})[0].string
    diccionario['iniciativa'] = iniciativa.split('(')[0].strip(')').rstrip()
    diccionario['expediente'] = iniciativa.split('(')[1].strip(')')
    diccionario['url'] = url
    return diccionario


def build_metadata_soup(soup):
    """
    Función que filtra los datos de las páginas de índices de proyectos y proposiciones
    de ley
    """
    lista = []
    resultado_set = soup.findAll('div', {'class': 'resultados_encontrados'})
    for resultado in resultado_set:
        diccionario = {}
        titulo = diccionario[u'titulo'] = resultado.contents[1].findChild().string
        url = diccionario[u'url'] = URL_BASE_CONGRESO + resultado.findAll('a')[0].attrs[0][1][1:]
        lista.append(diccionario)
    return lista

def extract_url(lista_metadata):
    """
    Extrae los urls de una lista de webs.

    Uso:

    >>> extract_url(homepage)

    """
    lista = []
    for item in lista_metadata:
        url = item['url']
        lista.append(url)
    return lista

# TODO: Clase IniciativaParlamentaria
# TODO: Control de Iniciativas por parlamentario
# TODO: Control de Comisiones

## To be continued ...

Contenidos

Tema anterior

Minería de datos

Próximo tema

Senado

Esta página