Соскоб с R по объявлениям о недвижимости - PullRequest
8 голосов
/ 13 мая 2011

Как стажер в группе по экономическим исследованиям, мне было поручено найти способ автоматически собирать конкретные данные на сайте объявлений о недвижимости, используя R.

Я предполагаю, что соответствующие пакеты XML и RCurl, но мое понимание их работы очень ограничено.

Вот главная страница веб-сайта: http://www.leboncoin.fr/ventes_immobilieres/offres/nord_pas_de_calais/?f=a&th=1&zz=59000 В идеале я хотел бы построить свою базу данных так, чтобы каждая строка соответствовала объявлению.

Вот детали объявления: http://www.leboncoin.fr/ventes_immobilieres/197284216.htm?ca=17_s Мои переменные: цена ("Prix"), город ("Ville"), поверхность ("поверхность"), "GES, "Classe énergie" и количество комнат ("Pièces"), а также количество картинок, показанных в объявлении. Я также хотел бы экспортировать текст в символьный вектор, над которым я буду выполнять анализ текстаанализ позже.

Я ищу любую помощь, ссылку на учебное пособие или практические рекомендации, которые позволили бы мне определить путь, по которому нужно идти.

Ответы [ 2 ]

12 голосов
/ 17 мая 2011

Вы можете использовать пакет XML в R для очистки этих данных.Вот фрагмент кода, который должен помочь.

# 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)
}

Вот как вы могли бы использовать эти функции для извлечения информации во фрейм данных.

# 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')

Это возвращает следующий вывод

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)

Вы можете легко использовать семейство функций apply для циклического перебора нескольких страниц, чтобы получить подробную информацию обо всех объявлениях.Две вещи, о которых нужно помнить.Одним из них является законность соскоб с сайта.Второе - использовать Sys.sleep в функции зацикливания, чтобы серверы не подвергались бомбардировке запросов.

Дайте мне знать, как это работает

4 голосов
/ 13 мая 2011

Это довольно большой вопрос, поэтому вам нужно разбить его на более мелкие и посмотреть, на каких битах вы застряли.

Проблема с поиском веб-страницы? (Остерегайтесь проблем с прокси-сервером.) Или хитрый бит получает доступ к полезным битам данных с него? (Вам, вероятно, понадобится использовать xPath для этого.)

Взгляните на пример очистки веб-страниц кода Rosetta и просмотрите эти вопросы SO для получения дополнительной информации.

...