Веб-очистка базовых данных с интерактивной онлайн-карты - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь получить базовые данные с интерактивной карты на этом сайте: https://www.sabrahealth.com/properties

Я попытался использовать функцию проверки в Google Chrome, чтобы найти файл XHR, в котором будут храниться местоположения всех точек на карте, но ничего не появилось. Есть ли другой способ извлечь данные о местоположении из этой карты?

1 Ответ

0 голосов
/ 02 апреля 2019

Ну, данные о местоположении доступны для скачивания на их сайте здесь . Но давайте предположим, что вы хотите, чтобы фактические значения широты и долготы были выполнены для анализа.

Первое, что я бы сделал, это именно то, что вы сделали (ищите XHR). Если я не могу найти там ничего, второе, что я всегда делаю, - это поиск по html тегам <script>. иногда данные «прячутся» там. Требуется немного больше детективной работы. Это не всегда дает результаты, но в этом случае.

Если вы посмотрите на теги <script>, вы найдете соответствующий формат json. Тогда вы можете просто работать с этим. Нужно просто найти его, затем манипулировать строкой, чтобы получить правильный формат json, а затем использовать json.loads(), чтобы передать это.

import requests
import bs4
import json


url = 'https://www.sabrahealth.com/properties'

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}


response = requests.get(url, headers=headers)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

scripts = soup.find_all('script')
for script in scripts:
    if 'jQuery.extend(Drupal.settings,' in script.text:
        jsonStr = script.text.split('jQuery.extend(Drupal.settings,')[1]
        jsonStr = jsonStr.rsplit(');',1)[0]

        jsonObj = json.loads(jsonStr)


for each in jsonObj['gmap']['auto1map']['markers']:
    name = each['markername']
    lat = each['latitude']
    lon = each['longitude']

    soup = bs4.BeautifulSoup(each['text'], 'html.parser')

    prop_type = soup.find('i', {'class':'property-type'}).text.strip()
    sub_cat = soup.find('span', {'class':'subcat'}).text.strip()

    location = soup.find('span', {'class':'subcat'}).find_next('p').text.split('\n')[0]


    print ('Type: %s\nSubCat: %s\nLat: %s\nLon: %s\nLocation: %s\n' %(prop_type, sub_cat, lat, lon, location))

Выход:

Type: Senior Housing - Leased
SubCat: Assisted Living
Lat: 38.3309
Lon: -85.862521
Location: Floyds Knobs, Indiana

Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 29.719507
Lon: -99.06649
Location: Bandera, Texas

Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.189079
Lon: -77.376015
Location: Petersburg, Virginia

Type: Skilled Nursing/Transitional Care
SubCat: SNF
Lat: 37.759998
Lon: -122.254616
Location: Alameda, California

...
...