package Ġpl . j jp . stat ss c raper . t io be index Ċ Ċ import Ġorg . js oup . J soup Ċ import Ġpl . j jp . stat ss c raper . common . Data Sc raper Ċ import Ġpl . j jp . stat ss c raper . utils . Status Logger Ċ Ċ private Ġconst Ġval ĠURL Ġ= Ġ" https :// www . t io be . com / t io be - index /" Ċ private Ġconst Ġval ĠTABLE _ TOP 2 0 _ ROWS Ġ= Ġ". table " Ċ private Ġconst Ġval ĠLAST _ YEAR _ POSITION _ TD Ġ= Ġ" td : nth - child ( 2 )" Ċ private Ġconst Ġval ĠCURRENT _ YEAR _ POSITION _ TD Ġ= Ġ" td : nth - child ( 1 )" Ċ private Ġconst Ġval ĠLANGUAGE _ TD Ġ= Ġ" td : nth - child ( 5 )" Ċ private Ġconst Ġval ĠRE MAIN ING _ LANGUAGE _ TD Ġ= Ġ" td : nth - child ( 2 )" Ċ Ċ object ĠT io be Index Data Sc raper Ġ: ĠData Sc raper Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" T io be Index " ĊĠĠĠ Ġval Ġdata Ġ= ĠHashMap < String , ĠT io be Index Data >() ĊĊĠĠĠ Ġoverride Ġfun Ġscrap Data ( languages : ĠList < String >): ĠHashMap < String , ĠT io be Index Data > Ġ{ ĊĠĠĠĠĠĠĠ ĠStatus Logger . log Collect ing (" T io be Ġindex Ġdata ") ĊĊĠĠĠĠĠĠĠ Ġvar Ġlanguage Ġ= Ġ" NONE " ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup . connect ( URL ). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop 2 0 Ġ= Ġdoc . select ( TABLE _ TOP 2 0 _ ROWS )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Top Ġ= Ġdoc . select ( TABLE _ TOP 2 0 _ ROWS )[ 1 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpossible Rows Ġ= Ġtop 2 0 . select (" tr ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Rows . addAll ( remaining Top . select (" tr ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpossible Rows . forEach Indexed Ġ{ Ġindex , Ġrow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Ġ= Ġrow . select ( LANGUAGE _ TD ). text (). replace ("# ", Ġ" sharp ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 2 0 ) Ġlanguage Ġ= Ġrow . select ( RE MAIN ING _ LANGUAGE _ TD ). text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( languages . contains ( language )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Year Position Ġ= ĠInteger . parseInt ( row . select ( CURRENT _ YEAR _ POSITION _ TD ). text ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Year Position : ĠString Ġ= Ġif Ġ( index Ġ> Ġ 2 0 ) Ġ" N / A " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠInteger . parseInt ( row . select ( LAST _ YEAR _ POSITION _ TD ). text ()). toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Data Ġ= ĠT io be Index Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ= Ġcurrent Year Position . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Year Position Ġ= Ġlast Year Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT io be Index Data Validator . validate ( language , Ġlanguage Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ language ] Ġ= Ġlanguage Data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatus Logger . log Exception ( language , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} Ċ } Ċ