Рубрики
Без рубрики

Scrappeando Propiedades con Python

Hace un tiempo estaba buscando destamentamento para alquilar y me froustaraba вход Periódicamente a las … Tagged с Python, Telegram, Sprapping.

Hace un tiempo estaba buscando destamento para alquilar y me frustraba вход Periódicamente a las páginas de propiedades sólo par

Buscar un Destanatement es Una tarea tediosa y Estresante, Por Eso, Se me ocurrió dar vuelta el plessiona y transformarlo en algo diverertido: crear un bot que busque las propiedades y avise vía cath cuando aparece una nueva.

El Código Es Relativamente Sencillo , Menos de 100 Líneas de Python, Pero de todos Modos Vamos A Seguirlo Paso Por Paso Para Ver ver ver ver ver ver ver ver ues lo que hace.

Urls y Main

Primero notamos que tenemos un установить con las urls de búsqueda:

urls = {
    "https://www.argenprop.com/departamento-alquiler-barrio-chacarita-hasta-25000-pesos-orden-masnuevos",
    "https://www.zonaprop.com.ar/departamento-alquiler-villa-crespo-con-terraza-orden-publicado-descendente.html",
}

ESTAS SON SMASTEMEMEME URLS CON RESTADADOS DE BUSQUEDA DE LOS SITIOS SOPORTADOS POR NUESTRO SCRIPT. En ese caso destamentos en chacarita hasta 25.000 pesos y en villa crespo con terraza (sin límite de precio). Ambas en Distintos Portales de Búsqueda. Es

La Función Principal ( Main ) Определите Лос -Пасос Сегир:

for url in urls: # 1
  res = requests.get(url) # 2
  ads = list(extract_ads(url, res.text)) # 3
  seen, unseen = split_seen_and_unseen(ads) # 4

  print("{} seen, {} unseen".format(len(seen), len(unseen)))

  for u in unseen: # 5
    notify(u)

  mark_as_seen(unseen) # 6
  1. Para cada una de de nuestras urls defineidas previamente
  2. IR A Buscar Los ResultAdos
  3. Extran Los Links de Los Ads
  4. Dividir Links En Vistos y Нет перспектив
  5. Para los no vistos, notificar por mensaje
  6. Marcar Los no Vistos Como Vistos

De acá nos enfocamos en las partes más interesantes:

Extraer Links de los реклама

Cada Página Tiene Su Estructura Propia, Para Eso Definimos la DataClass Паризер :

@dataclass
class Parser:
    website: str
    link_regex: str

    def extract_links(self, contents: str):
        soup = BeautifulSoup(contents, "lxml")
        ads = soup.select(self.link_regex)
        for ad in ads:
            href = ad["href"]
            _id = sha1(href.encode("utf-8")).hexdigest()
            yield {"id": _id, "url": "{}{}".format(self.website, href)}


parsers = [
    Parser(website="https://www.zonaprop.com.ar", link_regex="a.go-to-posting"),
    Parser(website="https://www.argenprop.com", link_regex="div.listing__items div.listing__item a"),
    Parser(website="https://inmuebles.mercadolibre.com.ar", link_regex="li.results-item .rowItem.item a"),
]

Como Vemos, Cada Паризер Actúa sobre un dominio er contry de los que soportamos, porque cada página tiene su Estructura de html propia.

Con BeautifulSoup Podemos usar css Queries para movernos por El Markup y obtener los links de los avisos que nos interesan.

Una Vez ExtraIdos Los Devolvemos junto con un id Que Generamos hasheando la url del aviso (Esto será útil para marcar los ya vistos).

Recordar Links Vistos

El bot no sería muy útil si reportara todo el tiempo lo mismo, deberíamos buscar una forma de “recordar” qué avisos ya envíamos.

Una forma sencilla es un archivo de texto ise.txt con los id S de los Avisos Reportados:

def split_seen_and_unseen(ads):
    history = get_history()
    seen = [a for a in ads if a["id"] in history]
    unseen = [a for a in ads if a["id"] not in history]
    return seen, unseen


def get_history():
    try:
        with open("seen.txt", "r") as f:
            return {l.rstrip() for l in f.readlines()}
    except:
        return set()

También Agregamos una función que nos ormita distinging los que ya mandamos ( vise ) de los nuevos ( невидимый ).

Уведомления

def notify(ad):
    bot = "YOUR_BOT_ID"
    room = "YOUR_CHAT_ROOM_ID"
    url = "https://api.telegram.org/bot{}/sendMessage?chat_id={}&text={}".format(bot, room, ad["url"])
    r = requests.get(url)

Luego, USANDO UN SIMPLE DEH HTTP POSTEAMOS LA URL DEL AVISO A UN GRUPO DE Телеграмма Анкет

Gracias a la función de “preview” de telegram, los ads se muestran con una imagen de la propiedad:

Por último Sólo nos Queda Agregar Los Avisos Notificados A ise.txt y Listo.

Хостинг

Ahora Sólo necesitamos una máquina donde correrlo periódicamente. Por suerte aws tiene un бесплатный уровень que nos brinda una máquina básica por un mes, gratis.

Si Bien La Virtual No Es Muy Poderosa, Para Este Simple Script Basta y Sobra. Yo lo tengo corriendo con un cronjob que lo ejecuta cada 5 minutos:

# m h  dom mon dow   command
*/5 * * * * /home/ubuntu/propfinder/search_props.sh

Вывод

Con 100 Líneas de сценарий Pudimos hacer un scrapper multi-sitio, que nos envía propiedades por Chat Como Máxio A 5 Minutos de Ser Publicadas.

Muco Más Diverertido (Y Menos resprustrante) que meterse periódicamente a los distintos sitios a ver Si Hay Alguna Novedad.

Оригинал: “https://dev.to/fernandezpablo/scrappeando-propiedades-con-python-4cp8”