Веб-утилизация remax.com для python - PullRequest
0 голосов
/ 27 февраля 2019

Это похоже на вопрос, который у меня был здесь .На что ответили отлично.Теперь, когда у меня есть кое-что для работы с тем, что я сейчас пытаюсь сделать, вместо ввода URL-адреса вручную для получения данных.Я хочу разработать функцию, которая будет принимать только адрес, почтовый индекс и возвращать данные, которые я хочу.

Теперь проблема заключается в изменении URL, чтобы получить правильный URL.Например,

url = 'https://www.remax.com/realestatehomesforsale/25-montage-way-laguna-beach-ca-92651-gid100012499996.html'

Я вижу, что помимо адреса, состояния и почтового индекса есть также число, которое следует за т. Е. Gid100012499996, которое кажется уникальным для каждого адреса.Поэтому я не уверен, как добиться желаемой функции.

Вот мой код:

import urllib
from bs4 import BeautifulSoup
import pandas as pd

def get_data(url):
    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Accept-Encoding': 'none',
            'Accept-Language': 'en-US,en;q=0.8',
            'Connection': 'keep-alive'}
    request = urllib.request.Request(url, headers=hdr)
    html = urllib.request.urlopen(request).read()

    soup = BeautifulSoup(html,'html.parser')
    foot = soup.find('span', class_="listing-detail-sqft-val")
    print(foot.text.strip())

url = 'https://www.remax.com/realestatehomesforsale/25-montage-way-laguna-beach-ca-92651-gid100012499996.html'
get_data(url)

Я хочу получить что-то вроде вышеупомянутого, но вместо этого get_data () примет адрес, штат и почтовый индекс.Приношу свои извинения, если этот вопрос не подходит для этого сайта.

1 Ответ

0 голосов
/ 28 февраля 2019

На сайте есть JSON API, который позволяет вам получить все детали свойств в данном прямоугольнике.Прямоугольник задается координатами широты и долготы для углов NW и SE.Следующий запрос показывает возможный поиск:

import requests

params = {
    "nwlat" : 41.841966864112,          # Calculate from address
    "nwlong" : -74.08774571289064,      # Calculate from address
    "selat" : 41.64189784194883,        # Calculate from address
    "selong" : -73.61430363525392,      # Calculate from address
    "Count" : 100,
    "pagenumber" : 1,
    "SiteID" : "68000000",
    "pageCount" : "10",
    "tab" : "map",
    "sh" : "true",
    "forcelatlong" : "true",
    "maplistings" : "1",
    "maplistcards" : "0",
    "sv" : "true",
    "sortorder" : "newest",
    "view" : "forsale",
}

req_properties = requests.get("https://www.remax.com/api/listings", params=params)
matching_properties_json = req_properties.json()

for p in matching_properties_json[0]:
    print(f"{p['Address']:<40}  {p.get('BedRooms', 0)} beds | {int(p.get('BathRooms',0))} baths | {p['SqFt']} sqft")

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

3 Pond Ridge Road                         2 beds | 3.0 baths | 2532 sqft
84 Hudson Avenue                          3 beds | 1.0 baths | 1824 sqft
116 HUDSON POINTE DR                      2 beds | 3.0 baths | 2455 sqft
6 Falcon Drive                            4 beds | 3.0 baths | 1993 sqft
53 MAPLE                                  5 beds | 2.0 baths | 3511 sqft
4 WOODLAND CIR                            3 beds | 2.0 baths | 1859 sqft
.
.
.
95 S HAMILTON ST                          3 beds | 1.0 baths | 2576 sqft
40 S Manheim Boulevard                    2 beds | 2.0 baths | 1470 sqft

Если у вас есть адрес, вам нужно будет рассчитать широту и долготу для этого адреса.Затем создайте маленький прямоугольник вокруг него для углов NW и SE.Затем создайте URL с этими числами.Затем вы получите список всех свойств (возможно, 1) для области.


Чтобы создать квадрат для поиска, вы можете использовать что-то вроде:

lat = 41.841966864112
long = -74.08774571289064
square_size = 0.001

params = {
    "nwlat" : lat + square_size,
    "nwlong" : long - square_size,
    "selat" : lat - square_size,
    "selong" : long + square_size,
    "Count" : 100,
    "pagenumber" : 1,
    "SiteID" : "68000000",
    "pageCount" : "10",
    "tab" : "map",
    "sh" : "true",
    "forcelatlong" : "true",
    "maplistings" : "1",
    "maplistcards" : "0",
    "sv" : "true",
    "sortorder" : "newest",
    "view" : "forsale",
}

square_sizeпотребуется изменить в зависимости от того, насколько точен ваш адрес.

...