2011-10-25 35 views
3

我想使用RCurl作为有礼貌的webcrawler从网站上下载数据。显然我需要数据进行科学研究。虽然我有权通过我的大学访问网站的内容,但网站的使用条款禁止使用网络爬行器。RCurl不检索网站的完整源文本 - 链接缺失?

我试图直接询问网站管理员的数据,但他们只回答了一个非常模糊的方式。无论如何,好像他们不会简单地发送底层数据库给我。

我现在想要做的是要求他们正式获得一次性权限,使用基于RCurl的R代码从他们的网站下载特定的纯文本内容,其中包括每次请求后延迟三秒执行。

,我想下载下班数据像这样的网站的地址:网站

我试图把它与RCurl编程,但我不能把它做的 http://plants.jstor.org/specimen/ID。 有几件事情变得复杂的东西:

  1. 人们只能访问网站,如果饼干被允许(我得到了工作在RCurl与cookiefile-参数)。

  2. Next-button只有在通过点击正常浏览器中的不同链接访问网站时,才会出现在源代码中。 在源代码中的下一页按钮进行编码包括

    <a href="/.../***ID of next site***">Next &gt; &gt; </a> 
    

    当一个人试图直接(通过它没有点击在之前相同的浏览器)访问该网站,它不会工作的表达式,带链接的行根本不在源代码中。

  3. 的位点的ID是字母组合和数字(如“goe0003746”或“cord00002203”),所以无法简单地写一个for循环中的R,每个尝试次数为1〜1,000,000 。

所以我的程序应该是模仿一个人通过下一步按钮点击所有网站,每次保存文本内容。

节省了网站的内容之后每一次,它应该点击下一步按钮(它必须是一个有礼貌履带)前等待三秒钟。我使用Sys.sleep函数在R中工作。

我也想过使用自动化程序,但似乎有很多这样的程序,我不知道使用哪一个。我也不完全是程序编写人员(除了一点R),所以我真的很感谢一个解决方案,它不包括Python,C++,PHP等编程。

任何想法将不胜感激!提前非常感谢您的意见和建议!

回答

1

我可能会错过你刚刚挂断的那一点,但它听起来像你几乎在那里。

看来你可以请求页面1上的cookie。然后解析搜索下一个站点ID的内容,然后通过构建具有下一个站点ID的URL来请求该页面。然后刮掉你想要的任何数据。

这听起来像你有代码几乎所有这一切。问题解析页面1是否获取下一步的ID?如果是这样,你应该制定一个可重复的例子,我怀疑你会得到一个非常快速的答案你的语法问题。

如果您在查看网站的功能时遇到困难,我建议您使用Firefox的Tamper Data插件。它会让你看到每次点击鼠标时发出的请求。我觉得这对于这类事情非常有用。

2

尝试不同的策略。

########################## 
#### 
####   Scrape http://plants.jstor.org/specimen/ 
####  Idea:: Gather links from http://plants.jstor.org/search?t=2076 
####   Then follow links: 
#### 
######################### 

library(RCurl) 
library(XML) 

### get search page:: 

cookie = 'cookiefile.txt' 
curl = getCurlHandle (cookiefile = cookie , 
    useragent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en - US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", 
    header = F, 
    verbose = TRUE, 
    netrc = TRUE, 
    maxredirs = as.integer(20), 
    followlocation = TRUE) 

querry.jstor <- getURL('http://plants.jstor.org/search?t=2076', curl = curl) 

## remove white spaces: 
querry.jstor2 <- gsub('\r','', gsub('\t','', gsub('\n','', querry.jstor))) 

### get links from search page 
    getLinks = function() { 
     links = character() 
     list(a = function(node, ...) { 
        links <<- c(links, xmlGetAttr(node, "href")) 
        node 
       }, 
      links = function()links) 
     } 

## retrieve links 
    querry.jstor.xml.parsed <- htmlTreeParse(querry.jstor2, useInt=T, handlers = h1) 

## cleanup links to keep only the one we want. 
    querry.jstor.links = NULL 
    querry.jstor.links <- c(querry.jstor.links, querry.jstor.xml.parsed$links()[-grep('http', querry.jstor.xml.parsed$links())]) ## remove all links starting with http 
    querry.jstor.links <- querry.jstor.links[-grep('search', querry.jstor.links)] ## remove all search links 
    querry.jstor.links <- querry.jstor.links[-grep('#', querry.jstor.links)] ## remove all # links 
    querry.jstor.links <- querry.jstor.links[-grep('javascript', querry.jstor.links)] ## remove all javascript links 
    querry.jstor.links <- querry.jstor.links[-grep('action', querry.jstor.links)] ## remove all action links 
    querry.jstor.links <- querry.jstor.links[-grep('page', querry.jstor.links)] ## remove all page links 

## number of results 
    jstor.article <- getNodeSet(htmlTreeParse(querry.jstor2, useInt=T), "//article") 
    NumOfRes <- strsplit(gsub(',', '', gsub(' ', '' ,xmlValue(jstor.article[[1]][[1]]))), split='')[[1]] 
    NumOfRes <- as.numeric(paste(NumOfRes[1:min(grep('R', NumOfRes))-1], collapse = '')) 

    for(i in 2:ceiling(NumOfRes/20)){ 
    querry.jstor <- getURL('http://plants.jstor.org/search?t=2076&p=',i, curl = curl) 
    ## remove white spaces: 
    querry.jstor2 <- gsub('\r','', gsub('\t','', gsub('\n','', querry.jstor))) 
    querry.jstor.xml.parsed <- htmlTreeParse(querry.jstor2, useInt=T, handlers = h1) 
    querry.jstor.links <- c(querry.jstor.links, querry.jstor.xml.parsed$links()[-grep('http', querry.jstor.xml.parsed$links())]) ## remove all links starting with http 
    querry.jstor.links <- querry.jstor.links[-grep('search', querry.jstor.links)] ## remove all search links 
    querry.jstor.links <- querry.jstor.links[-grep('#', querry.jstor.links)] ## remove all # links 
    querry.jstor.links <- querry.jstor.links[-grep('javascript', querry.jstor.links)] ## remove all javascript links 
    querry.jstor.links <- querry.jstor.links[-grep('action', querry.jstor.links)] ## remove all action links 
    querry.jstor.links <- querry.jstor.links[-grep('page', querry.jstor.links)] ## remove all page links 

    Sys.sleep(abs(rnorm(1, mean=3.0, sd=0.5))) 
    } 

    ## make directory for saving data: 
    dir.create('./jstorQuery/') 

    ## Now we have all the links, so we can retrieve all the info 
    for(j in 1:length(querry.jstor.links)){ 
    if(nchar(querry.jstor.links[j]) != 1){ 
     querry.jstor <- getURL('http://plants.jstor.org',querry.jstor.links[j], curl = curl) 
     ## remove white spaces: 
     querry.jstor2 <- gsub('\r','', gsub('\t','', gsub('\n','', querry.jstor))) 

     ## contruct name: 
     filename = querry.jstor.links[j][grep('/', querry.jstor.links[j])+1 : nchar(querry.jstor.links[j])] 

     ## save in directory: 
     write(querry.jstor2, file = paste('./jstorQuery/', filename, '.html', sep = '')) 

     Sys.sleep(abs(rnorm(1, mean=3.0, sd=0.5))) 
    } 
    }