Eliminando un sitio web desordenado con mucho javascript con Python

CorePress2024-01-25  83

Estaba intentando eliminar los enlaces de hogares de esta página:

https://www.sreality.cz/es/search/to-rent/apartments?page=2

Por ejemplo, para el primer apartamento me gustaría obtener el enlace con:

https://www.sreality.cz/es/detail/lease/flat/1+kt/plzen-jizni-predmesti-technicka/25873756#img=0&fullscreen=false

Sin embargo, el sitio web tiene bastante javascript. Al usar request.get() solo obtengo una porción no informativa de código html:


from requests import get

i = 2
url = f"https://www.sreality.cz/en/search/to-rent/apartments?page={i}"
response = get(url)

print(response.text)

-----------------------------

<!doctype html>
<html lang="{{ html.lang }}" ng-app="sreality" ng-controller="MainCtrl">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1.0,minimal-ui">

    <!--- Nastaveni meta pres JS a ne pres Angular, aby byla nastavena default hodnota pro agenty co nezvladaji PhantomJS --->
    <title ng:bind-template="{{metaSeo.title}}">Sreality.cz ⢠reality a nemovitosti z celé ÄR</title>
    <meta name="description" content="NejvÄtší nabídka nemovitostí v ÄR. Nabízíme byty, domy, novostavby, nebytové prostory, pozemky a další reality k prodeji i pronájmu. Sreality.cz">
    <meta property="og:title"       content="Sreality.cz ⢠reality a nemovitosti z celé ÄR">
    <meta property="og:type"        content="website">
    <meta property="og:image"       content="https://www.sreality.cz/img/sreality-logo-og.png">

-----------------------------

ETC ...

La pregunta es, por lo tanto, ¿cómo proceder con una simple actividad de scraping para sitios web de este tipo?

Gracias de antemano por la ayuda.

Pregunte en el sitio web si ofrecen una API para acceder a su información.

Software KIKO

28 de marzo de 2021 a las 9:48



------------------------------------

No creo que ese sitio web tenga una API pública, pero al observar las llamadas a la API desde la pestaña de red, puedo obtener los detalles de sus necesidades y convertirlo en un enlace; eche un vistazo al código siguiente.

Avísame si tienes alguna pregunta :)

import time
import requests
page=2
numberofresults=20
epochmiliseconds=round(time.time() * 1000)
paramsdict={
    "category_main_cb":1,
    "category_type_cb":2,
    "page":page,
    "per_page":numberofresults,
    "tms":epochmiliseconds

}
data=requests.get("https://www.sreality.cz/api/en/v2/estates",params=paramsdict).json()
for lead in data["_embedded"]["estates"]:
    locality=lead["seo"]["locality"]
    name=lead["name"]
    hash_id=lead["hash_id"]
    typedata=[s for s in name.split(" ") if "+" in s][0].replace("\u00a0"," ").split(" ")[0]
    print(f'https://www.sreality.cz/en/detail/lease/flat/{typedata}/{locality}/{hash_id}'))

Salida:

2

Muchas gracias. Funciona, pero lo estoy usando como ejercicio para mejorar el desguace web. Entonces, si pudiera responder las siguientes preguntas: 1) ¿cómo descubrió que debía usar 1) sreality.cz/api/en/v2/estates 2) ¿cómo descubrió que estos eran los parámetros a usar? Gracias de antemano

-into_r

28/03/2021 a las 18:18

1)antes de llamar al sitio web, abra la inspecciónt elemento y vaya a la pestaña de red y encontrará estas llamadas API una vez que se carga el sitio web, sería algo como esto prnt.sc/10yes0v (debe encontrar la solicitud correcta de donde provienen los datos) o puede usar una herramienta como fiddler (este es un mejor enfoque) para registrar el tráfico y ver la solicitud específica de donde provienen los datos. 2) con respecto a paramsdict, los primeros 4 parámetros son básicos comprensibles una vez y el quinto "tms" El parámetro no es más que la época actual en milisegundos.

- pb36

28/03/2021 a las 20:26



------------------------------------

Primero pregunte al sitio web si proporcionan alguna API para obtener la información deseada.

Tratar con javascript durante la solicitud de raspado únicamente no funcionará. Deberías optar solo por selenio o por scrapy en combinación con scrapy-selenium. Estos dos permiten la carga de javascript durante el scraping.

No dudes en preguntar si tienes alguna otra pregunta.

Respondido

28 de marzo de 2021 a las 9:55

Usamá Tariq

Usama Tariq

169

5

5 insignias de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare