2009-07-23 2 views
5

Ich frage mich, ob es möglich ist, die Eingabe von Einträgen zu automatisieren, um Formulare zu suchen und Übereinstimmungen aus den Ergebnissen zu extrahieren. Zum Beispiel habe ich eine Liste von Zeitschriftenartikeln, für die ich DOIs (digitale Objektkennung) erhalten möchte; manuell dazu würde ich auf die Suchseite für Zeitschriftenartikel gehen (z. B.), die Autoren/Titel/Volumen (usw.) eingeben und dann den Artikel aus seiner Liste der zurückgegebenen Ergebnisse finden und den DOI auswählen und einfügen das in meine Referenzliste. Ich benutze R und Python für die Datenanalyse regelmäßig (ich wurde von einem Beitrag auf RCurl inspiriert), weiß aber nicht viel über Webprotokolle ... ist so etwas möglich (zum Beispiel mit etwas wie Pythons BeautifulSoup?). Gibt es irgendwelche guten Referenzen, um etwas Ähnliches wie diese Aufgabe zu machen? Ich bin genauso interessiert daran, etwas über Web-Scraping und Tools für das Scraping im Web zu lernen, genauso wie für diese spezielle Aufgabe ... Danke für deine Zeit!Web Scraping zum Ausfüllen (und Abrufen) von Suchformularen?

+0

Haben Sie eine gute Lösung für dieses Problem gefunden? Ich habe das gefunden, nachdem ich eine ähnliche (Duplikate?) Frage hier gestellt habe http://stackoverflow.com/questions/9711539/cani-iquery-the-digital-object-identifier-for-a-list-of-citations –

+0

@ David - nein, tut mir Leid. Ich bin noch nicht weit genug gekommen, um etwas zu kommentieren ... – hatmatrix

Antwort

9

Schöne Suppe ist für webpages-, dass das Parsen ist die Hälfte von dem, was Sie tun möchten. Python, Perl und Ruby haben alle eine Version von Mechanize, und das ist die andere Hälfte:

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

Mechanize wir Sie einen Browser steuern:

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

Mit Mechanize und schöne Suppe Sie haben toller Anfang. Ein zusätzliches Werkzeug, das ich betrachten würde, ist Firebug, wie in dieser schnellen Rubin Schaben Anleitung:

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

Firebug Ihre Konstruktion von XPath für das Parsen von Dokumenten beschleunigen können, sparen Ihnen einige ernsthafte Zeit.

Viel Glück!

+0

Großartig !! Danke - sehr hilfreich! – hatmatrix

+0

Stephen! Mark mir eine Antwort! Ich fahre einen Kollegen zu 100 Punkten :-) – mixonic

+0

Ich versuche es! Ich habe gerade eine OpenID, aber es sagt mir, ich muss 15 Ruf haben, um zu wählen? Sorry, das erste mal auf Stackoverflow ... ist das so kompliziert? – 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 

(Angepasst von Joe Albahri des „C# auf den Punkt gebracht“)

+0

Danke - gut zu wissen, dass es möglich ist! ...Ich rate. (nicht zu vertraut mit. NET, obwohl ich höre es ist der letzte Schrei ...) – hatmatrix

0

Es gibt viele Werkzeuge zum Abschaben von Papier. Es gibt ein gutes Firefox-Plugin namens iMacros. Es funktioniert großartig und benötigt keinerlei Programmierkenntnisse. Die kostenlose Version kann von hier heruntergeladen werden: Das beste an iMacros ist, dass es Sie in wenigen Minuten starten kann, und es kann auch von der Bash-Befehlszeile gestartet werden, und kann auch aus Bash-Skripten aufgerufen werden.

Ein fortgeschrittener Schritt wäre Selen-Webdrive. Der Grund, warum ich Selen gewählt habe, ist, dass es sehr gut für Anfänger geeignet ist. Lesen Sie nur die folgenden page:

würde Sie in kürzester Zeit auf und läuft. Selen unterstützt Java, Python, PHP, c Wenn Sie also mit einer dieser Sprachen vertraut sind, sind Sie mit allen erforderlichen Befehlen vertraut. Ich bevorzuge Webdrive Variation von Selen, wie es einen Browser öffnet, so dass Sie die Felder und Ausgaben überprüfen können. Nachdem Sie das Skript mit dem Webdrive eingerichtet haben, können Sie das Skript problemlos in die IDE migrieren und so kopflos arbeiten.

Selen installieren Sie, indem Sie den Befehl

sudo easy_install selenium 

Dieser kümmert sich um die Abhängigkeiten und alles für Sie tun können.

Um Ihr Skript interaktiv ausführen, nur öffnen Sie ein Terminal und geben Sie

python 

Sie die Python-Prompt sehen >>>, und Sie können in den Befehlen eingeben.

Hier ist ein Beispielcode, den Sie im Terminal einfügen kann, ist es Google für das Wort Käse

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

Ich hoffe suchen, dass dieser Ihnen einen Vorsprung geben kann.

Prost :)

+0

Zunächst weisen Sie den Benutzer an, den Selenium Client für Python zu installieren. aber Ihr Code-Beispiel ist Java-Code. Das ist verwirrend. – knb