我想使用 RCurl 作为礼貌的网络爬虫从网站下载数据。 显然我需要科学研究的数据。虽然我有权通过我的大学访问该网站的内容,但该网站的使用条款禁止使用网络爬虫。
我试图直接向网站管理员询问数据,但他们只以非常含糊的方式回答。好吧,无论如何,他们似乎不会简单地将基础数据库发送给我。
我现在想做的是正式要求他们使用基于 RCurl 的 R 代码从他们的站点下载特定的纯文本内容的一次性许可,其中包括在每个请求执行后延迟三秒.
我想从这样的工作中下载数据的站点地址: http://plants.jstor.org/specimen/ 站点 ID
我尝试使用 RCurl 对其进行编程,但无法完成。 一些事情使事情复杂化:
只有在允许 cookies 的情况下才能访问该网站(我在 RCurl 中使用 cookiefile 参数实现了这一点)。
Next-button 只有在用户通过在普通浏览器中点击不同链接实际访问网站时才会出现在源代码中。 在源代码中,下一步按钮使用包含
的表达式进行编码<a href="/.../***ID of next site***">Next > > </a>
当一个人试图直接访问该网站时(之前没有在同一个浏览器中点击过它),它不会工作,带有链接的行根本不在源代码中。
<网站的 ID 是字母和数字的组合(例如“goe0003746”或“cord00002203”),所以我不能简单地在 R 中编写一个 for 循环来尝试从 1 到 1,000,000 的每个数字。
所以我的程序应该模仿一个人通过下一步按钮点击所有站点,每次都保存文本内容。
每次保存站点内容后,它应该等待三秒钟,然后再点击下一步按钮(它必须是一个礼貌的爬虫)。我也使用 Sys.sleep 函数在 R 中实现了这一点。
我也想过用一个自动化的程序,但是好像有很多这样的程序,我不知道该用哪个。
我也不是真正的程序编写人员(除了一点点 R),所以我非常感谢不包括使用 Python、C++、PHP 等语言进行编程的解决方案。
如有任何想法,我们将不胜感激!提前非常感谢您的意见和建议!!
最佳答案
尝试不同的策略。
##########################
####
#### 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)))
}
}
关于RCurl 不检索网站的完整源文本 - 链接丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7890511/