tutorial scraping page hacer example con como r web-crawler web-scraping rcurl

scraping - RCurl no recupera el texto fuente completo del sitio web-¿faltan enlaces?



scraping a web page using r (2)

Me gustaría utilizar RCurl como webcrawler cortés para descargar datos de un sitio web. Obviamente necesito los datos para la investigación científica. Aunque tengo los derechos para acceder al contenido del sitio web a través de mi universidad, los términos de uso del sitio web prohíben el uso de webcrawlers.

Traté de pedirle directamente al administrador del sitio los datos, pero solo respondieron de manera muy vaga. Bueno, de todos modos parece que no me enviarán simplemente las bases de datos subyacentes.

Lo que quiero hacer ahora es pedirles oficialmente que obtengan el permiso de una sola vez para descargar contenido específico solo de texto de su sitio usando un código R basado en RCurl que incluye un retraso de tres segundos después de que se haya ejecutado cada solicitud.

La dirección de los sitios de los que quiero descargar datos funcionan así: http://plants.jstor.org/specimen/ ID del sitio

Traté de programarlo con RCurl pero no puedo hacerlo. Algunas cosas complican las cosas:

  1. Solo se puede acceder al sitio web si se permiten las cookies (lo conseguí trabajando en RCurl con el argumento de cocción).

  2. El botón Siguiente solo aparece en el código fuente cuando uno realmente accede al sitio al hacer clic a través de los diferentes enlaces en un navegador normal. En el código fuente, el botón Siguiente está codificado con una expresión que incluye

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

    Cuando uno intenta acceder al sitio directamente (sin haber hecho clic antes en el mismo navegador), no funciona, la línea con el enlace simplemente no está en el código fuente.

  3. Los ID de los sitios son combinaciones de letras y dígitos (como "goe0003746" o "cord00002203"), así que no puedo simplemente escribir un for-loop en R que intente con cada número desde 1 hasta 1,000,000.

Por lo tanto, se supone que mi programa imita a una persona que hace clic en todos los sitios mediante el botón Siguiente, cada vez que guarda el contenido de texto.

Cada vez que guarde el contenido de un sitio, debe esperar tres segundos antes de hacer clic en el botón Siguiente ( debe ser un rastreador educado ). Obtuve eso trabajando en R también usando la función Sys.sleep.

También pensé en usar un programa automatizado, pero parece que hay muchos de esos programas y no sé cuál utilizar.

Tampoco soy exactamente la persona que escribe el programa (aparte de un poco de R), así que realmente apreciaría una solución que no incluye la programación en Python, C ++, PHP o similares.

¡Cualquier idea sería muy apreciada! ¡Muchas gracias de antemano por sus comentarios y propuestas!


Puede que me esté perdiendo exactamente la parte en la que estás colgado, pero parece que ya casi estás allí.

Parece que puedes solicitar la página 1 con las cookies activadas. A continuación, analice el contenido buscando la siguiente identificación del sitio, luego solicite esa página construyendo la URL con la siguiente identificación del sitio. Luego raspe los datos que desee.

Parece que tienes un código que hace casi todo esto. ¿El problema es analizar la página 1 para obtener la ID para el siguiente paso? Si es así, debes formular un ejemplo reproducible y sospecho que obtendrás una respuesta muy rápida a tus problemas de sintaxis.

Si tiene problemas para ver lo que está haciendo el sitio, le recomiendo utilizar el complemento Tamper Data para Firefox. Le permitirá ver qué solicitud se realiza con cada clic del mouse. Lo encuentro realmente útil para este tipo de cosas.


Prueba una estrategia diferente

########################## #### #### 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))) } }