【问题标题】:Web scraping with R over real estate ads使用 R 对房地产广告进行网络抓取
【发布时间】:2011-05-13 10:23:49
【问题描述】:

作为经济研究团队的实习生,我的任务是找到一种使用 R 自动收集房地产广告网站上特定数据的方法。

我假设涉及的包是XMLRCurl,但是我对他们的工作的理解非常有限。

这里是网站主页: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”),以及作为广告中显示的图片数量。我还想将文本导出为字符向量,稍后我将在该向量上执行文本挖掘分析。

我正在寻找任何帮助、指向教程或操作指南的链接,这些链接可以引导我走上前进的道路。

【问题讨论】:

标签: xml r web-scraping rcurl


【解决方案1】:

您可以使用 R 中的 XML 包来抓取这些数据。这是一段应该有所帮助的代码。

# 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,这样服务器就不会被请求轰炸。

告诉我这是如何工作的

【讨论】:

  • 我不知道该怎么感谢你。函数 get_ad_details 工作得很好,但函数 get_ad_links 卡在“paste(url_base, "?o=", page, "&zz=", 59000, sep = "")" 部分,并带有以下错误消息:“Erreur dans paste(url_base, "?o=", page, "&zz=", 59000, sep = "") : 不能将“闭包”类型强制转换为“字符”类型的向量”。我的猜测是这些函数调用了仅在之后创建的“页面”对象。
  • @alexis。 get_ad_links 函数包含不平衡的(,我现在修复了它。再试一次,它应该工作。让我知道:)
【解决方案2】:

这是一个相当大的问题,所以你需要把它分解成更小的问题,看看你会卡在哪些位上。

是检索网页的问题吗? (注意代理服务器问题。)或者是从它访问有用的数据位的棘手位? (您可能需要为此使用 xPath。)

查看 Rosetta 代码上的 web-scraping example 并浏览 these SO questions 了解更多信息。

【讨论】:

  • 嗯,我正在处理两个问题:首先,如何从广告中访问和提取有用的数据位以便可以利用它,然后如何使流程自动化以便使用它在整个网站上。我必须明确说明我对这些程序以及 R 都是新手。
猜你喜欢
  • 2021-02-22
  • 2023-03-27
  • 2023-03-09
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-28
  • 2022-11-09
相关资源
最近更新 更多