RCurl не получает полный исходный текст сайта - ссылки отсутствуют? - PullRequest
3 голосов
/ 25 октября 2011

Я хотел бы использовать RCurl как вежливый веб-сканер для загрузки данных с веб-сайта.Очевидно, мне нужны данные для научных исследований.Хотя у меня есть права на доступ к содержимому веб-сайта через мой университет, условия использования веб-сайта запрещают использование веб-сканеров.

Я пытался запросить данные у администратора сайта напрямую, но онитолько ответил очень расплывчато.Ну, в любом случае кажется, что они не будут просто отправлять мне базовые базы данных.

Что я хочу сделать сейчас, так это попросить их официально получить одноразовое разрешение на скачивание определенного текстового контента с их сайта.с использованием кода R на основе RCurl, который включает задержку в три секунды после выполнения каждого запроса.

Адрес сайтов, с которых я хочу загрузить данные, работает следующим образом: http://plants.jstor.org/specimen/ID изсайт

Я пытался запрограммировать его с помощью RCurl, но не могу этого сделать.Несколько вещей усложняют:

  1. Доступ к веб-сайту можно получить только в том случае, если разрешено куки (я понял, что работаю в RCurl с аргументом cookiefile).

  2. Кнопка Next появляется в исходном коде только в том случае, если пользователь действительно заходит на сайт, щелкая различные ссылки в обычном браузере.В исходном коде кнопка Next закодирована с выражением, включающим

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

    Когда кто-то пытается получить доступ к сайту напрямую (без нажатия на него ранее в том же браузере), он не будет работатьстрока со ссылкой просто отсутствует в исходном коде.

  3. Идентификаторы сайтов: комбинации букв и цифр (например, «goe0003746» или «cord00002203 ”), поэтому я не могу просто написать цикл for в R, который пробует каждое число от 1 до 1 000 000.

Поэтому моя программа должна имитировать человека, который щелкает повсе сайты с помощью кнопки Далее, каждый раз сохраняя текстовое содержание.

Каждый раз после сохранения содержимого сайта следует ждать три секунды , прежде чем нажимать кнопку "Далее" ( это должен быть вежливый сканер ).Я понял, что работает и в R, используя функцию Sys.sleep.

Я также думал об использовании автоматической программы, но таких программ, похоже, много, и я не знаю, какую из них использовать..

Я также не совсем программист (за исключением небольшого числа R), поэтому я был бы очень признателен за решение, которое не включает программирование на Python, C ++, PHP и т.п..

Любые мысли будут высоко ценится!Заранее большое спасибо за комментарии и предложения !!

Ответы [ 2 ]

2 голосов
/ 02 декабря 2011

Попробуйте другую стратегию.

 ##########################
 ####
 ####            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))) 
    }
  }
1 голос
/ 25 октября 2011

Возможно, мне не хватает именно того, с чем вы зависли, но, похоже, вы почти у цели.

Кажется, вы можете запросить страницу 1 с включенными файлами cookie. Затем выполните анализ содержимого в поисках следующего идентификатора сайта, а затем запросите эту страницу, создав URL-адрес со следующим идентификатором сайта. Затем очистите все данные, которые вы хотите.

Похоже, у вас есть код, который делает почти все это. Проблема в разборе страницы 1, чтобы получить идентификатор для следующего шага? Если это так, вы должны сформулировать воспроизводимый пример, и я подозреваю, что вы получите очень быстрый ответ на ваши проблемы с синтаксисом.

Если вы не видите, что делает сайт, я рекомендую использовать плагин Tamper Data для Firefox. Это позволит вам увидеть, какой запрос делается при каждом щелчке мыши. Я считаю это действительно полезным для такого рода вещей.

...