Выгрузить список магазинов Магнит

Нужно выгрузить адреса магазинов и координаты с сайта магнита. На сколько я понял у них отсутствует какой либо 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))
→ Ссылка