作为数据科学团队的实习生,我的任务是找到一种方法,使用R来自动收集房地产广告网站上的特定数据。
感谢这篇文章(Web scraping with R over real estate ads)给出的答案以及代码中的一些变化,我设法完成了我想要的任务。但我的问题是我不能刮掉电话号码。我尝试了几件事,但没有成功。
我想完成与上一篇文章完全相同的操作,但将电话号码作为新变量。
以下是广告的详细信息:https://www.leboncoin.fr/ventes_immobilieres/1074663461.htm?ca=13_s我的变量是:价格(“Prix”),城市(“Ville”),表面(“表面”),“GES,” Classeénergie“,房间数量(”Pièces“)和电话号码,以及广告中显示的图片数量。
我注意到答案中给出的代码不再有效,因为在提出问题时,网站没有安全(http)。今天它包括开头'https'。这就是我在代码中做了一些更改的原因。
我是R的初学者,任何帮助都会非常感激(抱歉我的英语不好)。
ROUTE_NAME
答案 0 :(得分:2)
这里的问题是,在显示此号码之前,必须单击一个按钮后面的电话号码。这样做是为了防止网络抓取工具获取这些电话号码。
无法使用rvest
点击网站。但是,您可以使用RSelenium
查看另一种方法。此方法使用web浏览器docker,它可以像普通浏览器一样工作,但可以由R命令控制。
答案 1 :(得分:1)
最后,我设法找到了使用Rselenium的解决方案,这里是函数get_phone_number,它给出了一个数据框,其中包含广告链接作为ID以及我与之前创建的数据框匹配的电话号码。
但是我遇到了一个新问题,实际上当我检索4或5个电话号码时,我的IP地址被阻止了。此外,当我使用不在法国的VPN时,点击它后电话号码不会出现。
那么,如何在每次点击或任何其他想法后动态更改我的IP地址(仅限法国)?
#!/bin/bash
FILE="$1"
MATCH="$2"
# Uses read -t, kill after timeout
#tail -f "$F" | grep "$MATCH" | (read -t 1 a ; kill $$)
# Uses gawk read timeout ability (not available in awk)
#tail -f "$F" | grep "$MATCH" | gawk "BEGIN {PROCINFO[\"/dev/stdin\", \"READ_TIMEOUT\"] = 1000;getline < \"/dev/stdin\"; system(\"kill $$\")}"
# Uses perl & alarm signal
#tail -f "$F" | grep "$MATCH" | perl -e "\$SIG{ALRM} = sub { `kill $$`;exit; };alarm(1);<>;"
答案 2 :(得分:0)
这就是我在编程的早期所想到的。
现在来看,我畏缩不前,缺乏评论。但这行得通。 请让我知道它是否有效吗?我是StackOverflow的新手。
Shownumbers <- function(k){
for (i in k:k){
url <- paste0("https://www.yellowpages.co.za/search?what=travel&pg=")
webpage_new <- read_html(url)
show_html <- html_nodes(webpage_new , ".idShowNumber")
show <- html_text(show_html)
show <- as.character(sub(paste("\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t") , "" ,
show))
show <- as.character(replace(show , as.character("\\") , ""))
show_base <- as.data.frame(show)
show_final <- show_base
paste0(i)
}
paste0(url,k)
}
Shownumbers(1)
for(d in 1:135){
url <- paste0("https://www.yellowpages.co.za/search?what=travel&pg=")
if(d ==1){
Shownumbers(d)
webpage_new <- read_html(url)
no_html <- html_nodes(webpage_new , ".yext-phone")
no <- html_text(no_html)
no <- as.character(sub(paste("\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t") , "" , no))
no <- as.character(replace(no , as.character("\\") , ""))
no_base <- as.data.frame(no)
no_final <- no_base
} else {
Shownumbers(d)
webpage_new <- paste0(url,d)
no_read <- read_html(webpage_new)
no_html <- html_nodes(no_read , ".yext-phone")
no <- html_text(no_html)
no <- as.character(sub(paste("\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t") , "" , no))
no <- as.character(replace(no , as.character("\\") , ""))
no_base <- as.data.frame(no)
no_final <- rbind(no_final,no_base)
}
paste0(d)
}
no_final <- unique(no_final)