#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