Как получить данные о недвижимости с помощью Idealista API?

#python #oauth2

#python #oauth-2.0

Вопрос:

Я пытался использовать API веб-сайта Idealista (https://www.idealista.com /) для получения информации о данных о недвижимости.

Поскольку я не знаком с OAuth2, я пока не смог получить токен. Мне только что предоставили ключ api, секрет и некоторую базовую информацию о том, как смонтировать http-запрос.

Я был бы признателен за пример (желательно на Python) функционирования этого API или за более общую информацию о работе с OAuth2 и Python.

Ответ №1:

После нескольких дней исследований я придумал базовый код python для извлечения данных о недвижимости из Idealista API.

 def get_oauth_token():
http_obj = Http()
url = "https://api.idealista.com/oauth/token"
apikey= urllib.parse.quote_plus('Provided_API_key')
secret= urllib.parse.quote_plus('Provided_API_secret')
auth = base64.encode(apikey   ':'   secret)
body = {'grant_type':'client_credentials'}
headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8','Authorization' : 'Basic '   auth}
resp, content = http_obj.request(url,method='POST',headers=headers, body=urllib.parse.urlencode(body))
return content
  

Эта функция вернет JSON с токеном OAuth2 и временем сеанса в секундах. После этого запросить API было бы так просто, как:

 def search_api(token):
http_obj = Http()
url = "http://api.idealista.com/3.5/es/search?center=40.42938099999995,-3.7097526269835726amp;country=esamp;maxItems=50amp;numPage=1amp;distance=452amp;propertyType=bedroomsamp;operation=rent"
headers = {'Authorization' : 'Bearer '   token}
resp, content = http_obj.request(url,method='POST',headers=headers)
return content
  

На этот раз мы найдем в переменной содержимого данные, которые мы искали, опять же в виде JSON.

Комментарии:

1. круто, http_obj — это экземпляр чего? какие библиотеки необходимо импортировать? Спасибо!

2. Привет, @Nabla, прошло некоторое время, но я думаю, что использовал httplib2. Однако вы можете сделать то же самое с другими фреймворками, такими как запросы в python 3.

3. Привет, хороший момент. Где вы нашли документы для этого?

4. Тогда я получил несколько документов, отправленных из api@idealista.com после запроса доступа.

Ответ №2:

Это не может быть помечено как правильный ответ, поскольку

 auth = base64.encode(apikey   ':'   secret)
body = {'grant_type':'client_credentials'}
headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8','Authorization' : 'Basic '   auth}
  

Выдаст вам TypeError:

 can only concatenate str (not "bytes") to str 
  

Поскольку base64encode возвращает объект байтового типа…

Это правда, что Idealista API очень ограничен в документации, но я думаю, что это лучший подход, поскольку я не использую ненужные библиотеки (только собственные):

 #first request
message = API_KEY   ":"   SECRET
auth = "Basic "   base64.b64encode(message.encode("ascii")).decode("ascii")

headers_dic = {"Authorization" : auth, 
               "Content-Type" : "application/x-www-form-urlencoded;charset=UTF-8"}

params_dic = {"grant_type" : "client_credentials",
              "scope" : "read"}



r = requests.post("https://api.idealista.com/oauth/token", 
                  headers = headers_dic, 
                  params = params_dic)
  

Это работает безупречно только с запросами python и модулем base64…

с уважением

Ответ №3:

Это мой код, улучшающий # 3 … это работает нормально! для меня!!!! введите только свой apikey и свой пароль (секретный)…

 import pandas as pd
import json
import urllib
import requests as rq
import base64

def get_oauth_token():
    url = "https://api.idealista.com/oauth/token"    
    apikey= 'your_api_key' #sent by idealista
    secret= 'your_password'  #sent by idealista
    auth = base64.b64encode(apikey   ':'   secret)
    headers = {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' ,'Authorization' : 'Basic '   auth}
    params = urllib.urlencode({'grant_type':'client_credentials'})
    content = rq.post(url,headers = headers, params=params)
    bearer_token = json.loads(content.text)['access_token']
    return bearer_token

def search_api(token, url):  
    headers = {'Content-Type': 'Content-Type: multipart/form-data;', 'Authorization' : 'Bearer '   token}
    content = rq.post(url, headers = headers)
    result = json.loads(content.text)['access_token']
    return result

country = 'es' #values: es, it, pt
locale = 'es' #values: es, it, pt, en, ca
language = 'es' #
max_items = '50'
operation = 'sale' 
property_type = 'homes'
order = 'priceDown' 
center = '40.4167,-3.70325' 
distance = '60000'
sort = 'desc'
bankOffer = 'false'

df_tot = pd.DataFrame()
limit = 10

for i in range(1,limit):
    url = ('https://api.idealista.com/3.5/' country '/search?operation=' operation #"amp;locale=" locale 
           'amp;maxItems=' max_items 
           'amp;order=' order 
           'amp;center=' center 
           'amp;distance=' distance 
           'amp;propertyType=' property_type 
           'amp;sort=' sort  
           'amp;numPage=%s' 
           'amp;language=' language) %(i)  
    a = search_api(get_oauth_token(), url)
    df = pd.DataFrame.from_dict(a['elementList'])
    df_tot = pd.concat([df_tot,df])

df_tot = df_tot.reset_index()
  

Комментарии:

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

2. Привет @Ivan. Можете ли вы фильтровать результаты для одного агента реального состояния с помощью этого API?

Ответ №4:

Я нашел несколько ошибок. По крайней мере, я не могу его запустить. Я считаю, что я улучшил это:

 import pandas as pd
import json
import urllib
import requests as rq
import base64

def get_oauth_token(): 

    url = "https://api.idealista.com/oauth/token"    

    apikey= 'your_api_key' #sent by idealist
    secret= 'your_password' #sent by idealista
    apikey_secret = apikey   ':'   secret
    auth = str(base64.b64encode(bytes(apikey_secret, 'utf-8')))[2:][:-1]

    headers = {'Authorization' : 'Basic '   auth,'Content-Type': 'application/x-www-form- 
    urlencoded;charset=UTF-8'}
    params = urllib.parse.urlencode({'grant_type':'client_credentials'}) #,'scope':'read'
    content = rq.post(url,headers = headers, params=params)
    bearer_token = json.loads(content.text)['access_token']

    return bearer_token


def search_api(token, URL):  
    headers = {'Content-Type': 'Content-Type: multipart/form-data;', 'Authorization' : 'Bearer '   token}
    content = rq.post(url, headers = headers)
    result = json.loads(content.text)

    return result