def scrape_transcript(engine, url, force=False): wp, session = url_metadata(url) table = sl.get_table(engine, 'speech') sample = sl.find_one(engine, table, source_url=url, matched=True) response, sio = fetch_stream(url) sample = check_tags(sample or {}, response, force) base_data = {'source_url': url, 'sitzung': session, 'wahlperiode': wp, 'matched': False, 'loaded': False, 'source_etag': sample['source_etag']} log.info("Loading transcript: %s/%s, from %s" , wp, session, url) seq = 0 parser = SpeechParser(sio) for contrib in parser: if not len(contrib['text'].strip()): continue contrib.update(base_data) contrib['sequence'] = seq sl.upsert(engine, table, contrib, unique=['source_url', 'sequence']) seq += 1 if not parser.missing_recon: sl.upsert(engine, table, { 'matched': True, 'source_url': url, }, unique=['source_url']) else: raise InvalidReference() return base_data
def scrape_transcript(engine, url, force=False): wp, session = url_metadata(url) table = sl.get_table(engine, 'speech') sio = find_local(url) sample = {'source_etag': 'local'} if sio is None: sample = sl.find_one(engine, table, source_url=url, matched=True) response, sio = fetch_stream(url) sample = check_tags(sample or {}, response, force) base_data = {'source_url': url, 'sitzung': session, 'wahlperiode': wp, 'matched': False, 'loaded': False, 'source_etag': sample['source_etag']} log.info("Loading transcript: %s/%s, from %s" , wp, session, url) seq = 0 parser = SpeechParser(sio) for contrib in parser: if not len(contrib['text'].strip()): continue contrib.update(base_data) contrib['sequence'] = seq sl.upsert(engine, table, contrib, unique=['source_url', 'sequence']) seq += 1 if not parser.missing_recon: sl.upsert(engine, table, { 'matched': True, 'source_url': url, }, unique=['source_url']) else: raise InvalidReference() return base_data
def scrape_abstimmung(engine, url, force=False): abstimmung = sl.get_table(engine, 'abstimmung') sample = sl.find_one(engine, abstimmung, source_url=url) response = fetch(url) sample = check_tags(sample or {}, response, force) base_data = {'source_url': url, 'source_etag': sample['source_etag']} handle_xml(engine, base_data, response.content) return base_data
def scrape_gremium(engine, url, force=False): table = sl.get_table(engine, 'gremium') response, doc = _xml(url) a = sl.find_one(engine, table, source_url=url) if a is None: a = {'source_url': url} a = check_tags(a, response, force) a['key'] = doc.findtext('/ausschussId') a['name'] = doc.findtext('/ausschussName') log.info("Ausschuss (%s): %s" % (a['key'], a['name'])) a['aufgabe'] = doc.findtext('/ausschussAufgabe') a['image_url'] = doc.findtext('/ausschussBildURL') a['image_copyright'] = doc.findtext('/ausschussCopyright') a['rss_url'] = GREMIUM_RSS_FEEDS.get(a['key']) a['url'] = URL_PATTERN % a['key'] a['type'] = 'ausschuss' sl.upsert(engine, table, a, unique=['key']) return a
def scrape_ablauf(engine, url, force=False): Ablauf = sl.get_table(engine, 'ablauf') key = int(url.rsplit('/', 1)[-1].split('.')[0]) a = sl.find_one(engine, Ablauf, source_url=url) if a is not None and a['abgeschlossen'] and not force: raise Unmodified() response = fetch(url) a = check_tags(a or {}, response, force) a.update({'key': key, 'source_url': url}) doc = inline_xml_from_page(response.content, url) if doc is None: raise NoContentException() a['wahlperiode'] = int(doc.findtext("WAHLPERIODE")) a['typ'] = doc.findtext("VORGANGSTYP") a['titel'] = doc.findtext("TITEL") if not a['titel'] or not len(a['titel'].strip()): raise NoContentException() if '\n' in a['titel']: t, k = a['titel'].rsplit('\n', 1) k = k.strip() if k.startswith('KOM') or k.startswith('SEK'): a['titel'] = t a['initiative'] = doc.findtext("INITIATIVE") a['stand'] = doc.findtext("AKTUELLER_STAND") a['signatur'] = doc.findtext("SIGNATUR") a['gesta_id'] = doc.findtext("GESTA_ORDNUNGSNUMMER") a['eu_dok_nr'] = doc.findtext("EU_DOK_NR") a['abstrakt'] = doc.findtext("ABSTRAKT") a['sachgebiet'] = doc.findtext("SACHGEBIET") a['zustimmungsbeduerftig'] = doc.findtext("ZUSTIMMUNGSBEDUERFTIGKEIT") #a.schlagworte = [] Schlagwort = sl.get_table(engine, 'schlagwort') for sw in doc.findall("SCHLAGWORT"): wort = {'wort': sw.text, 'source_url': url} sl.upsert(engine, Schlagwort, wort, unique=wort.keys()) log.info("Ablauf %s: %s", url, a['titel'].encode('ascii', 'replace')) a['titel'] = a['titel'].strip().lstrip('.').strip() a = expand_dok_nr(a) a['abgeschlossen'] = DIP_ABLAUF_STATES_FINISHED.get(a['stand'], False) if 'Originaltext der Frage(n):' in a['abstrakt']: _, a['abstrakt'] = a['abstrakt'].split('Originaltext der Frage(n):', 1) Referenz = sl.get_table(engine, 'referenz') for elem in doc.findall("WICHTIGE_DRUCKSACHE"): link = elem.findtext("DRS_LINK") hash = None if link is not None and '#' in link: link, hash = link.rsplit('#', 1) dokument = dokument_by_id(elem.findtext("DRS_HERAUSGEBER"), 'drs', elem.findtext("DRS_NUMMER"), link=link) dokument['text'] = elem.findtext("DRS_TYP") dokument['seiten'] = hash dokument['source_url'] = url sl.upsert(engine, Referenz, dokument, unique=[ 'link', 'source_url', 'seiten' ]) for elem in doc.findall("PLENUM"): link = elem.findtext("PLPR_LINK") if link is not None and '#' in link: link, hash = link.rsplit('#', 1) dokument = dokument_by_id(elem.findtext("PLPR_HERAUSGEBER"), 'plpr', elem.findtext("PLPR_NUMMER"), link=link) dokument['text'] = elem.findtext("PLPR_KLARTEXT") dokument['seiten'] = elem.findtext("PLPR_SEITEN") dokument['source_url'] = url sl.upsert(engine, Referenz, dokument, unique=[ 'link', 'source_url', 'seiten' ]) sl.upsert(engine, Ablauf, a, unique=['source_url']) for elem in doc.findall(".//VORGANGSPOSITION"): scrape_activity(engine, url, elem) return a
def scrape_mdb(engine, url, force=False): response, doc = _xml(url) id = int(doc.findtext('//mdbID')) table_person = sl.get_table(engine, 'person') table_rolle = sl.get_table(engine, 'rolle') p = sl.find_one(engine, table_person, mdb_id=id) if p is None: p = {'source_url': url} else: r_ = sl.find_one(engine, table_rolle, mdb_id=id, funktion='MdB') if r_ is not None: r = r_ p = check_tags(p, response, force) r = {'person_source_url': url, 'funktion': 'MdB'} r['mdb_id'] = p['mdb_id'] = id r['status'] = doc.find('//mdbID').get('status') if doc.findtext('//mdbAustrittsdatum'): r['austritt'] = datetime.strptime(doc.findtext('//mdbAustrittsdatum'), '%d.%m.%Y').isoformat() p['vorname'] = doc.findtext('//mdbVorname') p['nachname'] = doc.findtext('//mdbZuname') p['adelstitel'] = doc.findtext('//mdbAdelstitel') p['titel'] = doc.findtext('//mdbAkademischerTitel') p['ort'] = doc.findtext('//mdbOrtszusatz') message = 'MdB: %s %s (%s)' % (p['vorname'], p['nachname'], p['ort']) log.info(message.encode('ascii', 'replace')) p['geburtsdatum'] = doc.findtext('//mdbGeburtsdatum') p['religion'] = doc.findtext('//mdbReligionKonfession') p['hochschule'] = doc.findtext('//mdbHochschulbildung') p['beruf'] = doc.findtext('//mdbBeruf') p['berufsfeld'] = doc.find('//mdbBeruf').get('berufsfeld') p['geschlecht'] = doc.findtext('//mdbGeschlecht') p['familienstand'] = doc.findtext('//mdbFamilienstand') p['kinder'] = doc.findtext('//mdbAnzahlKinder') r['fraktion'] = doc.findtext('//mdbFraktion') p['fraktion'] = doc.findtext('//mdbFraktion') p['partei'] = doc.findtext('//mdbPartei') p['land'] = doc.findtext('//mdbLand') r['gewaehlt'] = doc.findtext('//mdbGewaehlt') p['bio_url'] = doc.findtext('//mdbBioURL') p['bio'] = doc.findtext('//mdbBiografischeInformationen') p['wissenswertes'] = doc.findtext('//mdbWissenswertes') p['homepage_url'] = doc.findtext('//mdbHomepageURL') p['telefon'] = doc.findtext('//mdbTelefon') p['angaben'] = doc.findtext('//mdbVeroeffentlichungspflichtigeAngaben') p['foto_url'] = doc.findtext('//mdbFotoURL') p['foto_copyright'] = doc.findtext('//mdbFotoCopyright') p['reden_plenum_url'] = doc.findtext('//mdbRedenVorPlenumURL') p['reden_plenum_rss_url'] = doc.findtext('//mdbRedenVorPlenumRSS') p['wk_nummer'] = doc.findtext('//mdbWahlkreisNummer') p['wk_name'] = doc.findtext('//mdbWahlkreisName') p['wk_url'] = doc.findtext('//mdbWahlkreisURL') for website in doc.findall('//mdbSonstigeWebsite'): type_ = website.findtext('mdbSonstigeWebsiteTitel') ws_url = website.findtext('mdbSonstigeWebsiteURL') if type_.lower() == 'twitter': p['twitter_url'] = ws_url if type_.lower() == 'facebook': p['facebook_url'] = ws_url if doc.findtext('//mdbBundestagspraesident'): sl.upsert(engine, table_rolle, { 'person_source_url': url, 'funktion': u'Bundestagspräsident', }, unique=['person_source_url', 'funktion']) if doc.findtext('//mdbBundestagsvizepraesident'): sl.upsert(engine, table_rolle, { 'person_source_url': url, 'funktion': u'Bundestagsvizepräsident', }, unique=['person_source_url', 'funktion']) for n in doc.findall('//mdbObleuteGremium'): add_to_gremium(n, url, 'obleute', engine) for n in doc.findall('//mdbVorsitzGremium'): add_to_gremium(n, url, 'vorsitz', engine) for n in doc.findall('//mdbStellvertretenderVorsitzGremium'): add_to_gremium(n, url, 'stellv_vorsitz', engine) for n in doc.findall('//mdbVorsitzSonstigesGremium'): add_to_gremium(n, url, 'vorsitz', engine) for n in doc.findall('//mdbStellvVorsitzSonstigesGremium'): add_to_gremium(n, url, 'stellv_vorsitz', engine) for n in doc.findall('//mdbOrdentlichesMitgliedGremium'): add_to_gremium(n, url, 'mitglied', engine) for n in doc.findall('//mdbStellvertretendesMitgliedGremium'): add_to_gremium(n, url, 'stellv_mitglied', engine) for n in doc.findall('//mdbOrdentlichesMitgliedSonstigesGremium'): add_to_gremium(n, url, 'mitglied', engine) for n in doc.findall('//mdbStellvertretendesMitgliedSonstigesGremium'): add_to_gremium(n, url, 'stellv_mitglied', engine) sl.upsert(engine, table_person, p, unique=['source_url']) sl.upsert(engine, table_rolle, r, unique=['person_source_url', 'funktion']) return p
def scrape_ablauf(engine, url, force=False): Ablauf = sl.get_table(engine, 'ablauf') key = int(url.rsplit('/', 1)[-1].split('.')[0]) a = sl.find_one(engine, Ablauf, source_url=url) if a is not None and a['abgeschlossen'] and not force: raise Unmodified() response = fetch(url) a = check_tags(a or {}, response, force) a.update({'key': key, 'source_url': url}) doc = inline_xml_from_page(response.content, url) if doc is None: raise NoContentException() a['wahlperiode'] = int(doc.findtext("WAHLPERIODE")) a['typ'] = doc.findtext("VORGANGSTYP") a['titel'] = doc.findtext("TITEL") if not a['titel'] or not len(a['titel'].strip()): raise NoContentException() if '\n' in a['titel']: t, k = a['titel'].rsplit('\n', 1) k = k.strip() if k.startswith('KOM') or k.startswith('SEK'): a['titel'] = t a['initiative'] = doc.findtext("INITIATIVE") a['stand'] = doc.findtext("AKTUELLER_STAND") a['signatur'] = doc.findtext("SIGNATUR") a['gesta_id'] = doc.findtext("GESTA_ORDNUNGSNUMMER") a['eu_dok_nr'] = doc.findtext("EU_DOK_NR") a['abstrakt'] = doc.findtext("ABSTRAKT") a['sachgebiet'] = doc.findtext("SACHGEBIET") a['zustimmungsbeduerftig'] = doc.findtext("ZUSTIMMUNGSBEDUERFTIGKEIT") #a.schlagworte = [] Schlagwort = sl.get_table(engine, 'schlagwort') for sw in doc.findall("SCHLAGWORT"): wort = {'wort': sw.text, 'source_url': url} sl.upsert(engine, Schlagwort, wort, unique=wort.keys()) log.info("Ablauf %s: %s", url, a['titel'].encode('ascii', 'replace')) a['titel'] = a['titel'].strip().lstrip('.').strip() a = expand_dok_nr(a) a['abgeschlossen'] = DIP_ABLAUF_STATES_FINISHED.get(a['stand'], False) if a['wahlperiode'] != max(app.config.get('WAHLPERIODEN')): a['abgeschlossen'] = True if 'Originaltext der Frage(n):' in a['abstrakt']: _, a['abstrakt'] = a['abstrakt'].split('Originaltext der Frage(n):', 1) sl.delete(engine, sl.get_table(engine, 'position'), source_url=url) sl.delete(engine, sl.get_table(engine, 'beitrag'), source_url=url) sl.delete(engine, sl.get_table(engine, 'zuweisung'), source_url=url) sl.delete(engine, sl.get_table(engine, 'beschluss'), source_url=url) sl.delete(engine, sl.get_table(engine, 'referenz'), source_url=url) for elem in doc.findall(".//VORGANGSPOSITION"): scrape_activity(engine, url, elem) Referenz = sl.get_table(engine, 'referenz') for elem in doc.findall("WICHTIGE_DRUCKSACHE"): link = elem.findtext("DRS_LINK") hash = None if link is not None and '#' in link: link, hash = link.rsplit('#', 1) dokument = dokument_by_id(elem.findtext("DRS_HERAUSGEBER"), 'drs', elem.findtext("DRS_NUMMER"), link=link) dokument['text'] = elem.findtext("DRS_TYP") dokument['seiten'] = hash dokument['source_url'] = url sl.upsert(engine, Referenz, dokument, unique=['link', 'source_url', 'seiten']) for elem in doc.findall("PLENUM"): link = elem.findtext("PLPR_LINK") if link is not None and '#' in link: link, hash = link.rsplit('#', 1) dokument = dokument_by_id(elem.findtext("PLPR_HERAUSGEBER"), 'plpr', elem.findtext("PLPR_NUMMER"), link=link) dokument['text'] = elem.findtext("PLPR_KLARTEXT") dokument['seiten'] = elem.findtext("PLPR_SEITEN") dokument['source_url'] = url sl.upsert(engine, Referenz, dokument, unique=['link', 'source_url', 'seiten']) sl.upsert(engine, Ablauf, a, unique=['source_url']) return a
def scrape_mdb(engine, url, force=False): response, doc = _xml(url) id = int(doc.findtext("//mdbID")) table_person = sl.get_table(engine, "person") table_rolle = sl.get_table(engine, "rolle") p = sl.find_one(engine, table_person, mdb_id=id) if p is None: p = {"source_url": url} else: r_ = sl.find_one(engine, table_rolle, mdb_id=id, funktion="MdB") if r_ is not None: r = r_ p = check_tags(p, response, force) r = {"person_source_url": url, "funktion": "MdB"} r["mdb_id"] = p["mdb_id"] = id r["status"] = doc.find("//mdbID").get("status") if doc.findtext("//mdbAustrittsdatum"): r["austritt"] = datetime.strptime(doc.findtext("//mdbAustrittsdatum"), "%d.%m.%Y").isoformat() p["vorname"] = doc.findtext("//mdbVorname") p["nachname"] = doc.findtext("//mdbZuname") p["adelstitel"] = doc.findtext("//mdbAdelstitel") p["titel"] = doc.findtext("//mdbAkademischerTitel") p["ort"] = doc.findtext("//mdbOrtszusatz") message = "MdB: %s %s (%s)" % (p["vorname"], p["nachname"], p["ort"]) log.info(message.encode("ascii", "replace")) p["geburtsdatum"] = doc.findtext("//mdbGeburtsdatum") p["religion"] = doc.findtext("//mdbReligionKonfession") p["hochschule"] = doc.findtext("//mdbHochschulbildung") p["beruf"] = doc.findtext("//mdbBeruf") p["berufsfeld"] = doc.find("//mdbBeruf").get("berufsfeld") p["geschlecht"] = doc.findtext("//mdbGeschlecht") p["familienstand"] = doc.findtext("//mdbFamilienstand") p["kinder"] = doc.findtext("//mdbAnzahlKinder") r["fraktion"] = doc.findtext("//mdbFraktion") p["fraktion"] = doc.findtext("//mdbFraktion") p["partei"] = doc.findtext("//mdbPartei") p["land"] = doc.findtext("//mdbLand") r["gewaehlt"] = doc.findtext("//mdbGewaehlt") p["bio_url"] = doc.findtext("//mdbBioURL") p["bio"] = doc.findtext("//mdbBiografischeInformationen") p["wissenswertes"] = doc.findtext("//mdbWissenswertes") p["homepage_url"] = doc.findtext("//mdbHomepageURL") p["telefon"] = doc.findtext("//mdbTelefon") p["angaben"] = doc.findtext("//mdbVeroeffentlichungspflichtigeAngaben") p["foto_url"] = doc.findtext("//mdbFotoURL") p["foto_copyright"] = doc.findtext("//mdbFotoCopyright") p["reden_plenum_url"] = doc.findtext("//mdbRedenVorPlenumURL") p["reden_plenum_rss_url"] = doc.findtext("//mdbRedenVorPlenumRSS") p["wk_nummer"] = doc.findtext("//mdbWahlkreisNummer") p["wk_name"] = doc.findtext("//mdbWahlkreisName") p["wk_url"] = doc.findtext("//mdbWahlkreisURL") for website in doc.findall("//mdbSonstigeWebsite"): type_ = website.findtext("mdbSonstigeWebsiteTitel") ws_url = website.findtext("mdbSonstigeWebsiteURL") if type_.lower() == "twitter": p["twitter_url"] = ws_url if type_.lower() == "facebook": p["facebook_url"] = ws_url if doc.findtext("//mdbBundestagspraesident"): sl.upsert( engine, table_rolle, {"person_source_url": url, "funktion": u"Bundestagspräsident"}, unique=["person_source_url", "funktion"], ) if doc.findtext("//mdbBundestagsvizepraesident"): sl.upsert( engine, table_rolle, {"person_source_url": url, "funktion": u"Bundestagsvizepräsident"}, unique=["person_source_url", "funktion"], ) for n in doc.findall("//mdbObleuteGremium"): add_to_gremium(n, url, "obleute", engine) for n in doc.findall("//mdbVorsitzGremium"): add_to_gremium(n, url, "vorsitz", engine) for n in doc.findall("//mdbStellvertretenderVorsitzGremium"): add_to_gremium(n, url, "stellv_vorsitz", engine) for n in doc.findall("//mdbVorsitzSonstigesGremium"): add_to_gremium(n, url, "vorsitz", engine) for n in doc.findall("//mdbStellvVorsitzSonstigesGremium"): add_to_gremium(n, url, "stellv_vorsitz", engine) for n in doc.findall("//mdbOrdentlichesMitgliedGremium"): add_to_gremium(n, url, "mitglied", engine) for n in doc.findall("//mdbStellvertretendesMitgliedGremium"): add_to_gremium(n, url, "stellv_mitglied", engine) for n in doc.findall("//mdbOrdentlichesMitgliedSonstigesGremium"): add_to_gremium(n, url, "mitglied", engine) for n in doc.findall("//mdbStellvertretendesMitgliedSonstigesGremium"): add_to_gremium(n, url, "stellv_mitglied", engine) sl.upsert(engine, table_person, p, unique=["source_url"]) sl.upsert(engine, table_rolle, r, unique=["person_source_url", "funktion"]) return p