Выгрузить список магазинов Магнит
Нужно выгрузить адреса магазинов и координаты с сайта магнита. На сколько я понял у них отсутствует какой либо api. При запросе к сайту
import requests
import json
r = requests.get('https://magnit.ru/shops/')
print(r.text)
в var elementsArr вроде как присутствует некие координаты и адреса.
var elementsArr =
{"points" :
[
{
"id": 49215,
"city": "2398",
"lat": "55.742145",
"lng": "37.520419",
"address": "\u0433. \u041c\u043e\u0441\u043a\u0432\u0430,\u0443\u043b. 1812 \u0433\u043e\u0434\u0430,12.
}
]
}
Как мне вытащить lat , lng и address
Ответы (2 шт):
Автор решения: Violet
→ Ссылка
Исходя из:
в
var elementsArrвроде как присутствует некие координаты и адреса.
elementsArr = {"points" :
[
{
"id": 49215,
"city": "2398",
"lat": "55.742145",
"lng": "37.520419",
"address": "\u0433. \u041c\u043e\u0441\u043a\u0432\u0430,\u0443\u043b. 1812 \u0433\u043e\u0434\u0430,12."
}
]
}
print(elementsArr['points'][0]['lat'])
print(elementsArr['points'][0]['lng'])
print(elementsArr['points'][0]['address'])
а вообще r = requests.get('https://magnit.ru/shops/') вернёт HTML страницы
Автор решения: gil9red
→ Ссылка
Действия:
- Регуляркой вытащить
var elementsArr = ...; - Распарсить как json
- Работать с данными из
elementsArr
import json
import re
import requests
rs = requests.get('https://magnit.ru/shops/')
m = re.search('var elementsArr = (.+);', rs.text)
data = json.loads(m.group(1))
points = data['points']
print(f'Points ({len(points)}):')
for p in points:
print(f" lat: {p['lat']}, lng: {p['lng']}")
# Points (617):
# lat: 55.742145, lng: 37.520419
# lat: 55.741764, lng: 37.520348
# lat: 55.741757, lng: 37.520355
# ...
# lat: 55.877706, lng: 37.731395
# lat: 55.876482, lng: 37.721799
# lat: 55.878682, lng: 37.719253
PS.
По хорошему, перед использованием m.group(1) лучше проверить m, т.к. если регулярка не сможет найти, то в m будет None, пример так:
if not m:
print(f'[-] Не удалось регуляркой найти "var elementsArr"')
# И в зависимости от места вызова:
# return # Выходим из функции
# sys.exit() # или завершаем работу скрипта
data = json.loads(m.group(1))