2009-07-23 14 views
5

Mi chiedevo se è possibile "automatizzare" il compito di digitare le voci nei moduli di ricerca e di estrarre le corrispondenze dai risultati. Ad esempio, ho un elenco di articoli di giornale per i quali vorrei ottenere i DOI (identificatore di oggetti digitali); manualmente per questo vorrei andare alla pagina di ricerca degli articoli della rivista (ad esempio, http://pubs.acs.org/search/advanced), digitare gli autori/titolo/volume (ecc.) e quindi trovare l'articolo fuori dall'elenco dei risultati restituiti e scegliere il DOI e incollare quello nella mia lista di riferimento. Io uso R e Python per l'analisi dei dati regolarmente (sono stato ispirato da un post su RCurl) ma non conosco molto sui protocolli web ... è una cosa possibile (ad esempio usando qualcosa come Python's BeautifulSoup?). Ci sono dei buoni riferimenti per fare qualcosa di simile a questo compito remotamente? Sono altrettanto interessato a conoscere il web scraping e gli strumenti per il web scraping in generale tanto quanto ottenere questo particolare compito fatto ... Grazie per il vostro tempo!web scraping per compilare (e recuperare) i moduli di ricerca?

+0

hai trovato una buona soluzione a questo problema? Ho trovato questo dopo aver chiesto una domanda simile (duplicata?) Qui http://stackoverflow.com/questions/9711539/can-i-query-the-digital-object-identifier-for-a-list-of-citations –

+0

@ David - no, mi dispiace. Non sono arrivato abbastanza lontano con qualsiasi opzione per commentare ... – hatmatrix

risposta

9

Beautiful Soup è grande per l'analisi webpages- che è la metà di quello che si vuole fare. Python, Perl e Ruby hanno tutti una versione di Mechanize, e questa è l'altra metà:

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

meccanizzare ti permette di controllare un browser:

# 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 e Beautiful Soup si dispone di un ottimo inizio Uno strumento in più mi piacerebbe prendere in considerazione è Firebug, come usato in questo breve resoconto rubino raschiatura:

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

Firebug può accelerare la costruzione di XPaths per l'analisi di documenti, consentendo di risparmiare tempo serio.

Buona fortuna!

+0

Grande !! Grazie - molto utile! – hatmatrix

+0

Stephen! Segna una risposta! Sto correndo un collega in 100 punti :-) – mixonic

+0

Ci sto provando! Ho appena ricevuto un OpenID ma mi dice che devo avere 15 reputazione per votare? Scusa, la prima volta su StackOverflow ... è complicato? – 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 

(Adattato da Joe Albahri "C# in poche parole")

+0

Grazie - bello sapere che è possibile! ... Sto indovinando. (non troppo familiare con .NET, anche se sento che è di gran moda ...) – hatmatrix

0

Ci sono molti strumenti per il web scraping. C'è un buon plugin per Firefox chiamato iMacros. Funziona alla grande e non ha bisogno di alcuna conoscenza di programmazione. La versione gratuita può essere scaricata da qui: https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/ La cosa migliore di iMacros è che può iniziare in pochi minuti e può anche essere lanciato dalla riga di comando di bash e può anche essere richiamato da script di bash.

Un passo più avanzato sarebbe il web-drive di selenio. Il motivo per cui ho scelto il selenio è che è documentato in modo perfetto per i principianti. leggendo solo il seguente page:

ti farebbe funzionare e in poco tempo. Il selenio supporta java, python, php, c quindi se conosci qualcuno di questi linguaggi, avrai familiarità con tutti i comandi necessari. Preferisco la variazione del selenio sul webdrive, in quanto apre un browser, in modo da poter controllare i campi e le uscite. Dopo aver impostato lo script tramite webdrive, è possibile migrare facilmente lo script in IDE, eseguendo quindi headless.

Per installare il selenio si può fare digitando il comando

sudo easy_install selenium 

Questo si prenderà cura delle dipendenze e tutto il necessario per voi.

Al fine di eseguire lo script in modo interattivo, basta aprire un terminale e digitare

python 

vedrete il prompt di pitone, >>> ed è possibile digitare i comandi.

Ecco un codice di esempio che è possibile incollare nel terminale, cercherà di Google per la parola formaggi

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(); 
    }} 

Spero che questo può dare un vantaggio iniziale.

Cheers :)

+0

Prima di dire all'utente di installare Selenium Client per Python; ma il tuo esempio di codice è il codice Java. Questo è confusionario. – knb