← back to Elitis Price 2026

exec/__pycache__/elitis_feed.cpython-314.pyc

86 lines

+
�Sj�����Rt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RI	t	]PP]4t
]PP]
R4tRtRtRt]PP]R4t]PP]
R4tRtRRltR	tR
t0RmtRtRRlt]R
8Xd,R]P:9d
]!4R#]!4t]!]4R#R#)a�Elitis feed-first scraper (D). $0 - local curl + node-eval of the elitis.fr
__NUXT__ hydration payload. NO Shopify writes, NO Browserbase, NO paid vision.

Pipeline:
  1. sitemap-en.xml -> wall/panoramic/HP-contract collection URLs (~217).
  2. fetch each (polite delay), extract the window.__NUXT__ IIFE blob.
  3. node extract_nuxt.js -> [{name, slug, n, images:[originals]}] per page.
  4. aggregate pattern -> {collection, images} ; write elitis_feed.json.
  5. coverage: accent-normalized match vs our Needs-Image drafts + missing patterns.

Real brand domain is elitis.fr (NOT elitis.com = an IT consultancy).
Images come from backoffice.elitis.fr/media/cache/resolve/original/... (public).Nz..zBMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36z https://elitis.fr/sitemap-en.xmlzelitis_feed.jsonzextract_nuxt.jsc���\P!RT;'gR4pRPRV44pRPVP4P	44#)�NFKD�c3�b"�TF%p\P!V4'dK!Vx�K'	R#5i�N)�unicodedata�	combining)�.0�cs& �@/Users/macstudio3/Projects/elitis-price-2026/exec/elitis_feed.py�	<genexpr>�norm.<locals>.<genexpr>"s���=�1�a�K�$9�$9�!�$<���1�s�/�
/� )r�	normalize�join�casefold�split)�ss&r�normr sL�����f�a�g�g�2�.�A�
���=�1�=�=�A��8�8�A�J�J�L�&�&�(�)�)�c��\PPVR\/R7p\PP	W!R7;_uu_4pVP4P
RR4uuRRR4# +'giR#;i)z
User-Agent)�headers)�timeoutzutf-8�replaceN)�urllib�request�Request�UA�urlopen�read�decode)�urlr�req�rs&&  r�fetchr$&s]��
�.�.�
 �
 ��|�R�.@�
 �
