toniprada / wallapopy

A Python client for Wallapop
21 stars 4 forks source link

Faltan resultados en search #1

Open fluproject opened 7 years ago

fluproject commented 7 years ago

Hola,

Gracias por el aporte Toni, muy interesante. Solo comentar que en la búsqueda de productos sólo se devuelven algunos de ellos (los más próximos según está montada la query), porque la herramienta no contempla la paginación, y no es capaz de llegar a recopilar todos los resultados.

Las APPs de Wallapop utilizan otro API diferente que la de Wallapopy, por ejemplo, esta petición devolvería la primera página de una búsqueda de los términos "ferrari f40": https://es.wallapop.com/rest/items?minPrice=&maxPrice=&dist=0_10000&order=distance-asc&kws=ferrari+f40&lat=40.47718237558977&lng=-3.686857223510742

Saludos!

toniprada commented 7 years ago

¡Buenas!

Tienes toda la razón y en la búsqueda faltan muchos parámetros. Lo implementaré y actualizaré.

Gracias!

salvacarrion commented 6 years ago

Hola,

Antes que nada, gracias por la API. Esta tarde he intentado añadir más filtros y opciones de paginación a la función search pero no he encontrado una forma limpia de hacerlo, por si me podías orientar o decir cómo sacaste la documentación de su API (http://pro2.wallapop.com/shnm-portlet/api/v1).

Lo primero que he hecho es ir a la página web para analizar su API Rest, pero parece que no coinciden al 100% con tu API, y dan algunos problemas.

Ej. GET:

GET /rest/items?kws=&_p=0&catIds=&searchNextPage=itemsCount=80&start=80&bumpCollectionType=0&densityType=20&step=0&orderType=asc&keywords=&latitude=39.46868&orderBy=distance&longitude=-0.37691 HTTP/1.1
    Host: es.wallapop.com
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0
    Accept: */*
    Accept-Language: en-US,en;q=0.8,es-ES;q=0.5,es;q=0.3
    Accept-Encoding: gzip, deflate
    Referer: https://es.wallapop.com/search?kws=&catIds=&verticalId=
    X-Requested-With: XMLHttpRequest
    Cookie: hideCookieMessage=true; userHasLogged=%7B%22hasLogged%22%3Afalse%2C%22times%22%3A2%7D; device_access_token_id=8047940e1707df337ad8dcff21a0598f; _ga=GA1.2.277003756.1525456570; _gid=GA1.2.180095070.1525456570; G_ENABLED_IDPS=google; __gads=ID=72f0aaff5a44463c:T=1525456575:S=ALNI_MZ0fp6uIwUf6Dnhs1UN98ncoGpZ4w; bLat=39.4656217; bLng=-0.34386469999999997; session_id=46ee17fc-486c-45e4-a19f-3de05ecf24f7; searchLat=39.46868; searchLng=-0.37691; searchPosName=Espa%C3%B1a%2C%20Comunitat%20Valenciana%2C%20Val%C3%A8ncia; _gat=1
    Connection: close

Posteriormente he decompilado el APK, pero no veo la forma de paginar:

package com.rewallapop.api.model;

public final class SearchFiltersApiKey {
    public static final String CAR_BODY_TYPE = "body_type";
    public static final String CAR_BRAND = "brand";
    public static final String CAR_CONDITION = "condition";
    public static final String CAR_ENGINE = "engine";
    public static final String CAR_GEAR_BOX = "gearbox";
    public static final String CAR_KM = "km";
    public static final String CAR_MODEL = "model";
    public static final String CAR_SEATS = "num_seats";
    public static final String CAR_YEAR = "year";
    public static final String COLLECTION_ID = "collectionId";
    public static final String DISTANCE_SEGMENTS = "distanceSegments";
    public static final String EXCHANGE = "exchange";
    public static final String FILTER_CATEGORY_IDS = "categoryIds";
    public static final String FILTER_FREE_TEXT = "keywords";
    public static final String FILTER_LATITUDE = "latitude";
    public static final String FILTER_LONGITUDE = "longitude";
    public static final String ORDER_BY = "orderBy";
    public static final String ORDER_TYPE = "orderType";
    public static final String PUBLISH_DATE = "timeFilter";
    public static final String SALE_PRICE_SEGMENTS = "salePriceSegments";
    public static final String SEARCH_VERTICAL_ID = "vertical_id";
    public static final String SELECTION_ID = "selectionId";
    public static final String SELLER_TYPE = "professional";
    public static final String SHIPPING = "shipping";
    public static final String URGENT = "urgentItems";
    public static final String WARRANTY = "warranty";

    private SearchFiltersApiKey() {
    }
}
salvacarrion commented 6 years ago

Dejo aquí la forma de hacer peticiones al API Rest por si alguien la necesita. Hay parámetros que se pasan a través de las cookies. Por ahora he añadido sólo la localización, pero si tenéis problemas incluid toda la cookie y editar lo que necesitéis. (Lo mismo con los headers)

URL de la API Rest:

BASE_URL_v2 = 'https://es.wallapop.com/rest/items'

Filtros de Wallapop:

filters = {
            '_p': 0,  # Page (iterar sobre este número)
            'kws': 'android',  # query+a+realizar

            # 'distanceSegments': None,  # {min}_{max}
            'dist': 100, # Distance <400

            # 'salePriceSegments': None,  # {min.xx}_{max.xx}
            'minPrice': 300.00,  # 8.00
            'maxPrice': None,  # 200.00

            # 'markAsIds': None,  #  "shipping,exchange,urgentItems" (checkbox, use commas)
            # 'publishDate': 24,  # any/30/7/24. (cualquiera, 30dias, 7 dias, 24h)

            # 'order': None, # {by}-{type}  creationDate-des, salePrice-des, salePrice-asc, distance-asc
            'orderBy': 'distance',  # creationDate/salePrice/distance
            'orderType': 'asc',  # asc/des

            'latitude': 39.46868,
            'longitude': -0.37691,
    }

Definir cookie y headers: (Si no pones la localización en la cookie, te colocan en otro sitio)

    cookie = 'searchLat={}; searchLng={};'.format(filters['latitude'], filters['longitude'])
    headers = {'Host': 'es.wallapop.com',
               'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Language': 'en-US,en;q=0.8,es-ES;q=0.5,es;q=0.3',
               'Accept-Encoding': 'gzip, deflate',
               'cookie': cookie}

Añadir parametros a la url: _(clean_params elimina los Nonedel dictionario)_

    url = '%s?%s' % (BASE_URL_v2, urlencode(clean_params(filters)))

Realizar petición:

    r = requests.get(url, headers=headers).json()
fluproject commented 6 years ago

Gracias Toni,

Eso te iba a decir, pero te has adelantado. Hace tiempo que no toco este tema, pero recordaba que había que setear un parámetro que se recogía y que hacía referencia a un token de paginación.

Saludos!

De: Salva notifications@github.com Enviado el: sábado, 5 de mayo de 2018 14:36 Para: toniprada/wallapopy wallapopy@noreply.github.com CC: Flu Project info@flu-project.com; Author author@noreply.github.com Asunto: Re: [toniprada/wallapopy] Faltan resultados en search (#1)

Dejo aquí la forma de hacer peticiones al API Rest por si alguien la necesita. Hay parámetros que se pasan a través de las cookies. Por ahora he añadido sólo la localización, pero si tenéis problemas incluid toda la cookie y editar lo que necesitéis. (Lo mismo con los headers)

URL de la API Rest:

BASE_URL_v2 = 'https://es.wallapop.com/rest/items'

Filtros de Wallapop:

filters = { '_p': 0, # Page (iterar sobre este número) 'kws': 'android', # query+a+realizar

        # 'distanceSegments': None,  # {min}_{max}
        'dist': 100, # Distance <400

        # 'salePriceSegments': None,  # {min.xx}_{max.xx}
        'minPrice': 300.00,  # 8.00
        'maxPrice': None,  # 200.00

        # 'markAsIds': None,  #  "shipping,exchange,urgentItems" (checkbox, use commas)
        # 'publishDate': 24,  # any/30/7/24. (cualquiera, 30dias, 7 dias, 24h)

        # 'order': None, # {by}-{type}  creationDate-des, salePrice-des, salePrice-asc, distance-asc
        'orderBy': 'distance',  # creationDate/salePrice/distance
        'orderType': 'asc',  # asc/des

        'latitude': 39.46868,
        'longitude': -0.37691,
}

Definir cookie y headers: (Si no pones la localización en la cookie, te colocan en otro sitio)

cookie = 'searchLat={}; searchLng={};'.format(filters['latitude'], filters['longitude'])
headers = {'Host': 'es.wallapop.com',
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0',
           'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'Accept-Language': 'en-US,en;q=0.8,es-ES;q=0.5,es;q=0.3',
           'Accept-Encoding': 'gzip, deflate',
           'cookie': cookie}

Añadir parametros a la url: (clean_params elimina los Nonedel dictionario)

url = '%s?%s' % (BASE_URL_v2, urlencode(clean_params(filters)))

Realizar petición:

r = requests.get(url, headers=headers).json()

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/toniprada/wallapopy/issues/1#issuecomment-386802675 , or mute the thread https://github.com/notifications/unsubscribe-auth/AXWWErls3m0g8F6iFMnVBdRvW_aa-M8Qks5tvZy6gaJpZM4OlI6v . https://github.com/notifications/beacon/AXWWEop46Xr6_03DwEmGR6eJyBCqPEr8ks5tvZy6gaJpZM4OlI6v.gif

namelivia commented 5 years ago

Buenas! Me dio curiosidad el tema y estoy implementando un cliente igual en PHP, ahora mismo y para la versión primera pensaba hacer poco más que traducir tus métodos a PHP que es lo que ya tengo hecho. Pero una vez que acabe puedo tratar de resolver el problema, y si lo logro traducirlo a Python y abrir un PR.

toniprada commented 5 years ago

¡Buenas a todos! Perdón por no haber contestado antes. Este proyecto lo empece ya que he basado mi PFC en datos de Wallapop, pero con el día a día no he podido mantenerlo. Ahora mismo sigo sin verme con tiempo porque otros proyectos me están comiendo, pero intentare ayudar en la medida de lo posible.

El endpoint que yo he usado aquí no es el de las webapps sino el de la aplicación de Android, observado viendo el trafico entre la app y el servidor. Es relativamente fácil, es levantar mitm-proxy, conectar un dispositivo, y usar la app.

alglez commented 5 years ago

Dado que se tocan varios temas en este "issue" y en concreto los resultados de la API, comentar que la dirección de la API ya no funciona; probablemente porque hace poco reescribieron el código de la web así que es probable que estén usando otra dirección para la API o que directamente la hayan modificado.

No tengo tiempo ahora para revisar si la api es accesible desde otra dirección, pero lo quería comentar por si alguien tiene tiempo de echarle un ojo.

Edito: me acabo de dar cuenta que me refería a la dirección de la API que @fluproject nombraba en su mensaje, sin embargo esta parece estar disponible (http://pro2.wallapop.com/shnm-portlet/api/v1/user.json/40000000?)