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_index(wp=17): for i in count(33): url = URL % (wp, i) response = fetch(url) if response.status_code != 200: if i > 180: return continue yield url
def scrape_index(): for wp in app.config.get('WAHLPERIODEN'): for i in count(1): url = URL % (wp, i) if find_local(url) is None: response = fetch(url) if response.status_code != 200: if i > 180: return continue yield url
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_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