A�C�	���	�	��	�	5�	5���v�v�x���w�	�2�
6�	5�	5�	5�s� A;�;B	c��\\4p\P!RV4pVUu.uF�q"P	R^4^,P	R4^,\
9gK<VP
R4'gKU\VP	R4^,P	R44^8XgK�VNK�	pp\\V44#uupi)z4<loc>(https://elitis\.fr/en/collections/[^<]+)</loc>z
/collections/�/)
r$�SITEMAP�re�findallr�	WALL_CATS�count�len�sorted�set)�xml�urls�u�outs    r�collection_urlsr3,s���
��.�C�
�:�:�M�s�S�D��^�d��g�g�o�q�9�!�<�B�B�3�G��J�i�W�1��w�w��'�
�,/�����0H��0K�0Q�0Q�RU�0V�,W�[\�,\�
�1�d�C�^��#�c�(����^s�9C�)C�2C�9Cc���\P!RV4pV'g.#VPRVP44pWP4VP	4PR4p\P!R\.VRR^<R7p\P!VP4p\T\4'dT#.# \d.u#i;i)zwindow\.__NUXT__\s*=\s*z	</script>�;�nodeT)�input�capture_output�textr)r(�search�find�end�strip�rstrip�
subprocess�run�NUXT_JS�json�loads�stdout�	Exception�
isinstance�list)�html�mr<�blob�p�datas&     r�extract_pagerM4s���
�	�	�,�d�3�A���	�
�)�)�K�����
)�C�������"�"�$�+�+�C�0�D������(��T�PT�^`�a�A���z�z�!�(�(�#���d�D�)�)�4�1�r�1�����	��s� C
�

C�Cc�:�\4p\R\V424/p^p\V4EF[wr4VP	R^4^,p\\
V44pTF�pTPR4;'gRP4p	T	'd.\T	4\U
u0uFp
\T
4kK	up
9dKc\T	4pTPTRT	RTR	./4pTPR	.4F*p
Y�R	,9gKTR	,PT
4K,	K�	T^,^,^8Xd1\R
T^,R\T4R\T4RT24\P !R
4EK^	VP#4UUu/uF5wr�VRVR,RVR,R\VR	,4R	VR	,/bK7	ppp\$P&!V\)\*R4R^R7\R\*R\V4R\-RVP/444RV24V# \d7pT^,
p\RTR\T4R,24Rp?EKYRp?ii;iuup
iuuppi)z$wall/panoramic/HP collection pages: r&z  [err] z: :N�FNN�namer�
collection�imagesz  ...z
 patterns=z errs=g333333�?�n_images�wF)�ensure_ascii�indentz
WROTE z patterns, c3�2"�TF
qR,x�K	R#5i)rSN�)r	�xs& rr�run_scrape.<locals>.<genexpr>ds���5��1�:����s�z image URLs, errs=)r3�printr,�	enumerate�rsplitrMr$rE�str�getr=r�NAV�
setdefault�append�time�sleep�itemsrB�dump�open�FEED_OUT�sum�values)r0�feed�errs�ir1�coll�pats�erK�nmrY�key�slot�img�k�vr2s                 r�
run_scraperwFsO����D�	�0��T���
<�=�
�D��D��$�����x�x��Q���"��	���a��)�D�
�A��%�%��-�%�%�2�,�,�.�B���b��s�%;�s�!�d�1�g�s�%;�;���r�(�C��?�?�3���\�4��SU�(V�W�D��u�u�X�r�*���8�n�,���N�)�)�#�.�+�
�
��E�R�<�1���E�!�A�#��a��D�	�{�*�S��Y�K�v�d�V�L�M��
�
�3��' �,�z�z�|�%�#�t�q�
�v�q��y�,��,���3�q��{�+�X�q��{�D�D�#��%�	�I�I�c�4��#�&�U�1�E�	�H�X�J�b��S��
�+�
�5��
�
��5�
5�6�6H���P�Q��J��-�	��A�I�D��H�T�F�"�S��V�C�[�M�2�3���	��&<��%s$�I�-J
�$;J�J�*J
�
Jc�,�Vf$\P!\\44p\	VP44p\PP\R4p\PP\R4p^RI
p/pVR3VR33F�wrg\PPV4'gK,VP\V44FDpVPR4;'gRp	V	'gK(VP\V	4W�34KF	K�	VP!4U
Uu/uFwr�W�9gK
W�bK	pp
pVP!4U
Uu/uFwr�W�9gK
W�bK	p
p
p\#R\%V4R24\#R	\%V424\#R
\%V
424\#R4\'V
P!44Fwp
wr�\#RV	:R
VR24K	R#uupp
iuupp
i)NzOUT_577_staging_join.csvzOUT_577_no_catalog_data.csv�stagingzno-data�patternrz)
COVERAGE vs list patterns needing data: z	 distinctz  COVERED by feed (>=1 image): z   still missing               : z  -- still-missing patterns --z    z [�])rB�loadrgrhr.�keys�os�pathr�ROOT�csv�exists�
DictReaderr_rarrer[r,r-)rk�	feed_norm�sj�ndcr��wantr�tagr#�patrurv�hit�misss&             r�coverager�hs����|��y�y��h��(���D�I�I�K� �I�	�����d�6�	7�B�
�'�'�,�,�t�:�
;�C��
�D��9�o��Y�'7�8�	���w�w�~�~�d�#�#������T�
�+�A��%�%�	�"�(�(�b�C��s�����S�	�C�:�6�,�9�!�J�J�L�
;�L�D�A�A�N�4�1�4�L�C�
;�!�Z�Z�\�@�\�T�Q�Q�-?�D�A�D�\�D�@�	�6�s�4�y�k��
K�L�	�+�C��H�:�
6�7�	�,�S��Y�K�
8�9�	�
*�+���
�
��-�
��:�C�
��S�G�2�c�U�!�$�%�.��
<��@s�<
H
�H
�'
H�6H�__main__z
--coverage)�walls�	panoramic�high-performance-contract)�>r��fabric�outdoorr��
accessoire�
in-outdoor�high performance contractr�r)�__doc__�sysr~r(rBr?rc�urllib.requestrrr�dirname�__file__�HERErr�rr'r*rhrArr$r3rMr`rwr��__name__�argvrkrXrr�<module>r�s���T��	�	������	�w�w���x� ��	�w�w�|�|�D�$���I��
,��?�	�
�7�7�<�<��0�1��
�'�'�,�,�t�.�
/��*�3��2�A���D&�4�z���s�x�x���
��|�����r