RCurl 不检索网站的完整源文本 - 链接丢失?

标签 r web-crawler web-scraping rcurl

我想使用 RCurl 作为礼貌的网络爬虫从网站下载数据。 显然我需要科学研究的数据。虽然我有权通过我的大学访问该网站的内容,但该网站的使用条款禁止使用网络爬虫。

我试图直接向网站管理员询问数据,但他们只以非常含糊的方式回答。好吧,无论如何,他们似乎不会简单地将基础数据库发送给我。

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

我想从这样的工作中下载数据的站点地址: http://plants.jstor.org/specimen/ 站点 ID

我尝试使用 RCurl 对其进行编程,但无法完成。 一些事情使事情复杂化:

  1. 只有在允许 cookies 的情况下才能访问该网站(我在 RCurl 中使用 cookiefile 参数实现了这一点)。

  2. Next-button 只有在用户通过在普通浏览器中点击不同链接实际访问网站时才会出现在源代码中。 在源代码中,下一步按钮使用包含

    的表达式进行编码
    <a href="/.../***ID of next site***">Next &gt; &gt; </a>
    

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

    <
  3. 网站的 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/

相关文章:

r - 如何在 R 中按组创建订单统计信息?

python - Scrapy不收集数据

从欧盟网页读取内容的python不一致行为

vba - SendKeys 从 Internet Explorer 打开 Excel 文件

javascript - 如何获取 casper.js http.status 代码?

vba - 在Excel VBA中,如何检查网页是否完全加载?

r - data.table:使用 colnames 通过引用赋值

r - 在循环内使用 ggplot2 的直方图

r - 使用 ncdf4::ncvar_get 时如何指定维度顺序?

python - 为什么在这种特殊情况下使用生成器对象?