作为一名经济研究团队的实习生,我的任务是找到一种方法,使用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“)以及作为广告中显示的图片数量。我还希望将文本导出为字符向量,稍后我将对其进行文本挖掘分析。
我正在寻找任何帮助,链接到教程或操作方法,这将使我领先一条路径。
答案 0 :(得分:12)
您可以使用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
,这样服务器就不会被请求轰炸。
让我知道这是如何运作的
答案 1 :(得分:4)
这是一个非常大的问题,所以你需要把它分解成更小的问题,看看你遇到了哪些问题。
检索网页有问题吗? (注意代理服务器问题。)或者是从它那里访问有用的数据位的棘手位? (你可能需要使用xPath。)
查看有关Rosetta代码的web-scraping example并浏览these SO questions以获取更多信息。