regulares - google forms avanzado
raspado web para completar(y recuperar) formularios de búsqueda (3)
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 (p. ej., http://pubs.acs.org/search/advanced ), escribiría los autores / título / volumen (etc.) y luego encontraría el artículo de su búsqueda. lista de resultados devueltos, y seleccione el DOI y péguelo en mi lista de referencias. Uso R y Python para el análisis de datos con regularidad (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!
Beautiful Soup es ideal para analizar páginas web, eso es la mitad de lo que quieres hacer. Python, Perl y Ruby tienen una versión de Mechanize, y esa es la otra mitad:
http://wwwsearch.sourceforge.net/mechanize/
Mecanizar le 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 and Beautiful Soup tienes un gran comienzo. Una herramienta adicional que consideraría es Firebug, como se usa en esta guía rápida de raspado de rubíes:
http://www.igvita.com/2007/02/04/ruby-screen-scraper-in-60-seconds/
Firebug puede acelerar la construcción de xpaths para analizar documentos, lo que le ahorrará tiempo.
¡Buena suerte!
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 "C # en pocas palabras" de Joe Albahri)
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 ayudarlo a 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 la siguiente página:
te pondría en marcha y corriendo en poco tiempo. 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 selenio, puede hacerlo escribiendo el comando
sudo easy_install selenium
Esto se ocupará de las dependencias y de todo lo que necesite.
Para ejecutar el script de manera interactiva, solo abra un terminal y escriba
python
verá el indicador de Python, >>> y puede escribir los comandos.
Aquí hay un código de muestra que puede pegar en la terminal, buscará en google 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 te pueda dar una ventaja.
Saludos :)