2009-07-23 30 views
5

Me preguntaba si es posible "automatizar" la tarea de escribir entradas para buscar formularios y extraer coincidencias de los resultados. Por ejemplo, tengo una lista de artículos de revistas para los cuales me gustaría obtener DOI (identificador de objeto digital); De forma manual, iría a la página de búsqueda de artículos de revistas (por ejemplo, http://pubs.acs.org/search/advanced), escribiría los autores/título/volumen (etc.) y luego encontraría el artículo fuera de su lista de resultados devueltos, y seleccionaría el DOI y lo pegaría eso en mi lista de referencia. Uso R y Python para el análisis de datos regularmente (me inspiré en una publicación en RCurl) pero no sé mucho sobre protocolos web ... ¿es posible? (Por ejemplo, usar algo como BeautifulSoup de Python). ¿Hay alguna buena referencia para hacer algo remotamente similar a esta tarea? Estoy tan interesado en aprender sobre raspado web y herramientas para raspar en la web en general como hacer esta tarea en particular ... ¡Gracias por su tiempo!web scraping para completar (y recuperar) formularios de búsqueda?

+0

¿Has encontrado una buena solución a este problema? Lo encontré después de hacer una pregunta similar (¿duplicada?) Aquí http://stackoverflow.com/questions/9711539/can-i-query-the-digital-object-identifier-for-a-list-of-citations –

+0

@ David - no, lo siento. No he llegado lo suficientemente lejos con ninguna opción para comentar ... – hatmatrix

Respuesta

9

Hermosa sopa es ideal para analizar webpages- eso es la mitad de lo que quiere hacer. Python, Perl y Ruby todos tienen una versión de Mechanize, y esa es la otra mitad:

http://wwwsearch.sourceforge.net/mechanize/

Mecanización te permite controlar un navegador:

# Follow a link 
browser.follow_link(link_node) 

# Submit a form 
browser.select_form(name="search") 
browser["authors"] = ["author #1", "author #2"] 
browser["volume"] = "any" 
search_response = br.submit() 

Con Mechanize y sopa Hermosa tiene una gran comienzo. Una herramienta adicional que consideraría es Firebug, tal como se utiliza en esta guía rubí raspado rápida:

http://www.igvita.com/2007/02/04/ruby-screen-scraper-in-60-seconds/

Firebug puede acelerar su construcción de XPaths para analizar los documentos, que le ahorra un tiempo serio.

¡Buena suerte!

+0

¡¡Genial !! Gracias, ¡muy útil! – hatmatrix

+0

Stephen! ¡Dame una respuesta! Estoy compitiendo con un compañero de trabajo a 100 puntos :-) – mixonic

+0

¡Lo estoy intentando! Acabo de obtener un OpenID pero me dice que tengo que tener 15 reputación para votar? Lo siento, primera vez en stackoverflow ... ¿es tan complicado? – hatmatrix

1
WebRequest req = WebRequest.Create("http://www.URLacceptingPOSTparams.com"); 

req.Proxy = null; 
req.Method = "POST"; 
req.ContentType = "application/x-www-form-urlencoded"; 

// 
// add POST data 
string reqString = "searchtextbox=webclient&searchmode=simple&OtherParam=???"; 
byte[] reqData = Encoding.UTF8.GetBytes (reqString); 
req.ContentLength = reqData.Length; 
// 
// send request 
using (Stream reqStream = req.GetRequestStream()) 
    reqStream.Write (reqData, 0, reqData.Length); 

string response; 
// 
// retrieve response 
using (WebResponse res = req.GetResponse()) 
using (Stream resSteam = res.GetResponseStream()) 
using (StreamReader sr = new StreamReader (resSteam)) 
    response = sr.ReadToEnd(); 

// use a regular expression to break apart response 
// OR you could load the HTML response page as a DOM 

(Adaptado de Joe Albahri "C# en una cáscara de nuez")

+0

Gracias, ¡es bueno saber que es posible! ...Estoy adivinando. (No estoy muy familiarizado con .NET, aunque escuché que es furor ...) – hatmatrix

0

Hay muchas herramientas para raspar web. Hay un buen complemento de Firefox llamado iMacros. Funciona muy bien y no necesita ningún conocimiento de programación. La versión gratuita se puede descargar desde aquí: https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/ Lo mejor de iMacros es que puede comenzar en minutos, y también se puede iniciar desde la línea de comando bash, y también se puede invocar desde las secuencias de comandos bash.

Un paso más avanzado sería selenium webdrive. La razón por la que elegí el selenio es que está documentado de una manera excelente para principiantes. leyendo solo lo siguiente page:

lo pondría en marcha rápidamente. Selenium admite java, python, php, c, por lo que si está familiarizado con cualquiera de estos idiomas, estará familiarizado con todos los comandos necesarios. Prefiero la variación del selenio en la WebDrive, ya que abre un navegador, para que pueda verificar los campos y las salidas. Después de configurar la secuencia de comandos usando webdrive, puede migrar fácilmente la secuencia de comandos a IDE, y así ejecutar sin cabeza.

Para instalar el selenio se puede hacer escribiendo el comando

sudo easy_install selenium 

Esto se hará cargo de las dependencias y todo lo necesario para usted.

Con el fin de ejecutar el script de forma interactiva, basta con abrir un terminal y escriba

python 

verá el símbolo del pitón, >>> y se puede escribir en los comandos.

Aquí es un ejemplo de código que puede pegar en la terminal, buscará en Google de la palabra quesos

package org.openqa.selenium.example; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedCondition; 
import org.openqa.selenium.support.ui.WebDriverWait; 

public class Selenium2Example { 
    public static void main(String[] args) { 
     // Create a new instance of the Firefox driver 
     // Notice that the remainder of the code relies on the interface, 
     // not the implementation. 
     WebDriver driver = new FirefoxDriver(); 

     // And now use this to visit Google 
     driver.get("http://www.google.com"); 
     // Alternatively the same thing can be done like this 
     // driver.navigate().to("http://www.google.com"); 

     // Find the text input element by its name 
     WebElement element = driver.findElement(By.name("q")); 

     // Enter something to search for 
     element.sendKeys("Cheese!"); 

     // Now submit the form. WebDriver will find the form for us from the element 
     element.submit(); 

     // Check the title of the page 
     System.out.println("Page title is: " + driver.getTitle()); 

     // Google's search is rendered dynamically with JavaScript. 
     // Wait for the page to load, timeout after 10 seconds 
     (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { 
      public Boolean apply(WebDriver d) { 
       return d.getTitle().toLowerCase().startsWith("cheese!"); 
      } 
     }); 

     // Should see: "cheese! - Google Search" 
     System.out.println("Page title is: " + driver.getTitle()); 

     //Close the browser 
     driver.quit(); 
    }} 

espero que esto le puede dar una ventaja inicial.

Saludos :)

+0

Primero le está diciendo al usuario que instale Selenium Client para Python; pero su ejemplo de código es código Java. Esto es confuso. – knb

Cuestiones relacionadas