Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R并行化来抓取web内容_R_Asynchronous_Xpath_Web Scraping_Rcurl - Fatal编程技术网

使用R并行化来抓取web内容

使用R并行化来抓取web内容,r,asynchronous,xpath,web-scraping,rcurl,R,Asynchronous,Xpath,Web Scraping,Rcurl,我正试图使用前面提到的异步方法从web上抓取数据。下面是我想从中提取数据的URL。 我将URL存储在list.Rdata文件中。可以从以下位置下载链接: 首先,我加载前1000个URL: library(RCurl) library(rvest) library(XML) library(httr) library(reshape2) library(reshape) load("list.Rdata") list <- list[1:1000] un <- unlist(li

我正试图使用前面提到的异步方法从web上抓取数据。下面是我想从中提取数据的URL。 我将URL存储在list.Rdata文件中。可以从以下位置下载链接:


首先,我加载前1000个URL:

library(RCurl)  
library(rvest)
library(XML)
library(httr)
library(reshape2)
library(reshape)

load("list.Rdata")
list <- list[1:1000]
un <- unlist(list)
库(RCurl)
图书馆(rvest)
库(XML)
图书馆(httr)
图书馆(E2)
图书馆(重塑)
加载(“list.Rdata”)

列表我搜索了几分钟,在这里找到了答案(第二次回复)

你需要使用


txt谢谢您的回复。我尝试了卷曲部分,它只适用于小样本(url数<~100)。解析函数返回一个空列表。我相信这是因为对服务器的多个请求。我还尝试在代码执行后导航到服务器并手动单击一些URL。结果,验证码出现了,所以我认为服务器拒绝了如此繁重的请求。这可以解释为什么解析函数返回一个空表。对我来说,它适用于更长的URL向量。可能它某种程度上取决于服务器负载或其他因素。可能会尝试一个接一个地卷曲页面,在页面之间留出一些间隙(例如
Sys.sleep(1+runif(1)*4)
),但这样会花费更多的时间。你必须有耐心:)好吧,总共有140K个URL,所以如果我包括system.sleep(),处理这项任务将需要几天时间。我的“尝试”列表中的另一个解决方案是使用不同的代理服务器,这些服务器将按顺序更改。一些改进和稍微不同的方法解决了我的问题<代码>curl并行化web请求是不礼貌的,因为您正在攻击某人的服务器。谢谢您的回复。我注意到了这一点,这就是为什么我在寻找替代方案来避免这种行为。当每个url按照特定的时间跨度依次解析时,这种方法是可行的,尽管它既不高效也不耗时。任何关于如何使用并行化方法改进算法的想法都将受到高度赞赏。
get.asynch <- function(urls){
  txt <- getURIAsynchronous(urls)
    doc <- htmlParse(txt,asText=TRUE,encoding = "UTF-8")
    base <- xpathSApply(doc, "//table//tr//td",xmlValue)
    # Pavadinimas
    uab <- ifelse(length(xpathSApply(doc, "//head//title",xmlValue))==1,gsub(". Rekvizitai.lt","", xpathSApply(doc, "//head//title",xmlValue)), "-")
    # Imones kodas
    ik <- ifelse(is.na(agrep("Imones kodas",base))==TRUE, "-", base[agrep("Imones kodas",base)+1])
    # PVM kodas
    pk <- ifelse(is.na(match("PVM kodas",base))==TRUE, "-", base[match("PVM kodas",base)+1])
    # Vadovas
    vad <- ifelse(is.na(match("Vadovas",base))==TRUE, "-", base[match("Vadovas",base)+1])
    # Adresas
    ad <- ifelse(is.na(match("Adresas",base))==TRUE, "-", base[match("Adresas",base)+1])
    # Telefonas
    tel <- ifelse(is.na(match("Telefonas",base))==TRUE, "-", paste("http://rekvizitai.vz.lt", xpathSApply(doc, "//table//tr//td//@src")[1], sep =""))
    # Mobilusis
    mob <- ifelse(is.na(match("Mobilusis",base))==TRUE, "-", paste("http://rekvizitai.vz.lt", xpathSApply(doc, "//table//tr//td//@src")[2], sep =""))
    # Tinklalapis
    url <- ifelse(is.na(match("Tinklalapis",base))==TRUE, "-", gsub("\t","",base[match("Tinklalapis",base)+1]))
    # Skype
    sk <- ifelse(is.na(match("Skype",base))==TRUE, "-", base[match("Skype",base)+1])
    # Bankas
    bnk <- ifelse(is.na(match("Bankas",base))==TRUE, "-", base[match("Bankas",base)+1])
    # Atsiskaitomoji saskaita
    ats <- ifelse(is.na(match("Atsiskaitomoji saskaita",base))==TRUE, "-", base[match("Atsiskaitomoji saskaita",base)+1])
    # Darbo laikas
    dl <- ifelse(is.na(match("Darbo laikas",base))==TRUE, "-", base[match("Darbo laikas",base)+1])
    # Darbuotojai
    drb <- ifelse(is.na(match("Darbuotojai",base))==TRUE, "-", gsub("\\D","",base[match("Darbuotojai",base)+1]))
    # SD draudejo kodas
    sd <- ifelse(is.na(match("SD draudejo kodas",base))==TRUE, "-", base[match("SD draudejo kodas",base)+1]) 
    # Apyvarta (be PVM)
    apv <- ifelse(is.na(match("Apyvarta (be PVM)",base))==TRUE, "-", base[match("Apyvarta (be PVM)",base)+1])
    # Transportas
    trn <- ifelse(is.na(match("Transportas",base))==TRUE, "-", base[match("Transportas",base)+1])
    # Ivertinimas
    iv <- ifelse(length(xpathSApply(doc, "//span[@class='average']", xmlValue)) !=0, xpathSApply(doc, "//span[@class='average']", xmlValue),"-")
    # Vertintoju skaicius
    vert <- ifelse(length(xpathSApply(doc, "//span[@class='votes']", xmlValue)) !=0, xpathSApply(doc, "//span[@class='votes']", xmlValue),"-")
    # Veiklos sritys
    veikl <-xpathSApply(doc,"//div[@class='floatLeft about']//a | //div[@class='floatLeft about half']//a | //div[@class='about floatLeft']//a",
                        xmlValue)[1]
    # Lentele
    df <- cbind(uab, ik, pk, vad, ad, tel, mob, url, sk, bnk, ats, dl, drb, sd, apv, trn, iv, vert, veikl)
}
> system.time(table <- do.call(rbind,lapply(un,get.asynch)))
 Error in which(value == defs) : 
  argument "code" is missing, with no default Timing stopped at: 0.89 0.03 6.82
txts <- getURIAsynchronous(un, .opts=curlOptions(followlocation = TRUE))
parse <- function(txt) { 
    doc <- htmlParse(txt,asText=TRUE,encoding = "UTF-8")
    base <- xpathSApply(doc, "//table//tr//td",xmlValue)
    ...
}
table <- do.call(rbind, lapply(txts, parse))