initial code
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,166 @@
|
|||||||
|
review_id,rating,date_raw,date_approx
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xNd1EyNXNWRWxYUmpsR2NEZ3hTV3hSTURkT2VtYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT210bE9XcEZUMWRpUXpSWlozZzFVa3BFTVhoc1VHYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21kQ2IzbHphRVZYVm14V1dXTTFNV0Z3TkU0MmVsRRAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pocVF6QTFTalF3UzNoSGJsbHlPVTVxZEVGblJrRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tkb1pteDJaa3BFZGs5ZmNYaDJheTEwUjJwbGIzYxAB,1,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pOdFdGaHBhRVJQWkVOS1JHdEJjbTFVYzBJMVkwRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25OWU1HRlNVR3hYWTFVelRXWnBTM1JrWVdrdFRIYxAB,5,8 miesięcy temu,2025-12-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xsbmJGRmlSWFl5TmpGS2QxTXdObm94VWtWdmJVRRAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xOWGFFVkpiV3hZTW1WdVEzaGpOVEYyYlhVd1VIYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xjNFIwWkNNRnB6Y1RSUU5IZzRNa3hYV25WaFdsRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21acmQwUTVhbk0yZDFkdExYaEdVRjlzYXpkWVdXYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t4RlgzUk1YMUZ3ZDBWd1VYcFNlakpJWVdGd2QwRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t4RlIzZG9WVEJmU1RkWU1VUjJNemxUU3pWWldXYxAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2paaWVHaHRTRkZ2WWpsR1JUTlhjak5NTFhRMGRIYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xkNlJIVTVXRUpJV1VGYWVVNTFOMGRZZWxCcmRtYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21KeVZWY3RZbHBJUmtONGR5MUhiMXBOU0ZOVlpGRRAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21sbWJFRTBUVVJXUm1SbVpsVnFWV1ZtVDBkVFQyYxAB,5,6 miesięcy temu,2026-02-28
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tGNFpqSXpTMHBHWldkeVJHdDBReTFvTUV0a1NGRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21KeVQzZHRjR2xoVGxsdGRsZzJhR2w2V1hCM05VRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xORlNXRk1XbE5ZYkZCWVJXZFBVVWxOVmpFNU1rRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25CSlZYb3liVTgxTTBocFpsTjRTbFF0YUc1WmNtYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21WaGRITnFhVVpEVEd0WVZXSTFWVWMzU1dWdWNYYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21Oa1pGTkJhelYzTUROZmJEUTNaMk5oYzE5NWJIYxAB,5,6 miesięcy temu,2026-02-28
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tNeVJrOTVhSEZqYzNOS1YzaHZZV05sY1ZwdVZGRRAB,1,7 miesięcy temu,2026-01-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT210VFpsODVjWE14YXpodlFXNXNURUo0UjNCalFtYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pWTU1qTklaMGhFVnpoYWVuSnhRbE16Y2s1bk1FRRAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21Zd1ZreDZNRWw1TFhkd1ZHUTRUR1YwT0RWbFlYYxAB,1,10 miesięcy temu,2025-10-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pkNWVVaEdZM3BmUVdGVWFHZFBNMEoyWDBkWE1tYxAB,5,7 miesięcy temu,2026-01-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tWNVFYVmhTSEo2U0VKVWFWbEJNbGxTZDJWRllsRRAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xOWU9IWlhhSFp3TjJ4cVNFTmhjVTlIVDBOR1dGRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21oRkxWWXpObkY2ZGsxNkxUVjBkbUZ4WmpaS2JGRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xoTlIwbDJlbFk0WnpGR1ZtRklhamRLVUZWVlRsRRAB,5,6 miesięcy temu,2026-02-28
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNwOHNubHZRRRAB,5,3 lata temu,2023-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tWU1oyRm5kVkpwVFRkUVozSXhRbFJ3Y3kwNFEwRRAB,5,8 miesięcy temu,2025-12-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xock16QjJaM2RMV1ZneWJtUm9WVUpyUTNkSmEyYxAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pOVGFqRkNTVGxyTW5CalltUmlVM1JHUlRKcFlWRRAB,5,10 miesięcy temu,2025-10-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xGMU5WaE5jblppWlVsdWFuWmhhSFUzY1dGS05XYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2taZlUzTTJTRVJ0V1d4T2NtaDNjMk5rZDJwVFJVRRAB,5,8 miesięcy temu,2025-12-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pKVFpUVkVNVlowYVcweGVuRnlWRzVWUzFkWWNsRRAB,5,10 miesięcy temu,2025-10-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xCamNXcFJRVlZEWW01cmQwOUtORXRrTTJSa1ZWRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xCemFHUlNNakpoYmxJd1luTnRVRWRXU3pkdVJWRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNIbGFHQXRnRRAB,1,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t0VGFHZG5XSHBpWlU5eU9WOTRTRUl0TkdOUmVIYxAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21SUldFcHJlRGxsVEZjd1MzVmlVRVI1YkdwSVVsRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21jMFR6WXhjVEV6ZDJkWlRGOTRlSEJsY2xGMFVuYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21aVlJGWmZXVGx4V1dkdWFqUnFMVGh1YVhKdlIwRRAB,5,3 miesiące temu,2026-05-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21sbVQzWm1jRVZUVUdsTlRGQlBXbnBZTkhoVU1FRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25WQkxUaFFiVjl3VDJGS1YzZFlORXhpZERKaVgyYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2kxMFNXTlFUSGgyWm05c09WRjBhelZCVVhGQloyYxAB,5,rok temu,2025-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnTUNRellLYllnEAE,5,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21OQ05EUjVSakZyYlhWcWRESk1hMFppVlZsa1YwRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2psbFJUZzRRMlpmU0V4a04wNVlNbWhDUzJVM1NGRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUMzbHNpOGZBEAE,5,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2s5eU9FMURWMDVCVFZOSlkwUklRbXRzTW5oeFNXYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25odVgyWldjMjlEVjNKV01WSnViRTlSYldaYWJYYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tJd1pXeHFWemx0Ym5OcVNra3pZbk4zVFVkQmRrRRAB,5,8 miesięcy temu,2025-12-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t4SldHRTNOVVI0VFVsMGEwVkNOWFZXVFhrNFVXYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2toc1NXUkJhemN4VjBnd1JETTBUMlYzV1V0RVJsRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t0b0xVbEVMVUpFYVcxUk5sRXpjMlE0TFZZMFIwRRAB,5,rok temu,2025-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURwNDdQRjhBRRAB,5,3 lata temu,2023-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnTURvbTYzTWxBRRAB,1,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25CR1ZVOW1UM2RxTFdsdFIxZEhSRWhrVTJoMWVGRRAB,5,10 miesięcy temu,2025-10-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUQ5NksyTDZRRRAB,5,2 lata temu,2024-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xRd1ZrTkpRa2RNZG1KQ1dEaFRNME00ZGtsSWQxRRAB,5,7 miesięcy temu,2026-01-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNYcXR5MDBRRRAB,3,rok temu,2025-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNONFp5UTFRRRAB,5,2 lata temu,2024-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21KUlVXOVNSWHBFYldwNlMxSlNTak5hYzNoTmEyYxAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURwNE9fNHhnRRAB,5,3 lata temu,2023-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURUX09yLXJBRRAB,5,2 lata temu,2024-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT205eGNWbExiMWRVTkRWQ2VHSkxTR3cwVEdkd1ozYxAB,5,rok temu,2025-08-31
|
||||||
|
ChdDSUhNMG9nS0VJM0h1c1hlbC1iOC1nRRAB,5,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xJMWEwbHFTa3c1UkZkR1prZG9XRmxUZEhJNFJGRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xCVWNYbFdka1ZQVkZCVVNHYzVXV0p2VFhvNWRrRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUQ2dXFqUm13RRAB,1,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pSdFJuSTVYM1JDWmxaamVWVXhhRVJ0WDFOSmNrRRAB,5,4 miesiące temu,2026-04-30
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNHNlBHWXZ3RRAB,5,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xCWldtcHljVkU1TVdrM1NubFFOVEpqZERodWEwRRAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xVemNtaGFkbUl0VDFkdlQxcElRVzVqY0ZocWVsRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUR1NTZIb2JBEAE,1,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUN6ek5peGxnRRAB,5,2 lata temu,2024-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNILThuR2dnRRAB,1,rok temu,2025-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNYanUzSXZBRRAB,5,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT210SlVHdExXRjlvYjFKVFdtTnJVek5uVkc1RVVsRRAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tvMmEwUnlNVzV3TUVsTWNsUndaR2hTYUVSSlFXYxAB,5,3 miesiące temu,2026-05-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNaOTg3QjZRRRAB,1,2 lata temu,2024-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUMtMy1IdG1RRRAB,5,3 lata temu,2023-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUR1cFo3TnpBRRAB,5,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21kalVFeExUMGgwWlZsU1F6ZHdWMEZJUkZBMWJGRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xsb01FazVlVUpsTFVJMUxVRmZlVkJVTkVaa1UzYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUR1OGJlSVpBEAE,5,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNIc0wtcWd3RRAB,1,2 lata temu,2024-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNLajR6VGlRRRAB,5,5 lat temu,2021-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT205UGRITXpWbVpmTUROSFlWSXhOelZ2YTBkbVMxRRAB,4,rok temu,2025-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUR1NWFDNTJ3RRAB,5,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSURPNGJYQ1lREAE,5,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSURteTlUX0Z3EAE,5,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUQ2eTkzWmlRRRAB,1,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUMtdnUzMzJBRRAB,3,3 lata temu,2023-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURXbmR6bF93RRAB,5,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25CMWR6RnJURGd4UkhCTWNIbFRTazFZUm5sdE9WRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUNOeXRQNEN3EAE,5,2 lata temu,2024-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURQZ3RIODBRRRAB,1,rok temu,2025-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUQ2dDVxdlB3EAE,1,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21oelMyaG5OMlJNYjFGNWMwSjZlRlJEYlhSVFZYYxAB,5,rok temu,2025-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pReExYcGZaRlZYV25OUlNrUmxTSFl3WlU0d1pHYxAB,5,3 miesiące temu,2026-05-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURhdGNMMW5BRRAB,1,5 lat temu,2021-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUQ2Mk4tVVR3EAE,2,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xGWGVIcFVhMUZ3VlhkcFRXSTFSRkkyVFdoRmFWRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURPNDllenhBRRAB,1,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSURwdVpUSWVBEAE,1,3 lata temu,2023-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUR5OGUyb0V3EAE,1,5 lat temu,2021-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUQ4dWVMS2ZBEAE,5,6 lat temu,2020-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSURXMjVmY0VnEAE,1,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21WclJrWkpXbUppY0hsdGNqZGxSREUxVkcxdU1XYxAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNLZ19DMnpBRRAB,5,5 lat temu,2021-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURVeE1qYXB3RRAB,1,7 lat temu,2019-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUNxeVBqeFpBEAE,1,5 lat temu,2021-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURtN2JlbGhnRRAB,1,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUN1NVlEUlZnEAE,1,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUQyLU9uLWhBRRAB,1,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tocWIzSXRWa1ZIUmpsSmFFUnJSbVJXYWpoNFZtYxAB,5,7 godzin temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tkWmRIbGpRMUJSTjNSelNqazFRblZ6WTBkc1duYxAB,5,7 godzin temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xsd1NGRlJXVmg2T0V3MExXeEdNMXByY0V4SFEzYxAB,5,5 dni temu,2026-08-26
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xaMkxUSjNTVWMwVW05SVFWaHhUekpOTWpabGNGRRAB,5,tydzień temu,2026-08-24
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pGNU1WcDFTR3g1YzFsTk5WUXRTR0pyYkVGdlFYYxAB,5,tydzień temu,2026-08-24
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21aQ1pWVjZOM0JRVmxSRE9YTmhTMmhSWDBwaGRHYxAB,5,tydzień temu,2026-08-24
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21WMVNFZE9WRXBJYW5rMU1ITlpjbkoyVVVWcGMzYxAB,5,2 tygodnie temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21KTmIxTlViRE51TFhsdlJEQmlaR2h3TkhWRVZGRRAB,5,2 tygodnie temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tsRlQzYzFlalJaVFY5b05FWkRhMVJKYVU5WFlXYxAB,5,2 tygodnie temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21sbFEzRnNlVlJEWHpKQmIzTmpUVEppZUU1b1dHYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21SSVRWcExXVXMxTUhrM2RXUk5Nekp1VkhaaWVYYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21vME1VeFBRVVE0VTJoRWIyOTROV2MyZEdkaVJYYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25KUWJVbG1hRE0yTmxCS01UaE1WamR0TVVSWGFYYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2sxU2VsSjRkVVJLWDBsUGVEQjVTalpTZEVad1JtYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tscVFYVkRZMngwTW00dFJGVkxRV3BMU1UxM05tYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2poQlpqRkphRXh4Um01SlRIbEVkRjgxUWxCVE0xRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21WbWJqZHdOVGRFU21kck9HcE9hSE5PWDBrMFprRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2tVM1ZERnNRbTVMU21KUE1FNHlNa3hDYjBSQ01VRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pWMFUxOU5lVFJJTTNWUmRYQndZelV4V2kxelVWRRAB,5,Edytowano miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xkbU5WVTBZMjVXVmtoMWVtRndOMGg0U200NFQzYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t4MFEzcDJRa3A2WDFkcWJsWllORjloWlVkSWIxRRAB,1,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2s5S1MzaHJjak14Um5aRU1qTlFWVWRPV2toRVRXYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25NeFoxWmpTRmR6U0dsbGJWOTRiMkl6UWs0eFQzYxAB,5,5 miesięcy temu,2026-03-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUMyM0phcTVRRRAB,3,4 lata temu,2022-08-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xKWE5qUkhla05rWnpsamFsTnliVXBqVUdSMlFYYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xNek1GZHhlVWhMZDI1blZtcGZjbGhzYm1neVNIYxAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT205MVZUVnpTMkpRY3psVVRrRmlOM2cxVWxCUVZIYxAB,5,2 dni temu,2026-08-29
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2twTVZqVnpNa2Q1Vm5Sek1uWk9ORTVoTW1Wb2FrRRAB,5,6 dni temu,2026-08-25
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25aUVZGbDRTbWRzY1hWdGNGQldabkEwWjNOWVYyYxAB,5,tydzień temu,2026-08-24
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21sclEyWlhhVE5IZEZaak1HdHljV1V3VDIxbU1uYxAB,5,3 tygodnie temu,
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT214TVUyOXJTamRMTVZFeE9FMUhTRlI2UTNaMlNWRRAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2xacWNYUXpaVVZzYTBsV1REbGxjR2xVTWxsT2EyYxAB,5,miesiąc temu,2026-07-31
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21acVJuTkpNekZaUmtkaE5HZFBUV1pMTm13elNHYxAB,1,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25kSVprWkxVbk5RTlVjeGNWUnJjR3hVTlhwWlRHYxAB,5,2 miesiące temu,2026-06-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT25KRFMwSlBVbFl6U0dFNWRFUXRiR1V6UjNZd05XYxAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2pkbU5rWmpjRGh1ZWtWMFltVjZNbFZGTUVOTlVWRRAB,5,4 miesiące temu,2026-04-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT2t4T1NraE5hWFZ2WW5KbU1tUmhNbHBDVUhWV1NGRRAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
Ci9DQUlRQUNvZENodHljRjlvT21aWE1XOXRSMjlQTW5KdFdFNXVSak5HUlZwRlFtYxAB,5,9 miesięcy temu,2025-11-30
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUQ3cGFTMGJnEAE,5,2 lata temu,2024-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUMxaDRfWkpnEAE,5,2 lata temu,2024-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUMtamNPN0t3EAE,5,3 lata temu,2023-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSURXeU9iVHl3RRAB,5,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSURHejdiREhBEAE,5,4 lata temu,2022-08-31
|
||||||
|
ChdDSUhNMG9nS0VJQ0FnSUNHallpV3JRRRAB,4,4 lata temu,2022-08-31
|
||||||
|
ChZDSUhNMG9nS0VJQ0FnSUNxdm96Yk5REAE,5,5 lat temu,2021-08-31
|
||||||
|
+585
@@ -0,0 +1,585 @@
|
|||||||
|
import re
|
||||||
|
import time
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
import pandas as pd
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
|
from playwright.sync_api import sync_playwright
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# USTAWIENIA
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
URL = "https://maps.app.goo.gl/USRCto35jhoVtmj4A"
|
||||||
|
|
||||||
|
HEADLESS = False
|
||||||
|
|
||||||
|
# Ile kolejnych scrolli bez nowych opinii oznacza koniec
|
||||||
|
MAX_EMPTY_SCROLLS = 8
|
||||||
|
|
||||||
|
# Czas między scrollami
|
||||||
|
SCROLL_DELAY = 1.2
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# PARSOWANIE DATY GOOGLE
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def parse_google_date(text: str):
|
||||||
|
if not text:
|
||||||
|
return None
|
||||||
|
|
||||||
|
text = text.strip().lower()
|
||||||
|
now = datetime.now()
|
||||||
|
|
||||||
|
if text == "dzisiaj":
|
||||||
|
return now.date()
|
||||||
|
|
||||||
|
if text == "wczoraj":
|
||||||
|
return (now - timedelta(days=1)).date()
|
||||||
|
|
||||||
|
patterns = [
|
||||||
|
(r"(\d+)\s+dni?\s+temu", lambda n: now - timedelta(days=n)),
|
||||||
|
(r"(\d+)\s+dzień\s+temu", lambda n: now - timedelta(days=n)),
|
||||||
|
(r"(\d+)\s+tygodni?\s+temu", lambda n: now - timedelta(weeks=n)),
|
||||||
|
(
|
||||||
|
r"(\d+)\s+miesi(?:ąc|ące|ęcy)\s+temu",
|
||||||
|
lambda n: now - relativedelta(months=n)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
r"(\d+)\s+lat(?:a)?\s+temu",
|
||||||
|
lambda n: now - relativedelta(years=n)
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
for pattern, func in patterns:
|
||||||
|
match = re.search(pattern, text)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
return func(int(match.group(1))).date()
|
||||||
|
|
||||||
|
if "tydzień temu" in text:
|
||||||
|
return (now - timedelta(weeks=1)).date()
|
||||||
|
|
||||||
|
if "miesiąc temu" in text:
|
||||||
|
return (now - relativedelta(months=1)).date()
|
||||||
|
|
||||||
|
if "rok temu" in text:
|
||||||
|
return (now - relativedelta(years=1)).date()
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# COOKIES
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def accept_cookies(page):
|
||||||
|
labels = [
|
||||||
|
"Zaakceptuj wszystko",
|
||||||
|
"Accept all",
|
||||||
|
"Odrzuć wszystko",
|
||||||
|
"Reject all",
|
||||||
|
]
|
||||||
|
|
||||||
|
for label in labels:
|
||||||
|
try:
|
||||||
|
button = page.get_by_role(
|
||||||
|
"button",
|
||||||
|
name=re.compile(label, re.I)
|
||||||
|
)
|
||||||
|
|
||||||
|
if button.count() and button.first.is_visible():
|
||||||
|
button.first.click(timeout=3000)
|
||||||
|
time.sleep(2)
|
||||||
|
return
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# OTWIERANIE PANELU OPINII
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def open_reviews_panel(page):
|
||||||
|
print("Szukam właściwego przycisku z opiniami...")
|
||||||
|
|
||||||
|
buttons = page.locator("button")
|
||||||
|
|
||||||
|
for i in range(buttons.count()):
|
||||||
|
try:
|
||||||
|
button = buttons.nth(i)
|
||||||
|
|
||||||
|
if not button.is_visible():
|
||||||
|
continue
|
||||||
|
|
||||||
|
aria = button.get_attribute("aria-label") or ""
|
||||||
|
|
||||||
|
try:
|
||||||
|
text = button.inner_text(timeout=500)
|
||||||
|
except:
|
||||||
|
text = ""
|
||||||
|
|
||||||
|
label = f"{aria} {text}".strip()
|
||||||
|
|
||||||
|
# Musi zawierać liczbę oraz opini/recenz/review
|
||||||
|
if (
|
||||||
|
re.search(r"\d+", label)
|
||||||
|
and re.search(r"(opini|recenz|reviews?)", label, re.I)
|
||||||
|
):
|
||||||
|
print("Kandydat:", repr(label[:200]))
|
||||||
|
|
||||||
|
try:
|
||||||
|
button.scroll_into_view_if_needed()
|
||||||
|
time.sleep(0.5)
|
||||||
|
button.click(timeout=3000)
|
||||||
|
|
||||||
|
print("Kliknięto:", repr(label[:200]))
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
cards = page.locator('div[data-review-id]')
|
||||||
|
|
||||||
|
if cards.count() > 5:
|
||||||
|
print("Panel opinii otwarty.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("Nie udało się kliknąć:", e)
|
||||||
|
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Fallback dla role=button
|
||||||
|
print("Próbuję alternatywnego selektora...")
|
||||||
|
|
||||||
|
candidates = page.locator(
|
||||||
|
'[role="button"][aria-label*="opini"], '
|
||||||
|
'[role="button"][aria-label*="recenz"], '
|
||||||
|
'[role="button"][aria-label*="review"]'
|
||||||
|
)
|
||||||
|
|
||||||
|
for i in range(candidates.count()):
|
||||||
|
try:
|
||||||
|
el = candidates.nth(i)
|
||||||
|
|
||||||
|
if not el.is_visible():
|
||||||
|
continue
|
||||||
|
|
||||||
|
aria = el.get_attribute("aria-label") or ""
|
||||||
|
|
||||||
|
if not re.search(r"\d+", aria):
|
||||||
|
continue
|
||||||
|
|
||||||
|
print("Klikam:", repr(aria))
|
||||||
|
|
||||||
|
el.scroll_into_view_if_needed()
|
||||||
|
el.click(timeout=3000)
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
cards = page.locator('div[data-review-id]')
|
||||||
|
|
||||||
|
if cards.count() > 5:
|
||||||
|
print("Panel opinii otwarty.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ZNAJDOWANIE SCROLLOWANEGO PANELU
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def get_scrollable_parent(card):
|
||||||
|
try:
|
||||||
|
return card.evaluate_handle("""
|
||||||
|
el => {
|
||||||
|
let p = el.parentElement;
|
||||||
|
|
||||||
|
while (p) {
|
||||||
|
const style = getComputedStyle(p);
|
||||||
|
|
||||||
|
if (
|
||||||
|
(style.overflowY === 'auto' ||
|
||||||
|
style.overflowY === 'scroll') &&
|
||||||
|
p.scrollHeight > p.clientHeight
|
||||||
|
) {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = p.parentElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
except:
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# OCENA GWIAZDKOWA
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def extract_rating(card):
|
||||||
|
selectors = [
|
||||||
|
'[role="img"][aria-label*="gwiazd"]',
|
||||||
|
'[aria-label*="gwiazd"]',
|
||||||
|
'[role="img"][aria-label*="star"]',
|
||||||
|
'[aria-label*="star"]',
|
||||||
|
'span.kvMYJc[aria-label]',
|
||||||
|
]
|
||||||
|
|
||||||
|
for selector in selectors:
|
||||||
|
try:
|
||||||
|
el = card.locator(selector).first
|
||||||
|
|
||||||
|
if not el.count():
|
||||||
|
continue
|
||||||
|
|
||||||
|
label = el.get_attribute("aria-label") or ""
|
||||||
|
|
||||||
|
match = re.search(r"([1-5](?:[.,]\d+)?)", label)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
value = match.group(1).replace(",", ".")
|
||||||
|
return int(float(value))
|
||||||
|
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# DATA OPINII
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def extract_date_text(card):
|
||||||
|
selectors = [
|
||||||
|
".rsqaWe",
|
||||||
|
"span.rsqaWe",
|
||||||
|
]
|
||||||
|
|
||||||
|
for selector in selectors:
|
||||||
|
try:
|
||||||
|
el = card.locator(selector).first
|
||||||
|
|
||||||
|
if el.count():
|
||||||
|
text = el.inner_text().strip()
|
||||||
|
|
||||||
|
if text:
|
||||||
|
return text
|
||||||
|
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ŁADOWANIE WSZYSTKICH OPINII
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def count_unique_reviews(cards):
|
||||||
|
"""Policz opinie, a nie zduplikowane elementy DOM Google Maps."""
|
||||||
|
try:
|
||||||
|
return cards.evaluate_all("""
|
||||||
|
elements => new Set(
|
||||||
|
elements
|
||||||
|
.map(el => el.getAttribute('data-review-id'))
|
||||||
|
.filter(Boolean)
|
||||||
|
).size
|
||||||
|
""")
|
||||||
|
except:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def load_all_reviews(page):
|
||||||
|
previous_count = 0
|
||||||
|
empty_scrolls = 0
|
||||||
|
|
||||||
|
print("\nŁadowanie opinii...")
|
||||||
|
|
||||||
|
while empty_scrolls < MAX_EMPTY_SCROLLS:
|
||||||
|
cards = page.locator('div[data-review-id]')
|
||||||
|
count = count_unique_reviews(cards)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\rZaładowane opinie: {count}",
|
||||||
|
end="",
|
||||||
|
flush=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if count > previous_count:
|
||||||
|
previous_count = count
|
||||||
|
empty_scrolls = 0
|
||||||
|
else:
|
||||||
|
empty_scrolls += 1
|
||||||
|
|
||||||
|
if count == 0:
|
||||||
|
page.mouse.wheel(0, 5000)
|
||||||
|
time.sleep(SCROLL_DELAY)
|
||||||
|
continue
|
||||||
|
|
||||||
|
last_card = cards.last
|
||||||
|
|
||||||
|
scrollable = get_scrollable_parent(last_card)
|
||||||
|
|
||||||
|
if scrollable:
|
||||||
|
try:
|
||||||
|
scrollable.evaluate("""
|
||||||
|
el => {
|
||||||
|
el.scrollTop = el.scrollHeight;
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
except:
|
||||||
|
page.mouse.wheel(0, 5000)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
last_card.scroll_into_view_if_needed()
|
||||||
|
except:
|
||||||
|
page.mouse.wheel(0, 5000)
|
||||||
|
|
||||||
|
time.sleep(SCROLL_DELAY)
|
||||||
|
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ZBIERANIE DANYCH
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def extract_reviews(page):
|
||||||
|
results = {}
|
||||||
|
|
||||||
|
cards = page.locator('div[data-review-id]')
|
||||||
|
|
||||||
|
unique_count = count_unique_reviews(cards)
|
||||||
|
print(f"\nZbieram dane z {unique_count} unikalnych opinii...")
|
||||||
|
|
||||||
|
for i in range(cards.count()):
|
||||||
|
card = cards.nth(i)
|
||||||
|
|
||||||
|
try:
|
||||||
|
review_id = card.get_attribute("data-review-id")
|
||||||
|
|
||||||
|
if not review_id:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Deduplikacja
|
||||||
|
if review_id in results:
|
||||||
|
continue
|
||||||
|
|
||||||
|
rating = extract_rating(card)
|
||||||
|
|
||||||
|
if rating is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
date_raw = extract_date_text(card)
|
||||||
|
date_approx = parse_google_date(date_raw)
|
||||||
|
|
||||||
|
results[review_id] = {
|
||||||
|
"review_id": review_id,
|
||||||
|
"rating": rating,
|
||||||
|
"date_raw": date_raw,
|
||||||
|
"date_approx": date_approx,
|
||||||
|
}
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Błąd przy opinii #{i}: {e}")
|
||||||
|
|
||||||
|
return pd.DataFrame(results.values())
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# PODSUMOWANIE
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def print_summary(df):
|
||||||
|
print("\n==============================")
|
||||||
|
print("ŁĄCZNIE")
|
||||||
|
print("==============================")
|
||||||
|
print(len(df))
|
||||||
|
|
||||||
|
print("\n==============================")
|
||||||
|
print("ROZKŁAD GWIAZDEK")
|
||||||
|
print("==============================")
|
||||||
|
|
||||||
|
distribution = (
|
||||||
|
df["rating"]
|
||||||
|
.value_counts()
|
||||||
|
.reindex([5, 4, 3, 2, 1], fill_value=0)
|
||||||
|
)
|
||||||
|
|
||||||
|
total = len(df)
|
||||||
|
|
||||||
|
for stars, count in distribution.items():
|
||||||
|
percent = (count / total * 100) if total else 0
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"{stars}★: "
|
||||||
|
f"{count:>4} "
|
||||||
|
f"({percent:>5.1f}%)"
|
||||||
|
)
|
||||||
|
|
||||||
|
print("\n==============================")
|
||||||
|
print("ŚREDNIA")
|
||||||
|
print("==============================")
|
||||||
|
|
||||||
|
if len(df):
|
||||||
|
print(round(df["rating"].mean(), 3))
|
||||||
|
else:
|
||||||
|
print("Brak danych")
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# FILTROWANIE PO OKRESIE
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def print_period_summary(df, date_from=None, date_to=None):
|
||||||
|
temp = df.copy()
|
||||||
|
|
||||||
|
temp["date_approx"] = pd.to_datetime(
|
||||||
|
temp["date_approx"],
|
||||||
|
errors="coerce"
|
||||||
|
)
|
||||||
|
|
||||||
|
if date_from:
|
||||||
|
temp = temp[
|
||||||
|
temp["date_approx"] >= pd.to_datetime(date_from)
|
||||||
|
]
|
||||||
|
|
||||||
|
if date_to:
|
||||||
|
temp = temp[
|
||||||
|
temp["date_approx"] <= pd.to_datetime(date_to)
|
||||||
|
]
|
||||||
|
|
||||||
|
print("\n==============================")
|
||||||
|
print(f"OKRES: {date_from} -> {date_to}")
|
||||||
|
print("==============================")
|
||||||
|
|
||||||
|
if temp.empty:
|
||||||
|
print("Brak opinii w tym okresie.")
|
||||||
|
return
|
||||||
|
|
||||||
|
distribution = (
|
||||||
|
temp["rating"]
|
||||||
|
.value_counts()
|
||||||
|
.reindex([5, 4, 3, 2, 1], fill_value=0)
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"Liczba opinii: {len(temp)}")
|
||||||
|
|
||||||
|
for stars, count in distribution.items():
|
||||||
|
print(f"{stars}★: {count}")
|
||||||
|
|
||||||
|
print("Średnia:", round(temp["rating"].mean(), 3))
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# MAIN
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
def main():
|
||||||
|
with sync_playwright() as p:
|
||||||
|
browser = p.chromium.launch(
|
||||||
|
headless=HEADLESS
|
||||||
|
)
|
||||||
|
|
||||||
|
context = browser.new_context(
|
||||||
|
locale="pl-PL",
|
||||||
|
viewport={
|
||||||
|
"width": 1400,
|
||||||
|
"height": 900,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
page = context.new_page()
|
||||||
|
|
||||||
|
print("Otwieram Google Maps...")
|
||||||
|
|
||||||
|
page.goto(
|
||||||
|
URL,
|
||||||
|
wait_until="domcontentloaded",
|
||||||
|
timeout=60_000
|
||||||
|
)
|
||||||
|
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
|
accept_cookies(page)
|
||||||
|
|
||||||
|
opened = open_reviews_panel(page)
|
||||||
|
|
||||||
|
if not opened:
|
||||||
|
print(
|
||||||
|
"\nNie udało się automatycznie otworzyć panelu opinii."
|
||||||
|
)
|
||||||
|
print(
|
||||||
|
"Kliknij ręcznie liczbę opinii / „Więcej opinii”."
|
||||||
|
)
|
||||||
|
|
||||||
|
input(
|
||||||
|
"Gdy panel będzie otwarty, naciśnij ENTER..."
|
||||||
|
)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
cards = page.locator('div[data-review-id]')
|
||||||
|
|
||||||
|
print(
|
||||||
|
"Opinie widoczne po otwarciu panelu:",
|
||||||
|
count_unique_reviews(cards)
|
||||||
|
)
|
||||||
|
|
||||||
|
if count_unique_reviews(cards) < 5:
|
||||||
|
print(
|
||||||
|
"\nUWAGA: panel opinii prawdopodobnie "
|
||||||
|
"nie został poprawnie otwarty."
|
||||||
|
)
|
||||||
|
|
||||||
|
input(
|
||||||
|
"Otwórz ręcznie wszystkie opinie "
|
||||||
|
"i naciśnij ENTER..."
|
||||||
|
)
|
||||||
|
|
||||||
|
load_all_reviews(page)
|
||||||
|
|
||||||
|
df = extract_reviews(page)
|
||||||
|
|
||||||
|
browser.close()
|
||||||
|
|
||||||
|
if df.empty:
|
||||||
|
print("\nNie znaleziono żadnych opinii.")
|
||||||
|
return
|
||||||
|
|
||||||
|
df.to_csv(
|
||||||
|
"google_reviews_ratings.csv",
|
||||||
|
index=False,
|
||||||
|
encoding="utf-8-sig"
|
||||||
|
)
|
||||||
|
|
||||||
|
print_summary(df)
|
||||||
|
|
||||||
|
print("\nZapisano:")
|
||||||
|
print("google_reviews_ratings.csv")
|
||||||
|
|
||||||
|
# ========================================================
|
||||||
|
# PRZYKŁADOWE FILTROWANIE
|
||||||
|
# Odkomentuj jeśli chcesz
|
||||||
|
# ========================================================
|
||||||
|
|
||||||
|
# print_period_summary(
|
||||||
|
# df,
|
||||||
|
# "2025-01-01",
|
||||||
|
# "2025-12-31"
|
||||||
|
# )
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user