使用R进行网络抓取(Scrape Hidden Number“点击此处显示数字”)

时间:2017-08-25 11:28:30

标签: r rvest

作为数据科学团队的实习生,我的任务是找到一种方法,使用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

3 个答案:

答案 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)