package Ġcc . m omas . mo spider Ċ Ċ import Ġorg . js oup . J soup Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . boot . Application Arguments Ċ import Ġorg . springframework . boot . Application Runner Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . stream . Collectors Ċ import Ġjava . util . stream . Int Stream ĊĊ Ċ // fun Ġmain ( args : ĠArray < String >) Ġ{ Ċ // ĠĠĠ ĠTest Runner (). run ( null ) Ċ //} Ċ Ċ //@ Component Ċ class ĠTest Runner () Ġ: ĠApplication Runner Ġ{ ĊĠĠĠ Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( TestRunner :: class . java ) ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrepo : ĠSp ider Data Repository ; ĊĊĠĠĠ Ġoverride Ġfun Ġrun ( args : ĠApplication Arguments ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Page Ġ= ĠgetLast Page () ĊĠĠĠĠĠĠĠ Ġlog . info (" last Ġpage Ġ=$ last Page ") ĊĠĠĠĠĠĠĠ Ġval Ġurls Ġ= Ġgenerate Url ( last Page ) ĊĠĠĠĠĠĠĠ Ġlog . info (" ready Ġto Ġfetch ") ĊĠĠĠĠĠĠĠ Ġsubmit To Fetch ( urls ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubmit To Fetch ( urls : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( url Ġin Ġurls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" prepare Ġget Ġurl =$ url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup . connect ( url ). get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" get Ġfrom Ġ$ url Ġdone , Ġdoc =$ doc ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġdoc . select (". post . post - last Ġli ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( element Ġin Ġelements ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Ġurl =$ url , doc =$ element ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhref Ġ= Ġelement . select First (" a ") ?. attr (" href ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( href Ġ== Ġnull Ġ|| Ġhref . startsWith ("/ open . php ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase 6 4 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . select First (" script ") ?. data ()?. replace (" document . write ( d (' ", Ġ"") ?. replace (" ')); ", Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= ĠString ( Base 6 4 . get Decoder (). decode ( base 6 4 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomplete Href Ġ= Ġ" http :// b thy . xyz $ href " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= ĠSp ider Data ( complete Href , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" url ={}, title ={ }", Ġcomplete Href , Ġtitle ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepo . save ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeUnit . SECONDS . sleep ( Random (). nextInt ( 2 0 ). to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgenerate Url ( last Page : ĠInt ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInt Stream . range ( 1 , Ġlast Page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map To Obj () Ġ{ Ġ" http :// b thy . xyz / list . php ? class = gu o chan & page =$ it " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toList ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠgetLast Page (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ" http :// b thy . xyz / list . php ? class = gu o chan " ĊĠĠĠĠĠĠĠ Ġval Ġhtml Ġ= ĠJ soup . connect ( url ). get () Ċ // ĠĠĠĠĠĠĠ ĠJ soup . parse ( page ) ĊĠĠĠĠĠĠĠ Ġval Ġcss Selector Ġ= Ġ"# content Ġul . pagination Ġli : last - child Ġa " ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġhtml . select First ( css Selector ) ĊĠĠĠĠĠĠĠ Ġval Ġhref Ġ= Ġelement ?. attr (" href ") ĊĠĠĠĠĠĠĠ Ġlog . info ( href ) ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġparameter Map ( href )?. get (" page ") ĊĠĠĠĠĠĠĠ Ġreturn ĠInteger . parseInt ( page ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparameter Map ( url : ĠString ?): ĠMap < String , ĠString >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( url Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCollections . empty Map () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmap : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġurl . indexOf (" ?") ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparam Ġ= Ġurl . substring ( index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( param . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġparam . split ("& "). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġparams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkv Ġ= Ġitem . split (" =" ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kv . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kv [ 0 ]. isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kv [ 1 ]. isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkv 1 Index Ġ= Ġkv [ 1 ]. indexOf ("# ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġif Ġ( kv 1 Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkv [ 1 ]. substring ( 0 , Ġkv 1 Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkv [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ kv [ 0 ]] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} Ċ }