From ecc275218aaa6c95a5fb28648f407e1e9ba1bff4 Mon Sep 17 00:00:00 2001 From: Andy Trofimov Date: Thu, 14 Mar 2024 18:30:43 +0500 Subject: [PATCH] Add ability to parse stations --- CHANGELOG.md | 9 ++- README.md | 9 +-- parser_2gis/common.py | 11 ++-- parser_2gis/data/rubrics.json | 74 ++++++++++++++++++------ parser_2gis/gui/urls_generator.py | 4 +- parser_2gis/parser/parsers/main.py | 2 +- parser_2gis/version.py | 2 +- parser_2gis/writer/writers/csv_writer.py | 5 ++ scripts/update_cities_list.py | 2 +- 9 files changed, 85 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc57504..ae5ed4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Невошедшее] +## [1.2.1] - 14-03-2024 +### Добавлено +- Добавлена поддержка парсинга остановок. Fix [issue](https://github.com/interlark/parser-2gis/issues/52). +- Генератор ссылок добавляет в URL сортировку по алфавиту для исключения повторений поисковой выдачи при навигации по страницам. +- Обновлён список рубрик. + ## [1.2.0] - 08-02-2024 ### Добавлено - Небольшой багфикс схемы ответов сервера. @@ -88,7 +94,8 @@ - Первый релиз. -[Невошедшее]: https://github.com/interlark/parser-2gis/compare/v1.2.0...HEAD +[Невошедшее]: https://github.com/interlark/parser-2gis/compare/v1.2.1...HEAD +[1.2.1]: https://github.com/interlark/parser-2gis/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/interlark/parser-2gis/compare/v1.1.2...v1.2.0 [1.1.2]: https://github.com/interlark/parser-2gis/compare/v1.1.1...v1.1.2 [1.1.1]: https://github.com/interlark/parser-2gis/compare/v1.1.0...v1.1.1 diff --git a/README.md b/README.md index dc27d10..99b2bca 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ ## ℹ️ Описание Парсер для автоматического сбора базы адресов и контактов предприятий, которые работают на территории -России , Казахстана , Украины , Беларуси , +России , Казахстана , Беларуси , Азербайджана , Киргизии , Узбекистана , Чехии , Египта , Италии , Саудовской Аравии , Кипра , Объединенных Арабских Эмиратов , Чили , Катара , Омана , Бахрейна , Кувейта . ## ✨ Особенности @@ -47,6 +47,7 @@ ## 📖 Документация Описание работы доступно на [вики](https://github.com/interlark/parser-2gis/wiki). -## 👍 Поддержать -Поблагодарить и поддержать разработку QIWI Donate - +## 👍 Поддержать проект + + Yoomoney Donate + diff --git a/parser_2gis/common.py b/parser_2gis/common.py index f3ea835..3832a5c 100644 --- a/parser_2gis/common.py +++ b/parser_2gis/common.py @@ -56,13 +56,14 @@ def inner(*args, timeout=timeout, finished=finished, call_time = time.time() while True: ret = func(*args, **kwargs) - if not timeout or finished(ret): + if finished(ret): return ret - if time.time() - call_time > timeout: - if throw_exception: - raise TimeoutError(func) - return ret + if timeout is not None: + if time.time() - call_time > timeout: + if throw_exception: + raise TimeoutError(func) + return ret time.sleep(poll_interval) return inner diff --git a/parser_2gis/data/rubrics.json b/parser_2gis/data/rubrics.json index e1af0e1..6257d68 100644 --- a/parser_2gis/data/rubrics.json +++ b/parser_2gis/data/rubrics.json @@ -931,6 +931,7 @@ "809", "631", "774", + "51414", "309", "52495", "110423", @@ -946,7 +947,6 @@ "764", "53139", "384", - "51414", "259" ] }, @@ -977,6 +977,7 @@ "111005", "547", "110387", + "24472", "111540", "269", "270", @@ -984,7 +985,7 @@ "19487", "70348", "19601", - "24472", + "112877", "111539", "112545", "25108", @@ -995,6 +996,7 @@ "272", "16615", "23494", + "112878", "52681" ] }, @@ -1132,6 +1134,7 @@ "308", "112527", "157", + "112876", "53624", "50414", "312", @@ -1180,6 +1183,7 @@ "1015", "52973", "110519", + "16022", "321", "334", "110506", @@ -1198,7 +1202,6 @@ "8367", "1123", "5602", - "16022", "54145", "110493", "51324", @@ -1614,6 +1617,7 @@ "406", "7900", "56428", + "112879", "110365", "10792", "22829", @@ -4189,7 +4193,7 @@ "416": { "isRussian": true, "isNonRussian": true, - "label": "Автовокзалы / Автостанции", + "label": "Автовокзалы", "code": "416", "parentCode": "22191", "children": [] @@ -6175,10 +6179,10 @@ "children": [ "697", "110651", - "19661", "53989", "52958", "51368", + "19661", "54419", "380", "52255", @@ -9022,7 +9026,7 @@ "16022": { "isRussian": true, "isNonRussian": true, - "label": "Услуги гравировки", + "label": "Гравировка", "code": "16022", "parentCode": "59", "children": [] @@ -9634,13 +9638,13 @@ "children": [ "51646", "112548", + "110332", "110427", "71232", "68951", "110377", "111582", "51221", - "110332", "51008", "112684", "110490", @@ -9749,7 +9753,7 @@ "19661": { "isRussian": true, "isNonRussian": true, - "label": "Гостиницы для животных", + "label": "Зоогостиницы", "code": "19661", "parentCode": "749", "children": [] @@ -10044,6 +10048,7 @@ "110384", "112490", "171", + "24504", "112489", "110300", "112464", @@ -10052,7 +10057,6 @@ "7332", "9281", "174", - "24504", "112651", "55875", "15707", @@ -10240,7 +10244,7 @@ "24472": { "isRussian": true, "isNonRussian": true, - "label": "Лыжные базы / Горнолыжные комплексы", + "label": "Горнолыжные комплексы", "code": "24472", "parentCode": "50", "children": [] @@ -10248,7 +10252,7 @@ "24504": { "isRussian": true, "isNonRussian": true, - "label": "Продажа лотерейных билетов", + "label": "Лотерейные билеты", "code": "24504", "parentCode": "22215", "children": [] @@ -11275,7 +11279,7 @@ "51414": { "isRussian": true, "isNonRussian": true, - "label": "Товары для подводного плавания", + "label": "Подводное снаряжение", "code": "51414", "parentCode": "48", "children": [] @@ -11434,7 +11438,7 @@ }, "52248": { "isRussian": true, - "isNonRussian": true, + "isNonRussian": false, "label": "Рюмочные", "code": "52248", "parentCode": "25", @@ -11499,7 +11503,7 @@ "52959": { "isRussian": true, "isNonRussian": true, - "label": "Киоски / магазины по продаже печатной продукции", + "label": "Продажа печатной продукции", "code": "52959", "parentCode": "47", "children": [] @@ -12259,7 +12263,7 @@ }, "56581": { "isRussian": true, - "isNonRussian": true, + "isNonRussian": false, "label": "Избирательные участки", "code": "56581", "parentCode": "44", @@ -12926,7 +12930,7 @@ }, "103240": { "isRussian": true, - "isNonRussian": false, + "isNonRussian": true, "label": "Услуга распила мяса", "code": "103240", "parentCode": "70", @@ -13143,7 +13147,7 @@ "110320": { "isRussian": true, "isNonRussian": true, - "label": "Станции для зарядки электротранспорта", + "label": "Станции зарядки электромобилей", "code": "110320", "parentCode": "77", "children": [] @@ -13223,7 +13227,7 @@ "110332": { "isRussian": true, "isNonRussian": true, - "label": "Занятия по аквааэробике", + "label": "Аквааэробика", "code": "110332", "parentCode": "19519", "children": [] @@ -15366,7 +15370,7 @@ }, "112614": { "isRussian": true, - "isNonRussian": false, + "isNonRussian": true, "label": "Дарксторы", "code": "112614", "parentCode": "73", @@ -16124,6 +16128,38 @@ "parentCode": "31", "children": [] }, + "112876": { + "isRussian": true, + "isNonRussian": false, + "label": "Станции зарядки электросамокатов", + "code": "112876", + "parentCode": "56", + "children": [] + }, + "112877": { + "isRussian": true, + "isNonRussian": false, + "label": "Лыжные базы", + "code": "112877", + "parentCode": "50", + "children": [] + }, + "112878": { + "isRussian": true, + "isNonRussian": false, + "label": "Тюбинговые трассы", + "code": "112878", + "parentCode": "50", + "children": [] + }, + "112879": { + "isRussian": true, + "isNonRussian": false, + "label": "Услуги русификации", + "code": "112879", + "parentCode": "77", + "children": [] + }, "-1": { "isRussian": true, "isNonRussian": true, diff --git a/parser_2gis/gui/urls_generator.py b/parser_2gis/gui/urls_generator.py index 2a01281..b2eb4a2 100644 --- a/parser_2gis/gui/urls_generator.py +++ b/parser_2gis/gui/urls_generator.py @@ -39,7 +39,7 @@ def gui_urls_generator() -> list[str]: ae='Объединенные Арабские Эмираты', iq='Ирак', az='Азербайджан', bh='Бахрейн', by='Беларусь', cl='Чили', cy='Кипр', cz='Чехия', eg='Египт', it='Италия', kg='Киргизия', kw='Кувейт', kz='Казахстан', om='Оман', - qa='Катар', ru='Россия', sa='Саудовская Аравия', ua='Украина', uz='Узбекистан') + qa='Катар', ru='Россия', sa='Саудовская Аравия', uz='Узбекистан') country_name_to_code = {v: k for k, v in country_code_to_name.items()} @@ -182,6 +182,8 @@ def get_selected_urls(query: str) -> list[str]: if rubric: rest_url += f'/rubricId/{rubric["code"]}' + rest_url += '/filters/sort=name' + url = base_url + rest_url urls.append(url) diff --git a/parser_2gis/parser/parsers/main.py b/parser_2gis/parser/parsers/main.py index 12d81d7..54b9f22 100644 --- a/parser_2gis/parser/parsers/main.py +++ b/parser_2gis/parser/parsers/main.py @@ -60,7 +60,7 @@ def _get_links(self) -> list[DOMNode]: """Extracts specific DOM node links from current DOM snapshot.""" def valid_link(node: DOMNode) -> bool: if node.local_name == 'a' and 'href' in node.attributes: - link_match = re.match(r'.*/firm/.*\?stat=(?P[a-zA-Z0-9%]+)', node.attributes['href']) + link_match = re.match(r'.*/(firm|station)/.*\?stat=(?P[a-zA-Z0-9%]+)', node.attributes['href']) if link_match: try: base64.b64decode(urllib.parse.unquote(link_match.group('data'))) diff --git a/parser_2gis/version.py b/parser_2gis/version.py index 16176e7..b409013 100644 --- a/parser_2gis/version.py +++ b/parser_2gis/version.py @@ -1,4 +1,4 @@ """Version info.""" -version = '1.2.0' +version = '1.2.1' config_version = '0.1' diff --git a/parser_2gis/writer/writers/csv_writer.py b/parser_2gis/writer/writers/csv_writer.py index 2aedd9f..5b90161 100644 --- a/parser_2gis/writer/writers/csv_writer.py +++ b/parser_2gis/writer/writers/csv_writer.py @@ -23,6 +23,7 @@ def _type_names(self) -> dict[str, str]: 'street': 'Улица', 'road': 'Дорога', 'crossroad': 'Перекрёсток', + 'station': 'Остановка', } @property @@ -59,6 +60,7 @@ def _data_mapping(self) -> dict[str, Any]: 'point_lat': 'Широта', 'point_lon': 'Долгота', 'url': '2GIS URL', + 'type': 'Тип', } } @@ -202,6 +204,9 @@ def _extract_raw(self, catalog_doc: Any) -> dict[str, Any]: elif catalog_item.type in self._type_names: data['name'] = self._type_names[catalog_item.type] + # Type + data['type'] = catalog_item.type + # Address data['address'] = catalog_item.address_name diff --git a/scripts/update_cities_list.py b/scripts/update_cities_list.py index 6a07681..c6913c5 100644 --- a/scripts/update_cities_list.py +++ b/scripts/update_cities_list.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # Download cities info for following countries: -# ae, az, bh, by, cl, cy, cz, eg, it, kg, kw, kz, om, qa, ru, sa, ua, uz +# ae, az, bh, by, cl, cy, cz, eg, it, kg, kw, kz, om, qa, ru, sa, uz import json import os