xml - selectorgadget - Web scraping con R sobre anuncios inmobiliarios
selectorgadget firefox (2)
Como pasante en un equipo de investigación económica, me dieron la tarea de encontrar una forma de recopilar automáticamente datos específicos en un sitio web de anuncios inmobiliarios, utilizando R.
Supongo que los paquetes en cuestión son XML
y RCurl
, pero mi comprensión de su trabajo es muy limitada.
Aquí está la página principal del sitio web: http://www.leboncoin.fr/ventes_immobilieres/offres/nord_pas_de_calais/?f=a&th=1&zz=59000 Idealmente, me gustaría construir mi base de datos para que cada fila corresponda a una anuncio.
Aquí está el detalle de un anuncio: http://www.leboncoin.fr/ventes_immobilieres/197284216.htm?ca=17_s Mis variables son: el precio ("Prix"), la ciudad ("Ville"), la superficie ( "superficie"), el "GES, el" Classe énergie "y el número de habitaciones (" Pièces "), así como el número de imágenes que se muestran en el anuncio. También me gustaría exportar el texto en un vector de caracteres sobre que luego realizaría un análisis de minería de textos.
Estoy buscando ayuda, enlace a un tutorial o How-to que me daría una pista sobre el camino a seguir.
Puede usar el paquete XML
en R para raspar esta información. Aquí hay una pieza de código que debería ayudar.
# DEFINE UTILITY FUNCTIONS
# Function to Get Links to Ads by Page
get_ad_links = function(page){
require(XML)
# construct url to page
url_base = "http://www.leboncoin.fr/ventes_immobilieres/offres/nord_pas_de_calais/"
url = paste(url_base, "?o=", page, "&zz=", 59000, sep = "")
page = htmlTreeParse(url, useInternalNodes = T)
# extract links to ads on page
xp_exp = "//td/a[contains(@href, ''ventes_immobilieres'')]"
ad_links = xpathSApply(page, xp_exp, xmlGetAttr, "href")
return(ad_links)
}
# Function to Get Ad Details by Ad URL
get_ad_details = function(ad_url){
require(XML)
# parse ad url to html tree
doc = htmlTreeParse(ad_url, useInternalNodes = T)
# extract labels and values using xpath expression
labels = xpathSApply(doc, "//span[contains(@class, ''ad'')]/label", xmlValue)
values1 = xpathSApply(doc, "//span[contains(@class, ''ad'')]/strong", xmlValue)
values2 = xpathSApply(doc, "//span[contains(@class, ''ad'')]//a", xmlValue)
values = c(values1, values2)
# convert to data frame and add labels
mydf = as.data.frame(t(values))
names(mydf) = labels
return(mydf)
}
Aquí se explica cómo usaría estas funciones para extraer información en un marco de datos.
# grab ad links from page 1
ad_links = get_ad_links(page = 1)
# grab ad details for first 5 links from page 1
require(plyr)
ad_details = ldply(ad_links[1:5], get_ad_details, .progress = ''text'')
Esto devuelve la siguiente salida
Prix : Ville : Frais d''agence inclus : Type de bien : Pièces : Surface : Classe énergie : GES :
469 000 € 59000 Lille Oui Maison 8 250 m2 F (de 331 à 450) <NA>
469 000 € 59000 Lille Oui Maison 8 250 m2 F (de 331 à 450) <NA>
140 000 € 59000 Lille <NA> Appartement 2 50 m2 D (de 151 à 230) E (de 36 à 55)
140 000 € 59000 Lille <NA> Appartement 2 50 m2 D (de 151 à 230) E (de 36 à 55)
170 000 € 59000 Lille <NA> Appartement <NA> 50 m2 D (de 151 à 230) D (de 21 à 35)
Puede usar fácilmente la familia de funciones apply
para recorrer varias páginas para obtener detalles de todos los anuncios. Dos cosas para tener en cuenta. Una es la legalidad de raspado del sitio web. Dos es usar Sys.sleep
en su función de bucle para que los servidores no sean bombardeados con solicitudes.
Déjame saber cómo funciona esto
Esa es una gran pregunta, por lo que debes dividirla en otras más pequeñas y ver en qué partes te quedas atascado.
¿El problema es recuperar una página web? (Tenga cuidado con los problemas del servidor proxy.) ¿O es el poco difícil acceder a los bits de datos útiles de la misma? (Probablemente necesites usar xPath para esto).
Eche un vistazo al ejemplo de raspado web en el código Rosetta y explore estas preguntas SO para obtener más información.