def run(bot): with bot.pipe('klausimų-puslapiai'): with bot.pipe('dokumentų-sąrašas').select([ '#page-content div.default b xpath:a[text()="dokumento tekstas"]/@href' ]).dedup(): bot.pipe('dokumentų-puslapiai').download() with bot.pipe('susijusių-dokumentų-sąrašas').select([ '#page-content div.default b xpath:a[text()="susiję dokumentai"]/@href' ]).dedup(): bot.pipe('susijusių-dokumentų-puslapiai').download() with bot.pipe('dokumentų-puslapiai'): bot.pipe('metadata').select(row.key, call(dict, ['.basic .ltb', (strip(':text'), strip('b:text?'))])).dedup() with bot.pipe('dokumentų-puslapiai'): bot.pipe('texts').select(row.key, 'body > div:content').dedup() bot.pipe('metadata').export('data/lrs/dokumentai/metadata.csv', include=[ 'key', 'Data:', 'Rūšis:', 'Kalba:', 'Numeris:', 'Statusas:', ]) bot.pipe('texts').export('data/lrs/dokumentai/texts.csv', include=[ 'key', 'value', ]) bot.compact()
def run(bot): start_url = 'http://opendata.gov.lt/index.php?vars=/public/public/search' with bot.pipe('index urls').clean(timedelta(days=1)).append(start_url).dedup(): while bot.pipe('index pages').is_filled(): with bot.pipe('index pages').download(): bot.pipe('index urls').select(['td > a.path@href']).dedup() with bot.pipe('index pages'): bot.pipe('dataset urls').reset().select(['form[name=frm] > table > tr > td[3] > a@href']) with bot.pipe('dataset urls').clean(timedelta(days=7)).dedup(): with bot.pipe('dataset pages').download(): bot.pipe('dataset data').select(row.key, [ 'table xpath:tr[count(td)=2]', ( 'td[1]:content', strip('td[2]:content'), ) ]) with bot.pipe('dataset data').clean(timedelta(days=7)).dedup(): bot.pipe('datasets').call(lambda x: [(x.key, dict(x.value))]) bot.compact() bot.pipe('datasets').export('data/ivpk/opendata-gov-lt/datasets.jsonl')
def run(bot): with bot.pipe('posėdžių-puslapiai'): with bot.pipe('stenogramų-sąrašas').select(['.fakt_pos ul.list > li xpath:a[text()="Stenograma"]/@href']).dedup(): bot.pipe('stenogramų-puslapiai').download() with bot.pipe('stenogramų-puslapiai'): bot.pipe('metadata').select(row.key, call(dict, ['.basic .ltb', (strip(':text'), strip('b:text?'))])).dedup() bot.pipe('metadata').export('data/lrs/stenogramos/metadata.csv', include=[ 'key', 'Data:', 'Rūšis:', 'Kalba:', 'Numeris:', ]) bot.compact()
def run(bot): bot.download_delay = 7 # seconds, vtek.lt denies access if more frequent request are detected start_urls = [ # Seimas (kodas: 188605295) 'http://www.vtek.lt/paieska/id001/paieska.php?dekl_jkodas=188605295&dekl_vardas=&dekl_pavarde=&rasti=Surasti', # Europos parlamentas (kodas: 188648923) 'http://www.vtek.lt/paieska/id001/paieska.php?dekl_jkodas=188648923&dekl_vardas=&dekl_pavarde=&rasti=Surasti', ] # Download all pagination pages, redownload after each 7 days with bot.pipe('sąrašas').clean(timedelta(days=7)).append(start_urls).dedup(): with bot.pipe('puslapiai').download(): with bot.pipe('sąrašas').select(['.panel-body > a@href']).dedup(): with bot.pipe('puslapiai').download(): # We don't want to select page links from each page, they are the same on each page. bot.pipe('sąrašas').skip() # Download declaraton pages and group by full name, since URL's are changing with bot.pipe('puslapiai'): with bot.pipe('seimo nariai').clean(timedelta(days=30)).select(call(select_by_code, [ 'xpath://div[contains(@class,"panel-body") and count(div)=3]', ( 'div[1] > a:text', { # Person's full name 'link': 'div[1] > a@href', # Link to declaration page 'code': strip('div[2]:text'), # Position code in an institution where this person work 'institution': 'div[3]:text', # Link to declaration page } ) ])).dedup(): bot.pipe('seimo narių deklaracijų puslapiai').download( row.value['download'], headers={'Referer': row.value['download']} ) # Extract row data for members of parlament with bot.pipe('seimo narių deklaracijų puslapiai'): bot.pipe('seimo narių deklaracijos').select( nspace(lower('#asmens_duomenys xpath:./tr[contains(td/text(),"DEKLARUOJANTIS ASMUO")]/following-sibling::tr[1]/td/text()')), { # noqa 'vtek link': row.key, 'deklaruojantis asmuo': '#asmens_duomenys xpath:./tr[contains(td/text(),"DEKLARUOJANTIS ASMUO")]/following-sibling::tr[1]/td/text()', # noqa 'darbovietė': '#asmens_duomenys xpath:./tr[contains(td/text(),"DARBOVIETĖ")][1]/following-sibling::tr[1]/td/text()', # noqa 'pareigos': '#asmens_duomenys xpath:./tr[contains(td/text(),"PAREIGOS")][1]/following-sibling::tr[1]/td/text()', # noqa 'sutuoktinis': '#asmens_duomenys xpath:./tr[contains(td/text(),"SUTUOKTINIS, SUGYVENTINIS, PARTNERIS")]/following-sibling::tr[2]/td/text()?', # noqa 'sutuoktinio darbovietė': '#asmens_duomenys xpath:./tr[contains(td/text(),"SUTUOKTINIO, SUGYVENTINIO, PARTNERIO DARBOVIETĖ")]/following-sibling::tr[1]/td/text()?', # noqa 'sutuoktinio pareigos': '#asmens_duomenys xpath:./tr[contains(td/text(),"PAREIGOS")][2]/following-sibling::tr[1]/td/text()?', # noqa 'deklaracijos': [ '#pagrindine_priedai #p_virsus', ( strip('tr[2] > td:text'), [ 'xpath:./../../following-sibling::tr[1]/td/table[@id="priedas"]/tr/td/table/tr', ( first(strip('td[1]:text'), value(None)), # Field name first(strip('td[2]:text?'), value(None)), # Field value ) ] ) ] } ) # Extract all kinds of declarations, export them to csv and upload to the server extract_args = [ ('sandoriai', ('SANDORIAI', 'Sandorį sudaręs asmuo', {('Sandoris', None)})), ('juridiniai', ('RYŠIAI SU JURIDINIAIS ASMENIMIS', 'Asmuo, kurio ryšys nurodomas')), ('fiziniai', ('RYŠIAI SU FIZINIAIS ASMENIMIS', 'Asmuo, kurio ryšys nurodomas')), ('individuali veikla', ('INDIVIDUALI VEIKLA', 'Asmuo, kurio individuali veikla toliau bus nurodoma')), ('kita', ('KITI DUOMENYS, DĖL KURIŲ GALI KILTI INTERESŲ KONFLIKTAS', None)), ] for name, args in extract_args: csvpath = 'data/%s.csv' % name.replace(' ', '-') with bot.pipe('seimo narių deklaracijos'): if bot.pipe(name).is_filled(): bot.pipe(name).clean().reset().call(extract(*args)).export(csvpath) subprocess.call(['scp', csvpath, 'atviriduomenys.lt:/opt/atviriduomenys.lt/app/var/www/data/vtek/seimas']) # noqa bot.compact()