package Ġcom . st ef an br atan ov . sof ias uper mark ets api . extract ors Ċ Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . common . Log Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . common . Log . Companion . log Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . common . get Html Document Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . common . normalize Price Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . interfaces . Url Products Extractor Ċ import Ġcom . st ef an br atan ov . sof ias uper mark ets api . model . Product Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . apache . commons . validator . rout ines . Url Validator Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . net . URL Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ @ Log Ċ @ Component (" L idl ") Ċ class ĠL idl Products Extractor ( ĊĠĠĠ Ġprivate Ġval Ġurl Validator : ĠUrl Validator Ġ= ĠUrl Validator () Ċ ) Ġ: ĠUrl Products Extractor Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġextract ( url : ĠURL ): ĠList < Product > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Processing ĠL idl ĠURL : Ġ{}", Ġurl . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= Ġget Html Document ( url ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= Ġdocument . select (" meta [ name = description ]") ?. attr (" content ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdocument . select (" div [ data - name ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . select (". price box __ price "). isNull OrEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Range Ġ= Ġit . select First (". ribbon __ text ") ?. text ()?. trim ()?. let Ġ{ Ġdate Span Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\\ d +. \\ d + .". to Regex (). findAll ( date Span ). map Ġ{ Ġdate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġdate . group Values [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocalDate . parse ( match . plus ( LocalDate . now (). year ), ĠDateTime Formatter . of Pattern (" dd . MM . yyyy ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error Ġwhile Ġparsing Ġ$ date ", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . select (". product __ title "). text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Price Ġ= Ġit . select (". price box __ recommended - retail - price ") ?. text Nodes ()?. take If Ġ{ Ġtn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtn . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. first ()?. text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Price Ġ= Ġit . select (". price box __ price ") ?. text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquantity Ġ= Ġit . select (". price box __ basic - quantity ") ?. text () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpic Url Ġ= Ġit . select (". picture "). select (" source [ data - src set ]"). each Attr (" data - src set ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġsrc Set Ġ-> Ġsrc Set . contains ("/ sm /") Ġ} ?. split (",") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġpic Url Ġ-> Ġpic Url . trim () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . first OrNull Ġ{ Ġpic Url Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Validator . isValid ( pic Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Objects . isNull ( pic Url )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpic Url Ġ= Ġit . select (". picture ") ?. select (" img ") ?. attr (" src ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠStringUtils . normalize Space ( name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice Ġ= Ġnormalize Price ( new Price ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Price Ġ= Ġnormalize Price ( old Price ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquantity Ġ= ĠStringUtils . normalize Space ( quantity ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpic Url Ġ= Ġpic Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcategory Ġ= Ġcategory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid From Ġ= Ġdate Range ?. elementAt OrNull ( 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Until Ġ= Ġdate Range ?. elementAt OrNull ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }