def fetch_detail(sid): index_query = {'mo': 'senadores', 'ac': 'periodos'} index = requests.get(urljoin(BASE, '{}{}'.format( PATH, helpers.query_parser(index_query)))) index_soup = BeautifulSoup(index.text, 'html.parser') detail_query = {'mo': 'senadores', 'ac': 'fichasenador', 'id': sid} detail = requests.get(urljoin(BASE, '{}{}'.format( PATH, helpers.query_parser(detail_query)))) detail_soup = BeautifulSoup(detail.text, 'html.parser') datos = detail_soup.find(class_='datos').find_all('strong') valid_strong = ['Partido:', 'Teléfono:', 'Mail:', 'Currículum'] datos = list( filter(lambda dato: dato.text in valid_strong or dato.find('a'), datos)) search_param = re.compile('id={}'.format(sid)) nombre_completo = index_soup.find('a', href=search_param).text partido = datos[0].next_sibling.strip() telefono = helpers.process_phone_number(datos[1].next_sibling.strip()) email = datos[2].next_sibling.strip() curriculum_uri = '{}{}'.format(BASE, datos[3].find('a')['href']) foto_uri = urljoin(BASE, detail_soup.find( 'img', class_='foto_imag')['src']) return { 'id': sid, 'partido_politico': partido, 'email': email, 'telefono': telefono, 'url_curriculum': curriculum_uri, 'url_foto': foto_uri, **helpers.parse_name(nombre_completo) }
def fetch_new_comisiones(): query = { 'mo': 'tramitacion', 'ac': 'comisiones', } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') data = [] rows = soup.find_all('tr')[1:-1] for row in rows: _id, camara, tipo, nombre, _ = row.find_all('td') if 'diputados' in camara.text.lower() or 'mixta' in tipo.text.lower(): continue nombre = nombre.text[3:] if 'de ' == nombre.text[:3] else nombre.text data.append({ 'id': int(_id.text), 'tipo': tipo.text.lower(), 'nombre': nombre }) return data
def fetch_resumen(proyecto): query = { 'mo': 'tramitacion', 'ac': 'datos_proy', 'nboletin': proyecto['boletin'] } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') id_criteria = re.compile('proyid\\s*=\\s*(.*?);') proyecto['id'] = int( id_criteria.findall(soup.find_all('script')[0].string)[0]) info_table = soup.find_all('table')[1] proyecto['resumen'] = re.sub( ' +', ' ', info_table.find_all('tr')[0].find_all('td')[1].text.replace( '\n', '').strip()) proyecto[ 'url'] = 'http://www.senado.cl/appsenado/templates/tramitacion/index.php?boletin_ini={}'.format( proyecto['boletin'])
def fetch_periodos(ids): index_query = {'mo': 'senadores', 'ac': 'periodos'} index = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(index_query)))) index_soup = BeautifulSoup(index.text, 'html.parser') database_data = [] cargos = {'S': 'senador', 'D': 'diputado'} for _id in ids: helpers.logger('\tsid={}'.format(_id)) search_param = re.compile('id={}'.format(_id)) row = index_soup.find('a', href=search_param).find_parent('tr') periodos = row.find_all('td')[1].text.strip().split(', ') for periodo in periodos: cargo, intervalo = periodo.split(': ') cargo = cargos[cargo] inicio, final = intervalo.split('-') database_data.append({ 'sid': _id, 'cargo': cargo, 'inicio': int(inicio), 'final': int(final), }) return database_data
def fetch_last_legislation(): query = { 'mo': 'sesionessala', 'ac': 'asistenciaSenadores', 'camara': 'S', 'legiid': 490, } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') legislations = [] for option in soup.find('select').find_all('option'): lid = int(option['value']) pattern = re.compile(r'^(.*) \((.*) - (.*)\)$') number, fecha_i, fecha_t = re.search(pattern, option.text).groups() legislations.append({ 'lid': int(lid), 'number': int(number), 'fecha_i': fecha_i, 'fecha_t': fecha_t }) return max(legislations, key=lambda legislation: legislation['number'])
def fetch_table_actuales(): query = { 'mo': 'senadores', 'ac': 'listado' } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) return BeautifulSoup(main.text, 'html.parser').find(class_='clase_tabla')
def fetch_new_asistencias(): to_fetch = fetch_last_legislation() fecha_inicio = datetime.strptime(to_fetch['fecha_i'], "%d/%m/%Y").strftime('%Y-%d-%m') fecha_fin = datetime.strptime(to_fetch['fecha_t'], "%d/%m/%Y").strftime('%Y-%d-%m') query = { 'mo': 'sesionessala', 'ac': 'asistenciaSenadores', 'camara': 'S', 'legiid': to_fetch['lid'], } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') seccion = soup.find(class_=['seccion2', 'sans']) table = seccion.find('table', class_='clase_tabla') total_sesiones = int(seccion.find('h2').text.split(':')[1]) asistencias_ = [] pointer = table.find('tr') pointer = pointer.find_next_sibling() while pointer: pattern = re.compile(r'.*parlid=(.*)&.*') sid = int(re.search(pattern, pointer.find('a')['href']).group(1)) _, asistencias, inasistencias_just = pointer.find_all('td') asistencias = int(asistencias.text.strip()) if inasistencias_just.text.strip() != '': inasistencias_just = int(inasistencias_just.text.strip()) else: inasistencias_just = 0 inasistencias_no_just = total_sesiones - inasistencias_just - asistencias if inasistencias_no_just < 0: inasistencias_no_just = 0 asistencias_.append({ 'lid': to_fetch['lid'], 'sid': sid, 'asistencias': asistencias, 'inasistencias_just': inasistencias_just, 'inasistencias_no_just': inasistencias_no_just, 'fecha_inicio': fecha_inicio, 'fecha_fin': fecha_fin, }) pointer = pointer.find_next_sibling().find_next_sibling() return asistencias_
def fetch_integrantes(cid): query = {'mo': 'comisiones', 'ac': 'ficha', 'id': cid, 'tipo_comision': 10} main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') detalle = soup.find( class_=['col1', 'integrantes', 'shadow-down', 'center']) integrantes_data = [] integrantes = detalle.find_all('article') for integrante in integrantes: parl_img_url = integrante.find('img')['src'].split('?')[1] query = helpers.query_parser(parl_img_url) integrantes_data.append({ 'cid': cid, 'sid': int(query['fid']), }) return integrantes_data
def fetch_proyectos_in_comision(cid): query = {'mo': 'tramitacion', 'ac': 'boletin_x_fecha', 'comiid': cid} main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') boletines = [] radicados, _, informados, _ = soup.find_all('table') for row in radicados.find_all('tr')[1:]: _, boletin, _, _, _, _ = row.find_all('td') boletines.append(boletin.text) for row in informados.find_all('tr')[1:]: _, boletin, _, _, _, _ = row.find_all('td') boletines.append(boletin.text) return set(boletines)
def fetch_autores(pid): query = {'mo': 'tramitacion', 'ac': 'autores', 'proyid': pid} main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') info_table = soup.find('table') autores = [] for row in info_table.find_all('tr')[1:]: info = row.find_all('td') sid = info[0].text.strip() cargo = info[2].text.strip() if cargo != 'S': continue autores.append({'pid': pid, 'sid': int(sid)}) return autores
def fetch_detail(comision): query = { 'mo': 'comisiones', 'ac': 'ficha', 'id': comision['id'], 'tipo_comision': 10 } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') detalle = soup.find( class_=['col1', 'integrantes', 'shadow-down', 'center']) detalle = detalle.find_next_sibling().find_all('tr')[-2:] email = detalle[0].find_all('td')[1].text.strip() telefono = detalle[1].find_all('td')[1].text.strip() comision['email'] = email if email != '' else None comision['telefono'] = helpers.process_phone_number(telefono)
def fetch_new_proyectos(custom_last_date): today = datetime.now().date() yesterday = (datetime.now() - timedelta(days=1)).date() query = { 'mo': 'tramitacion', 'ac': 'avanzada_resultado', 'cadena': '0~S~1~0~{}~{}~~~0~0~~~~'.format( yesterday.strftime('%d/%m/%Y') if custom_last_date is None else custom_last_date, today.strftime('%d/%m/%Y'), ) } main = requests.get( urljoin(BASE, '{}{}'.format(PATH, helpers.query_parser(query)))) soup = BeautifulSoup(main.text, 'html.parser') data = [] rows = soup.find_all('tr')[1:-1] if (len(rows) == 0): return data for proyecto in rows: info = proyecto.find_all('td') date = info[0].text.strip() boletin = info[1].text.strip() estado_raw = info[3].text.strip() data.append({ 'fecha': datetime.strptime(date, '%d/%m/%Y'), 'boletin': boletin, 'estado': helpers.parse_estado(estado_raw) }) return data