diff --git a/.gitignore b/.gitignore index cc1df7b..86aaf67 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ node_modules/ scraper/debug/ scraper/x.tsv *.tmp -target/ \ No newline at end of file +target/ +.env +.env* \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index a9198d7..4a0270d 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/data/samples/Carrefour.txt b/data/samples/Carrefour.txt new file mode 100644 index 0000000..97e863a --- /dev/null +++ b/data/samples/Carrefour.txt @@ -0,0 +1,50 @@ +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-frutilla-sachet-900-cc-734210/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-frutilla-brick-200-cc-734218/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-vainilla-brick-200-cc-734215/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-vainilla-sachet-900-cc-734204/p +https://www.carrefour.com.ar/leche-protein-c-chocolate-la-serenisima-bot-larga-vida-1-l/p +https://www.carrefour.com.ar/leche-chocolatada-cindor-50-mas-cacao-1-lt-721741/p +https://www.carrefour.com.ar/leche-chocolatada-cindor-mocca-1-lt-724419/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-sense-caramel-1-l/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-ultra-0-grasa-vainilla-900-cc/p +https://www.carrefour.com.ar/leche-chocolatada-la-serenisima-clasico-1-lt-728990/p +https://www.carrefour.com.ar/leche-fermentada-kids-mix-de-frutas-actimel-100-g-724919/p +https://www.carrefour.com.ar/milkshake_sabor_frutilla_nesquik_brick_x_190_cc_707121/p +https://www.carrefour.com.ar/bebida-a-base-de-almendras-cindor-sabor-chocolate-1-lt-721995/p +https://www.carrefour.com.ar/leche-chocolatada-la-serenisima-clasico-200-ml-728991/p +https://www.carrefour.com.ar/leche-chocolatada-cindor-50-mas-cacao-200-ml-721740/p +https://www.carrefour.com.ar/milkshake_sabor_banana_nesquik_brick_x_190_cc_707120/p +https://www.carrefour.com.ar/leche-cindor-chocolatada-a-base-de-almendras-y-cacao%E2%80%8B-1-l-704526/p +https://www.carrefour.com.ar/leche-chocolatada-chochoco-tetra-200-cc-726412/p +https://www.carrefour.com.ar/chocolatada-en-polvo-dicomere-leche-de-coco-vegana-150-g-710587/p +https://www.carrefour.com.ar/bebida-lactea-bananita-dolca-185-cc-731527/p +https://www.carrefour.com.ar/leche-de-almendras-silk-endulzada-tetra-1-lt-726379/p +https://www.carrefour.com.ar/leche-de-almendras-silk-de-coco-tetra-1-lt-726380/p +https://www.carrefour.com.ar/alimento-vegetal-silk-fermentado-a-base-de-coco-%E2%80%8B300-g-702734/p +https://www.carrefour.com.ar/la-serenisima-100---vegetal-chocolate-con-mani-1-lt-726421/p +https://www.carrefour.com.ar/bebida-a-base-de-coco-silk-sin-azucar-1-l%E2%80%8B-698743/p +https://www.carrefour.com.ar/leche-chocolatada-cindor-1-lt-719377/p +https://www.carrefour.com.ar/nesquik-extra-cacao-chocolatada-listo-para-tomar-200-ml-724442/p +https://www.carrefour.com.ar/leche-chocolatada-nesquik-fortificado-200-cc-724441/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-uat-0-grasa-frutilla-1000-cc/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-uat-vainilla-1000-cc/p +https://www.carrefour.com.ar/leche-fermentada-actimel-sabor-frutilla-100-cc-724916/p +https://www.carrefour.com.ar/leche-fermentada-plus-guarana-y-frutos-rojos-actimel-100-g-726736/p +https://www.carrefour.com.ar/leche-fermentada-multifruta-actimel-100-g-724917/p +https://www.carrefour.com.ar/bebida-lactea-la-serenisima-uat-0-grasa-vainilla-1000-cc/p +https://www.carrefour.com.ar/leche-chocotalada-uat-cindor-tetra-200-cc-719376/p +https://www.carrefour.com.ar/alimento-bebible-vegetal-la-serenisima-sabor-coco-1-lt-719131/p +https://www.carrefour.com.ar/leche-en-polvo-la-serenisima-zero-lactosa-400-g-677890/p +https://www.carrefour.com.ar/leche-en-polvo-la-lechera-entera-400-g-721596/p +https://www.carrefour.com.ar/leche-en-polvo-la-lechera-entera-800-g-721597/p +https://www.carrefour.com.ar/bebida-a-base-de-proteinas-lacteas-molico-bolsa-800-g-684792/p +https://www.carrefour.com.ar/golden-milk-dicomere-leche-en-polvo-de-coco-vegano-150-g-710588/p +https://www.carrefour.com.ar/leche-en-polvo-descremada-svelty-370-g-729420/p +https://www.carrefour.com.ar/leche-en-polvo-nido-fortigrow-800-g-725006/p +https://www.carrefour.com.ar/leche-en-polvo-descremada-molico-bolsa-800-g-684793/p +https://www.carrefour.com.ar/leche-en-polvo-sancor-bebe-3-advanced-800-g-706144/p +https://www.carrefour.com.ar/leche-en-polvo-entera-franz-con-vitamina-a-y-d-800-g-707100/p +https://www.carrefour.com.ar/leche-de-almendras-silk-sin-azucar-tetra-1-lt-726378/p +https://www.carrefour.com.ar/alimento-veg-beb-la-serenisima-almendra-s-azucar-1000-cc/p +https://www.carrefour.com.ar/alimento-bebible-a-base-de-almendras-la-serenisima-1-l/p +https://www.carrefour.com.ar/leche-de-almendras-silk-de-coco-sin-azucar-tetra-1-lt-726381/p diff --git a/data/samples/Coto.txt b/data/samples/Coto.txt new file mode 100644 index 0000000..d59ff8a --- /dev/null +++ b/data/samples/Coto.txt @@ -0,0 +1,250 @@ +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-%0D%0Atraje-de-bano-hombre-rayado-talle-46%0D%0A/_/A-00560152-00560152-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-101-cuentos-cortos-para-compartir/_/A-00509350-00509350-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-101-cuentos-de-magia-y-aventuras/_/A-00509349-00509349-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-128-luces-led-x100-multicolor-3aa---/_/A-00542386-00542386-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-144-luces-led-x100-blancas-3aa---/_/A-00542385-00542385-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-1era-infancia-autobus-intera-mickey-mouse---/_/A-00560856-00560856-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-1era-infancia-cubo-prono-granja---/_/A-00566723-00566723-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-1era-infancia-plush-sleeping-peluche-mickey---/_/A-00560857-00560857-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-1era-infancia-plush-sleeping-peluche-minnie---/_/A-00560858-00560858-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-243-luces-led-x-30-blancas-3aa---/_/A-00542388-00542388-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-24-banditas-elasticas-redondas-sin-metal-basicare/_/A-00515946-00515946-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-de-enmascarar-18mm-x-40m---caja-precortada/_/A-00456793-00456793-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-de-enmascarar-24mm-x-40m---caja-precortada/_/A-00456790-00456790-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-de-enmascarar-36mm-x-40m---caja-precortada/_/A-00456810-00456810-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-de-enmascarar-48mm-x-40m---caja-precortada/_/A-00456811-00456811-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-ducto-2910-gris-48mmx91m-%0D%0A/_/A-00478343-00478343-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-3m-cinta-ducto-3920-negra-48mmx18m%0D%0A/_/A-00478344-00478344-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-400-luces-microled-x100blancas3aa---/_/A-00542391-00542391-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-440-luces-microled-x30-blanca-3aa---/_/A-00542387-00542387-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-480-luces-microled-x50-blancas-3a/_/A-00542390-00542390-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-4-en-linea-mini-ruibal/_/A-00112199-00112199-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-840-luces-led-x-50-blancas-3aa---/_/A-00542389-00542389-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-8-hermanos-azul-anis-botella-de-1-litro/_/A-00002315-00002315-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-abadejo-entero-eviscerado-congelado-x-kg/_/A-00017794-00017794-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-abrelata-mariposa-loekemeyer-bli-1-uni/_/A-00005012-00005012-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-abrel-loerem-ua-1-un/_/A-00006716-00006716-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-abrochadora-maped-office-1-unidad-n-10/_/A-00286817-00286817-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-accesorio-stick-masaje-drb-turquesa-gris/_/A-00524517-00524517-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-2t-para-motos-1ltr-bardahl%0D%0A/_/A-00198031-00198031-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-2t-para-motos-200cc-bardahl/_/A-00198032-00198032-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-aerosol-mazola-maiz-rocio-vegetal-aer-120-grm/_/A-00267185-00267185-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-antiadherente-manteca-mazola-aer-120-grm/_/A-00267186-00267186-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-bronceador-fps-4-hawaiian-tropic-240ml/_/A-00467670-00467670-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-virgen-cormillot-bot-250-ml/_/A-00512147-00512147-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-virgen-coto-botella-500-ml/_/A-00218338-00218338-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-virgen-krol---botella-250-ml/_/A-00172850-00172850-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-virgen-krol---botella-500-ml/_/A-00175047-00175047-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-y-ajo-krol-bot-250-ml/_/A-00500950-00500950-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-y-albahaca-krol-bot-250-ml/_/A-00500949-00500949-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-y-cebolla-krol-bot-250-ml/_/A-00500951-00500951-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-canola-y-limon-krol-bot-250-ml/_/A-00500952-00500952-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-almendras-landa-30-ml/_/A-00559709-00559709-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-argan-landa-30-ml/_/A-00559701-00559701-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-dende-cepera-100-ml/_/A-00547003-00547003-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-jojoba-landa-30ml/_/A-00559707-00559707-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-maiz-arcor-890-ml/_/A-00539092-00539092-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-maiz-clasico-mazola-900ml/_/A-00257043-00257043-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-oliva-extra-virgen-clasico-500ml/_/A-00572174-00572174-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-oliva-extra-virgen-clasico-lira-1l/_/A-00572175-00572175-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-oliva-virgen-extra-suave-nucete-500ml/_/A-00296136-00296136-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-ricino-landa-30ml/_/A-00559706-00559706-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-de-rosa-mosqueta-landa-30-ml/_/A-00559708-00559708-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-fritolim-manteca-120-gr-fritolim-aer-12-kgm/_/A-00263388-00263388-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-genecelf-multig-20w50-1l-total%0D%0A/_/A-00298157-00298157-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-genecelf-multig-20w50-4l-total%0D%0A/_/A-00298156-00298156-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-girasol--cada-dia--botella-900-ml/_/A-00003033-00003033-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-girasol-coto-aerosol-120-gr/_/A-00179641-00179641-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-girasol-natura-rocio-vegetal-aerosol-120-gr/_/A-00263797-00263797-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-girasol--pureza---botella-15-l/_/A-00497066-00497066-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-girasol--pureza---botella-900-ml/_/A-00497065-00497065-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-maiz-arcor-botella-900-ml/_/A-00247948-00247948-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-maiz--lira-pet-900-ml/_/A-00510431-00510431-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-mezcla-canola-y-chia-virgen-krol---botella-250-ml/_/A-00282204-00282204-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-mezcla-canola-y-oliva--krol---botella-250-ml/_/A-00230679-00230679-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-mezcla-canola-y-oliva--krol---botella-500-ml/_/A-00230680-00230680-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-mezcla-girasol-y-oliva-natura-500-ml/_/A-00481089-00481089-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-mezcla-girasol-y-oliva-natura-botella-900-ml/_/A-00268144-00268144-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-motor-4t-para-motos-1ltr-bardahl%0D%0A/_/A-00198040-00198040-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-andino-natura-500ml/_/A-00576037-00576037-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-de-cecco-extra-virgen-bot-500-ml/_/A-00172205-00172205-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-clasico-nucete-1000ml/_/A-00562868-00562868-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-cocinero-1l/_/A-00562395-00562395-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-cocinero-250ml/_/A-00562394-00562394-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-cocinero-500ml/_/A-00562393-00562393-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-colavita--750ml/_/A-00562249-00562249-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-con-oliva-la-toscana-bot-250-ml/_/A-00480493-00480493-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-filippo-ber-bot-500-cmq/_/A-00210325-00210325-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-fruttato-filippo-berio-bot-500-ml/_/A-00195703-00195703-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-intenso-cocinero-500ml/_/A-00515792-00515792-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-la-toscana-con-albahaca-botella-250-ml/_/A-00236162-00236162-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-la-toscana-con-limon-botella-250-ml/_/A-00267254-00267254-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-morixe-500ml/_/A-00513717-00513717-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-nucete---lata-500-ml/_/A-00162778-00162778-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-oliovita-500ml/_/A-00025251-00025251-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-oliovita-botella-500-ml/_/A-00184369-00184369-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-oliovita-botella-500-ml/_/A-00194454-00194454-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extra-virgen-suave-cocinero-500ml/_/A-00515794-00515794-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-extvirg-filippo-ber-bot-250-ml/_/A-00195700-00195700-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-fuerte-natura-500ml/_/A-00576036-00576036-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-la-toscana-con-pesto-botella-250-ml/_/A-00468302-00468302-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva--nucete---lata-500-ml/_/A-00021386-00021386-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-suave-natura-500ml/_/A-00576035-00576035-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-cebila-500ml/_/A-00512396-00512396-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-cocinero-1l/_/A-00562397-00562397-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-blend-zuelo-lat-1000-ml/_/A-00521714-00521714-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-ciudad-del-lago--botella-250-ml/_/A-00485927-00485927-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-ciudad-del-lago--botella-500-ml/_/A-00485926-00485926-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-clasico-nucete-2l/_/A-00510405-00510405-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-coratina-zuccardi-250ml/_/A-00570402-00570402-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-c-zuelo-bot-250-ml/_/A-00511022-00511022-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-c-zuelo-bot-500-ml/_/A-00511013-00511013-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-genovesa-zuccardi-250ml/_/A-00570405-00570405-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-genovesa-zuccardi-500ml/_/A-00570407-00570407-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-intenso-nucete-500ml/_/A-00574739-00574739-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-intenso-zuelo-lat-500-ml/_/A-00521713-00521713-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-i-zuelo-bot-500-ml/_/A-00511018-00511018-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-la-toscana-con-ajo-botella-250-ml/_/A-00236161-00236161-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-nucete---botella-500-ml/_/A-00021215-00021215-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita-botella-1-l/_/A-00481562-00481562-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita--botella-250-ml/_/A-00190515-00190515-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita-botella-250-ml/_/A-00206952-00206952-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita---botella-500-ml/_/A-00240899-00240899-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita--botella-500-ml/_/A-00479458-00479458-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita-mediterraneo-botella-500-ml/_/A-00245154-00245154-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-oliovita-mediterraneo-botella-500-ml/_/A-00465346-00465346-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-organica-zuelo-250-ml/_/A-00534644-00534644-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-organico-zuelo-500-ml/_/A-00534645-00534645-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-picual-zuccardi-250ml/_/A-00570406-00570406-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-piscual-zuccardi-500ml/_/A-00570404-00570404-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-suave-la-toscana-250ml/_/A-00570403-00570403-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-suave-la-toscana-500ml/_/A-00570409-00570409-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-extra-s-zuelo-bot-500-ml/_/A-00511014-00511014-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-natura-aerosol-120-gr/_/A-00283953-00283953-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-oliva-virgen-nucete-1l/_/A-00501317-00501317-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-p-moto-4-cruise-15w50-1l-elf%0D%0A/_/A-00460748-00460748-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-p-moto-4-road-15w50-1l-elf%0D%0A/_/A-00205956-00205956-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-protector-fps10-villeneuve-190ml/_/A-00572159-00572159-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-puro-baby-johnsons-100ml/_/A-00568122-00568122-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-quartz-9000-5w40-1l-total%0D%0A/_/A-00242672-00242672-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-rocio-vegetal--canuelas-girasol-aerosol-187-ml/_/A-00484971-00484971-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-rocio-vegetal--nucete-oliva-aerosol-150-ml/_/A-00482859-00482859-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-rocio-vegetal-sabor-manteca-lira-aer-120-grm/_/A-00529622-00529622-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-rocio-vegetal-virgen-extra-canuelas---aerosol-187-ml/_/A-00484970-00484970-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceites-de-dende-palm-cepera-200-cmq/_/A-00134316-00134316-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-total-quartz-5000-15w-40-4-l/_/A-00473185-00473185-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-total-quartz-7000-10w40-1l-total%0D%0A/_/A-00195391-00195391-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-total-quartz-7000-10w-40-4-l/_/A-00195390-00195390-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-total-quartz-9000-5w-40-4-l/_/A-00265946-00265946-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceite-total-quartz-ineo-mc3-5w-30-4-l/_/A-00473195-00473195-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-a-la-italiana-castell-340g/_/A-00573358-00573358-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-a-la-it-castell-fra-340-grm/_/A-00515751-00515751-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-castell-pouch-200-gr/_/A-00086460-00086460-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-castell-pouch-300-gr/_/A-00100351-00100351-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-descarozadas-nucete-360g/_/A-00101924-00101924-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-en-salmuera-nucete-220-grm/_/A-00548385-00548385-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-nucete-------frasco-330-gr/_/A-00101922-00101922-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-premium-castell-340g/_/A-00573359-00573359-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-premium-castell-fra-340-grm/_/A-00515749-00515749-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-vanoli-150-gr/_/A-00263031-00263031-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-vanoli-------frasco-330-gr/_/A-00298223-00298223-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-negras-yovinessa-frasco-330-gr/_/A-00234350-00234350-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-c-atun-stabz-lat-200-grm/_/A-00528745-00528745-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-alcaparras-stabz-lat-200-grm/_/A-00528743-00528743-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-anchoas-stabz-200-grm/_/A-00528744-00528744-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-jalapenos-stabz-lat-200-grm/_/A-00528740-00528740-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-morrones-castell-300gr/_/A-00100352-00100352-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-pasta-de-limon-stabz-200-grm/_/A-00545116-00545116-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-pimientos-stabz-lat-200-grm/_/A-00528739-00528739-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-rellenas-con-salmon-stabz-lat-200-grm/_/A-00528741-00528741-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-a-la-italiana-castell-340g/_/A-00573361-00573361-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-a-la-it-castell-fra-340-grm/_/A-00515750-00515750-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-castell----en-rodajas---pouch-180-gr/_/A-00086457-00086457-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-castell----en-rodajas---pouch-300-gr/_/A-00220073-00220073-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-castell-------pouch-200-gr/_/A-00063853-00063853-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-castell-rellena-morrones-----pouch-200-gr/_/A-00086459-00086459-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-cebila-180g/_/A-00491175-00491175-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-descarozadas-castell-180gr/_/A-00086458-00086458-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-descarozadas-cebila-150-gr/_/A-00491177-00491177-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-descarozadas-nucete-220g/_/A-00548383-00548383-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-descarozadas-nucete-360g/_/A-00101923-00101923-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-en-rodajas-nucete-220-grm/_/A-00548387-00548387-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-en-salmuera-nucete-220g/_/A-00548386-00548386-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-nucete---descarozada----frasco-330-gr/_/A-00072401-00072401-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-nucete---descarozada----sachet-180-gr/_/A-00030099-00030099-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-nucete-------frasco-330-gr/_/A-00072400-00072400-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-nucete-----premium-frasco-360-gr/_/A-00165846-00165846-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-nucete-rellena-morrones---premium-frasco-360-gr/_/A-00104033-00104033-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-para-ensaladas-nucete-220g/_/A-00548382-00548382-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-premium-castell-340g/_/A-00573362-00573362-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-premium-castell-fra-340-grm/_/A-00515753-00515753-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-premium-yovinessa-fra-360-grm/_/A-00515762-00515762-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellena-castell-fra-340-grm/_/A-00515752-00515752-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-cebila-100-gr/_/A-00485900-00485900-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-cebila-180-gr/_/A-00486164-00486164-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-morron-yovinessa-330g/_/A-00209031-00209031-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-pasta-de-ajo-nucete-330-grm/_/A-00548389-00548389-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-pasta-de-cebolla-nucete-330-grm/_/A-00548390-00548390-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-pasta-de-jalapeno-nucete-330-grm/_/A-00548391-00548391-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-pasta-de-morron-nucete-220-grm/_/A-00548384-00548384-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-con-pasta-sabor-limon-nucete-330-grm/_/A-00548381-00548381-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellenas-premium-castell-340g/_/A-00573360-00573360-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-rellena-yovinessa-fra-360-grm/_/A-00515761-00515761-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-300g/_/A-00262716-00262716-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli---descarozada----pouch-150-gr/_/A-00262801-00262801-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-en-rodajas-frasco-330-gr/_/A-00465097-00465097-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-----linea-selecta-frasco-320-gr/_/A-00271683-00271683-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-pouch-150-gr/_/A-00262715-00262715-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-rellena-morrones-descarozada----pouch-300-gr/_/A-00261901-00261901-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-rellenas-330-gr/_/A-00261904-00261904-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-vanoli-tradicional-330-gr/_/A-00261902-00261902-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-descarozada-frasco-330-gr/_/A-00007090-00007090-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-descarozada-frasco-330-gr/_/A-00209034-00209034-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa---descarozada----sachet-150-gr/_/A-00247702-00247702-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa----en-rodajas---sachet-80-gr/_/A-00247700-00247700-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-------frasco-330-gr/_/A-00007088-00007088-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-------pouch-250-gr/_/A-00007106-00007106-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-------pouch-900-gr/_/A-00241661-00241661-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-premium-frasco-330-gr/_/A-00212532-00212532-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-premium-frasco-660-gr/_/A-00209035-00209035-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceitunas-verdes-yovinessa-sachet-130-gr/_/A-00242498-00242498-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceituna-verde-castell-300gr/_/A-00100354-00100354-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceituna-verde-descarozadas-castell-300gr/_/A-00100353-00100353-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceituna-verde-descarozadas-castell-850gr/_/A-00235212-00235212-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceituna-verdes-rellenas-con-morrones-yovinessa-160g/_/A-00007108-00007108-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-congelada-granja-del-sol-500g/_/A-00565168-00565168-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-congelada-lucchetti-450g/_/A-00565184-00565184-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-fresca-santa-maria-bol-300-grm/_/A-00532418-00532418-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-green-life-550g/_/A-00578347-00578347-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-hidroponica-pack-choi-compostela-1u/_/A-00572941-00572941-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-lavada-y-cortada-sueno-verde-x-400-gr/_/A-00186721-00186721-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-rie-la-huerta-500g/_/A-00576905-00576905-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acelga-x-uni/_/A-00040156-00040156-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-a-base-de-crema-antichi-colli-bot-250-ml/_/A-00531990-00531990-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-ahumado-casalta-400-cc/_/A-00210064-00210064-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-clasico-casalta-500ml/_/A-00567777-00567777-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-de-modena-colavita-500ml/_/A-00213419-00213419-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-di-modena-fini-500-ml/_/A-00547011-00547011-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-di-modena-san-giorgio-250-ml/_/A-00546999-00546999-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-enrico-baronese-chardonnay-375-cc/_/A-00119600-00119600-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-enrico-baronese-malbec-375-cc/_/A-00119599-00119599-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-filippo-ber-bot-250-ml/_/A-00196110-00196110-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-la-toscana-250-ml/_/A-00494654-00494654-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-menoyo-250-cc/_/A-00198472-00198472-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-menoyo-500-cc/_/A-00201560-00201560-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-oliovita-250ml/_/A-00569750-00569750-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-reduccion-enrico-baronese-bot-375-cmq/_/A-00532960-00532960-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-reduccion-menoyo-250-ml/_/A-00497571-00497571-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-reduccion-menoyo-250-ml/_/A-00497596-00497596-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-reduccion-oliovita-250ml/_/A-00569739-00569739-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-san-giorgio-bot-250-ml/_/A-00524780-00524780-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-san-giorgio-frutos-de-bosque-andino-250-cc/_/A-00133800-00133800-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-balsamico-tipo-reduccion-casalta-500ml/_/A-00567779-00567779-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-con-humo-liquido-san-giorgio-250-ml/_/A-00546995-00546995-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-glaze-basil-pe-de-nigris-pet-250-ml/_/A-00489739-00489739-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-glaze-fusion-s-de-nigris-pet-250-ml/_/A-00489748-00489748-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-manzana-granny-enrico-baro-bot-375-cmq/_/A-00476420-00476420-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-reduccion-casalta-bot-400-cmq/_/A-00210065-00210065-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-aceto-reduccion-lira-250-ml/_/A-00539903-00539903-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-ackids-proteccion-nat-plusbelle-bot-700-ml/_/A-00512470-00512470-200 +https://www.cotodigital3.com.ar/sitios/cdigi/producto/-acondicionador-aclarante-tio-nacho-400ml/_/A-00572067-00572067-200 diff --git a/data/samples/Dia.txt b/data/samples/Dia.txt new file mode 100644 index 0000000..11820d7 --- /dev/null +++ b/data/samples/Dia.txt @@ -0,0 +1,50 @@ +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-canuelas-15-lts-73552/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-cocinero-900-ml-48605/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-cocinero-alto-oleico-15-lts-267710/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-dia-15-lts-24114/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-dia-900-ml-226068/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-legitimo-900-ml-56453/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-lira-15-lts-264923/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-natura-15-lts-78856/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-pureza-15-lts-265505/p +https://diaonline.supermercadosdia.com.ar/aceite-de-girasol-pureza-900-ml-265504/p +https://diaonline.supermercadosdia.com.ar/aceite-de-maiz-lira-900-ml-270738/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-cocinero-extra-virgen-intenso-500-ml-276153/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-cocinero-extra-virgen-suave-500-ml-276154/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-extra-virgen-cocinero-500-ml-296498/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-extra-virgen-lira-500-ml-299225/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-morixe-extra-virgen-250-ml-289004/p +https://diaonline.supermercadosdia.com.ar/aceite-de-oliva-morixe-virgen-500-ml-276048/p +https://diaonline.supermercadosdia.com.ar/aceite-en-aerosol-dia-120-gr-53460/p +https://diaonline.supermercadosdia.com.ar/aceite-girasol-alsamar-15-lts-272259/p +https://diaonline.supermercadosdia.com.ar/aceite-oliva-nucete-extra-virgen-envase-de-vidrio-500-ml-179862/p +https://diaonline.supermercadosdia.com.ar/aceite-para-hornillos-gardenia-organic-spa-12-ml-269348/p +https://diaonline.supermercadosdia.com.ar/aceite-para-hornillos-jazmin---bambu-organic-spa-12-ml-269347/p +https://diaonline.supermercadosdia.com.ar/aceite-para-hornillos-vainilla-organic-spa-12-ml-269350/p +https://diaonline.supermercadosdia.com.ar/aceite-para-hornillos-verbena-y-fresias-organic-spa-12-ml-269349/p +https://diaonline.supermercadosdia.com.ar/aceitunas-negras-nucete-en-salmuera-190-gr-286869/p +https://diaonline.supermercadosdia.com.ar/aceitunas-verdes-castell-180-gr-295511/p +https://diaonline.supermercadosdia.com.ar/aceitunas-verdes-rellenas-doy-pack-castell-180-gr-56152/p +https://diaonline.supermercadosdia.com.ar/aceituna-verde-castell-descarozada-doypack-70-gr-106457/p +https://diaonline.supermercadosdia.com.ar/aceituna-verde-castell-rellena-doypack-90-gr-27243/p +https://diaonline.supermercadosdia.com.ar/aceituna-verde-descarozada-castell-150-gr-295512/p +https://diaonline.supermercadosdia.com.ar/aceituna-verde-descarozada-castell-80-gr-295513/p +https://diaonline.supermercadosdia.com.ar/aceituna-verde-en-rodajas-castell-150-gr-171781/p +https://diaonline.supermercadosdia.com.ar/aceituna-verdes-en-rodajas-doy-pack-castell-80-gr-295509/p +https://diaonline.supermercadosdia.com.ar/acelga-congelada-granja-del-sol-500-gr-20325/p +https://diaonline.supermercadosdia.com.ar/acondicionadores-echo-doypack-450-cc-271367/p +https://diaonline.supermercadosdia.com.ar/actimel-kids-banana-y-frutilla-100-gr-20811/p +https://diaonline.supermercadosdia.com.ar/aderezo-a-base-de-mostaza-dia-220-gr-125442/p +https://diaonline.supermercadosdia.com.ar/aderezo-balsamico-sueno-verde-200-gr-292384/p +https://diaonline.supermercadosdia.com.ar/aderezo-notmayo-picante-notco-325-gr-272859/p +https://diaonline.supermercadosdia.com.ar/aderezo-pesto-de-albahaca-sueno-verde-170-gr-278591/p +https://diaonline.supermercadosdia.com.ar/aderezo-sueno-verde-coleslaw-200-ml-267282/p +https://diaonline.supermercadosdia.com.ar/adobo-para-pizza-la-parmesana-20-gr-298851/p +https://diaonline.supermercadosdia.com.ar/aerosol-desinfectante-original-lysoform-380-ml-122974/p +https://diaonline.supermercadosdia.com.ar/agua-con-gas-villavicencio-500-ml-298971/p +https://diaonline.supermercadosdia.com.ar/agua-de-mesa-kin-sin-gas-225-lts-238290/p +https://diaonline.supermercadosdia.com.ar/agua-de-mesa-kin-sin-gas-500-ml-118148/p +https://diaonline.supermercadosdia.com.ar/agua-fina-saborizada-h2oh-citrus-225-lts-127615/p +https://diaonline.supermercadosdia.com.ar/agua-mineralizada-sin-tacc-dia-225-lt-295396/p +https://diaonline.supermercadosdia.com.ar/agua-mineral-sierra-de-los-padres-15-lts-215485/p +https://diaonline.supermercadosdia.com.ar/agua-mineral-sin-gas-dia-2-lts-48123/p diff --git a/scraper/auto.ts b/scraper/auto.ts new file mode 100644 index 0000000..f65ce3e --- /dev/null +++ b/scraper/auto.ts @@ -0,0 +1,225 @@ +import "dotenv/config"; +import { mkdtemp, access } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join, resolve } from "node:path"; +import { spawn } from "node:child_process"; +import { Supermercado } from "db-datos/supermercado.js"; +import PQueue from "p-queue"; +import { format, formatDuration, intervalToDuration } from "date-fns"; +import { parseWarc } from "./scrap.js"; +import { S3Client } from "@aws-sdk/client-s3"; +import { Upload } from "@aws-sdk/lib-storage"; +import { BunFile } from "bun"; + +if ( + !process.env.S3_ACCESS_KEY_ID || + !process.env.S3_SECRET_ACCESS_KEY || + !process.env.S3_BUCKET_NAME +) + throw new Error("missing s3 creds"); +if (!process.env.TELEGRAM_BOT_TOKEN) + console.warn("no hay TELEGRAM_BOT_TOKEN, no voy a loggear por allá"); +if (!process.env.TELEGRAM_BOT_CHAT_ID) + console.warn("no hay TELEGRAM_BOT_CHAT_ID, no voy a loggear por allá"); +const { S3_BUCKET_NAME, S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY } = process.env; + +// https://www.backblaze.com/docs/cloud-storage-use-the-aws-sdk-for-javascript-v3-with-backblaze-b2 +const s3 = new S3Client({ + endpoint: "https://s3.us-west-004.backblazeb2.com", + region: "us-west-004", + credentials: { + accessKeyId: S3_ACCESS_KEY_ID, + secretAccessKey: S3_SECRET_ACCESS_KEY, + }, +}); + +const supermercados: Supermercado[] = [ + Supermercado.Carrefour, + Supermercado.Coto, + Supermercado.Dia, +]; + +// hacemos una cola para la compresión para no sobrecargar la CPU +const compressionQueue = new PQueue({ concurrency: 1 }); + +// hacemos una cola para el scrapeo para no tener varios writers a la BD y no sobrecargar la CPU +const scrapQueue = new PQueue({ concurrency: 1 }); + +supermercados.forEach(downloadList); +// await recompress("sqlite.db.gz", "sqlite.db.zst"); + +async function downloadList(supermercado: Supermercado) { + const listPath = resolve( + join(process.env.LISTS_DIR ?? "../data", `${supermercado}.txt`) + ); + const date = new Date(); + const ctxPath = await mkdtemp(join(tmpdir(), "preciazo-scraper-wget-")); + const zstdWarcName = `${supermercado}-${format( + date, + "yyyy-MM-dd-HH:mm" + )}.warc.zst`; + const zstdWarcPath = join(ctxPath, zstdWarcName); + const subproc = Bun.spawn({ + cmd: [ + "wget", + "--no-verbose", + "--tries=3", + "--delete-after", + "--input-file", + listPath, + `--warc-file=temp`, + ], + stderr: "ignore", + stdout: "ignore", + cwd: ctxPath, + }); + const t0 = performance.now(); + await subproc.exited; + inform(`wget para ${zstdWarcName} tardó ${formatMs(performance.now() - t0)}`); + + const gzippedWarcPath = join(ctxPath, "temp.warc.gz"); + if (!(await exists(gzippedWarcPath))) { + const err = report(`no encontré el ${gzippedWarcPath}`); + throw err; + } + + await compressionQueue.add(() => recompress(gzippedWarcPath, zstdWarcPath)); + if (!(await exists(zstdWarcPath))) { + const err = report(`no encontré el ${zstdWarcPath}`); + throw err; + } + + scrapAndInform({ zstdWarcPath, zstdWarcName }); + + try { + await uploadToBucket({ + fileName: zstdWarcName, + file: Bun.file(zstdWarcPath), + }); + } catch (error) { + inform(`Falló subir ${zstdWarcName} a S3; ${error}`); + console.error(error); + } +} + +async function scrapAndInform({ + zstdWarcPath, + zstdWarcName, +}: { + zstdWarcPath: string; + zstdWarcName: string; +}) { + const res = await scrapQueue.add(async () => { + const t0 = performance.now(); + const progress = await parseWarc(zstdWarcPath); + return { took: performance.now() - t0, progress }; + }); + + if (res) { + const { took, progress } = res; + inform( + `Procesado ${zstdWarcName} (${progress.done} ok, ${ + progress.errors.length + } errores) (tardó ${formatMs(took)})` + ); + } else { + inform(`Algo falló en ${zstdWarcName}`); + } +} + +/** + * toma un archivo gzippeado y lo recomprime con zstd. + * borra el archivo original. + */ +function recompress(inputPath: string, outputPath: string) { + // XXX: por alguna razón no funciona en Bun 1.0.20 + // const decompressor = Bun.spawn({ + // cmd: ["gzip", "-dc", inputPath], + // stderr: "inherit", + // }); + // const compressor = Bun.spawn({ + // cmd: ["zstd", "-T0", "-15", "--long", "-o", outputPath], + // stdin: decompressor.stdout, + // // stderr: "inherit", + // }); + // const errorCode = await compressor.exited; + // if (errorCode !== 0) { + // const err = report(`zstd threw error code ${errorCode}`); + // throw err; + // } + + return new Promise((resolve, reject) => { + const decompressor = spawn("gzip", ["-dc", inputPath], { + stdio: [null, "pipe", null], + }); + const compressor = spawn( + "zstd", + ["-T0", "-15", "--long", "-o", outputPath], + { + stdio: ["pipe", null, null], + } + ); + // @ts-expect-error a los types de bun no le gusta???? + decompressor.stdout.pipe(compressor.stdin); + compressor.on("close", (code) => { + if (code !== 0) { + const err = report(`zstd threw error code ${code}`); + reject(err); + } + resolve(void 0); + }); + }); +} + +async function uploadToBucket({ + fileName, + file, +}: { + fileName: string; + file: BunFile; +}) { + const parallelUploads3 = new Upload({ + client: s3, + params: { + Bucket: S3_BUCKET_NAME, + Key: fileName, + Body: file, + }, + }); + await parallelUploads3.done(); +} + +function inform(msg: string) { + sendTelegramMsg(msg); + console.info(msg); +} +function report(msg: string) { + inform(msg); + const error = new Error(msg); + + return error; +} + +async function exists(path: string) { + try { + access(path); + return true; + } catch { + return false; + } +} + +async function sendTelegramMsg(text: string) { + if (!process.env.TELEGRAM_BOT_TOKEN || !process.env.TELEGRAM_BOT_CHAT_ID) + return; + const url = new URL( + `https://api.telegram.org/bot${process.env.TELEGRAM_BOT_TOKEN}/sendMessage` + ); + url.searchParams.set("chat_id", process.env.TELEGRAM_BOT_CHAT_ID); + url.searchParams.set("text", text); + await fetch(url); +} + +function formatMs(ms: number) { + return formatDuration(intervalToDuration({ start: 0, end: Math.round(ms) })); +} diff --git a/scraper/package.json b/scraper/package.json index b37d34f..610b395 100644 --- a/scraper/package.json +++ b/scraper/package.json @@ -11,11 +11,15 @@ "author": "", "license": "ISC", "dependencies": { + "@aws-sdk/client-s3": "^3.478.0", + "@aws-sdk/lib-storage": "^3.478.0", + "date-fns": "^3.0.6", "db-datos": "workspace:^", + "dotenv": "^16.3.1", "drizzle-orm": "^0.29.1", "linkedom": "^0.16.5", "nanoid": "^5.0.4", - "p-map": "^7.0.0", + "p-queue": "^8.0.1", "undici": "^6.2.0", "warcio": "^2.2.1", "zod": "^3.22.4" diff --git a/scraper/scrap.ts b/scraper/scrap.ts index a353354..fe794ab 100644 --- a/scraper/scrap.ts +++ b/scraper/scrap.ts @@ -8,7 +8,6 @@ import { getCarrefourProduct } from "./parsers/carrefour.js"; import { getDiaProduct } from "./parsers/dia.js"; import { getCotoProduct } from "./parsers/coto.js"; import { join } from "path"; -import pMap from "p-map"; import { and, eq, sql } from "drizzle-orm"; const DEBUG = false; @@ -33,10 +32,11 @@ const getPrevPrecio = db .limit(1) .prepare(); -let progress = { done: 0, errors: 0 }; -await pMap(process.argv.slice(2), (path) => parseWarc(path), { - concurrency: 40, -}); +if (process.argv[1].endsWith("/scrap.ts")) { + for (const path of process.argv.slice(2)) { + await parseWarc(path); + } +} export type Precio = typeof schema.precios.$inferInsert; export type Precioish = Omit< @@ -44,12 +44,12 @@ export type Precioish = Omit< "fetchedAt" | "url" | "id" | "warcRecordId" | "parserVersion" >; -async function storePrecioPoint(point: Precio) { - await db.insert(schema.precios).values(point); -} - -async function parseWarc(path: string) { +export async function parseWarc(path: string) { // const warc = createReadStream(path); + let progress: { + done: number; + errors: { error: any; warcRecordId: string; path: string }[]; + } = { done: 0, errors: [] }; const warc = Bun.spawn(["zstd", "-do", "/dev/stdout", path], { stderr: "ignore", @@ -89,13 +89,16 @@ async function parseWarc(path: string) { parserVersion: PARSER_VERSION, }; - if (ish) await storePrecioPoint(p); + await db.insert(schema.precios).values(p); - // console.log(product); progress.done++; } catch (error) { - console.error(error); - progress.errors++; + console.error({ path, warcRecordId, error }); + progress.errors.push({ + path, + warcRecordId, + error, + }); if (DEBUG) { const urlHash = createHash("md5") @@ -105,9 +108,9 @@ async function parseWarc(path: string) { await writeFile(output, html); console.error(`wrote html to ${output}`); } - } finally { - console.debug(`done: ${progress.done}; errored: ${progress.errors}`); } } } + + return progress; }