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).
-## 👍 Поддержать
-Поблагодарить и поддержать разработку
-
+## 👍 Поддержать проект
+
+
+
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