Tutorial zur Webextraktion - Erfassen von Artikeln aus www.prweb.com

In diesem Tutorial möchten wir Ihnen zeigen, wir wir ein Problem gelöst haben, das sich einem unserer Kunden stellte. Seine Anforderungen waren wie folgt:

  1. Suche in www.prweb.com nach jedem beliebigen Schlüsselwort (z.B. "schwarzer Kaffee")
  2. Alle Ergebnisse der gefundenen PR-Artikel sollten geparst werden - nicht nur die ersten 10 Ergebnisse, sondern auch die nächsten Seiten der Suche (z.B. für "schwarzen Kaffee" gab es mehr als 1.600 gefundene Artikel)
  3. Jeder gefundene Artikel sollte geöffnet und der Inhalt sollte in einer Datei mit dem Namen: {$year}-{$month}-{$id}.html gespeichert werden.

Der Kunde fragte uns, ob diese Aufgaben sich mit UnitMiner erledigen ließen. Und wir antworteten natürlich mit "JA", weil das genau das ist, wofür wir UnitMiner entwickelt haben. Beginnen wir also mit einem Tutorial dazu, wie eine solche Aufgabe mit UnitMiner erledigt werden kann.

Schritt 1 - offene Suche

Als ersten Schritt definierten wir einen Logger-Tag, weil es während der Entwicklung immer gut ist, zu wissen, was innerhalb von UnitMiner vorgeht. Wenn ich UnitMiner verstehe, tue ich dies jedes Mal, wenn ich ein neues Script entwickle oder ein Problem innerhalb eines Scripts finden muss.

Innerhalb des ersten Schritts werden wir außerdem ein kleines Framework des Hauptbereichs erstellen, das jeder verstehen kann. Wir erstellen also ein Script mit dem Namen: main.w z.B. innerhalb des Verzeichnisses Wrapper/samples/prweb.


#definiert Logger, der alle Debug-Nachrichten protokollieren wird
<Logger File>
    Global
    
    #Output des Loggers in Datei speichern
    FileName output-debug.txt
    Level debug
</Logger>

#Hauptbereich
<Section>
    Name main

  

</Section>

Main main

Die Hauptstory ist im Quellcode der Seite hervorgehoben:

Schritt 2 - HTML-Formular

In diesem Schritt werde ich Ihnen zeigen, wie Sie ein kleines HTML-Dokument erstellen, das ein kleines Formular mit einem Suchinputfeld anzeigen wird. Ich werde Ihnen außerdem zeigen, wie Sie mit dem UnitMiner-Script beginnen, wenn ein beliebiger Suchstring eingegeben wird.

Lassen Sie uns die Datei index.php innerhalb des Verzeichnisses Wrapper/samples/prweb erstellen. Erstellen Sie Verzeichnisse, falls sie nicht vorhanden sind. Innerhalb der Datei wird ein HTML-Bereich vorhanden sein, der ein kleines Formular und einen Bereich mit PHP ausdruckt, der das UnitMiner-Script mit dem Namen main.w ausführt.

Wir möchten nur den Titel der Hauptstory und den kurzen Text unter dem Bild verwenden.
Wie Sie sehen, ist der Titel von Tags <div class="cnnMainT1Hd"></div> umrahmt und der kurze Text steht innerhalb der Tags <div class="cnnMainT1"></div>.


<form>
Search string: <input type="text" name="search" value="<? echo $_REQUEST['search']; ?>"></input>

<input type="submit" name="Execute">
</form>

<?
if (strlen($_REQUEST['search'])) {
    require_once('../../../QUnit/Global.class.php');
    
    $executor = QUnit_Global::newobj('Wrapper_Executor', 'main.w');
    $executor->execute();
}

?>

Schritt 3 - Suche auf www-prweb.com ausführen und die erste Seite mit Ergebnissen erfassen

Jetzt kehren wir zu unserem neuen Script main.w zurück.

Wir werden verschiedene Dinge zu unserem leeren Framework-Befehl hinzufügen, die die eingereichten Daten laden (Wert des Feldes "Suche"). Für diesen Zweck verwenden wir den Tag <Action Template>, der uns die Ausführung jedes beliebigen PHP-Codes ermöglichen wird. In diesem Tag erstellen wir eine URL, die zur Suche in www.prweb.com verwendet werden wird.

Als nächstes werden wir den durch die Suche erhaltenen Inhalt laden. Dafür werden wir den Tag  <Action ContentURL> verwenden. Als letztes werden wir das neue Script ausführen (über das wir noch nicht verfügen) und das den Namen "process_result_page.w" hat.

Dieses neue Script sollte alles verarbeiten, was sich auf der Ergebnisseite befindet - d.h. die URLs von PR-Artikeln erfassen.

Jedes Script enthält den Hauptbereich, der die Seite von der benannten URL herunterlädt und führt dann einen Vorgang mit dem heruntergeladenen Inhalt aus. Im nächsten Schritt werden wir sehen, wie die Daten angepasst werden.

<Logger File>
    Global
    FileName output-main.txt
    Level debug
</Logger>

<Section>

    Name main

    #Variablenname setzen $url (geladener Wert aus ANFRAGE - Inputfeldsuche im Formular)
    <Action Template>
        TemplateText $context->setVariable('$url', \
        "http://www.prweb.com/cgi-bin/search/search.pl?Terms=" . $_REQUEST['search'] . \
        "&Match=0&Realm=prweb_inject&submit=Search");
    </Action>

    <Action ContentURL>

        URL {$url}
    </Action>
    
    #Prozess hat Ergebnisse gefunden
    <Action Eval>
        File process_result_page.w
    </Action>


</Section>


#Ausführung mit Bereich namens: main beginnen
Main main

Schritt 4 - URLs der PR-Artikel erfassen

Im vorherigen Schritt wollten wir das Script namens process_result_page.w ausführen. Lassen Sie mich also zeigen, wie wir dieses Script vorbereiten.

Bitte erstellen Sie eine Datei mit dem Namen process_result_page.w im selben Verzeichnis wie main.w. Innerhalb des Scripts werden wir die Ergebnisseite mit den Inhalten laden (die URL wird innerhalb der Kontextvariable $url gespeichert). Wir werden einen While-Zyklus einfügen, der in allen im Dokument gefundenen Mustern wiederholt wird. Innerhalb der Section While werden wir einen Tag 'Muster' einfügen, der innerhalb des geladenen Inhalts nach dem Auftreten des vordefinierten Musters suchen wird und die übereinstimmenden Variablen mit Werten laden wird (URLs von PR-Artikeln). Zum Schluss werden wir das nächste Script namens "process_pr_page.w" ausführen, das jede Detailseite getrennt verarbeiten wird.

Um die Daten anzupassen, müssen wir ein übereinstimmendes Muster definieren. Das folgende Muster weist das System an, alles anzupassen, was sich zwischen den Tags <div class="cnnMainT1Hd"><h2><a*>...</a></h2></div> befindet und den übereinstimmenden Wert in der Variable $main_title zu speichern.

Dann haben wir einen Vorgang definiert, der etwas mit dem Wert in dieser Variable tun wird. In unserem Fall wird er mit Hilfe des Befehls Text das Ergebnis im Standard-Output drucken, aber Sie können diesen Wert auch in der Datei speichern, eine Einfügung in eine Datenbank vornehmen oder den Wert zum Laden oder zum Mining einer anderen Seite nutzen.


<Section>

    Name process_result_page
    
     #Inhalt von in der Kontextvariable definierten URL laden $url
    <Action ContentURL>

        URL {$url}
        
        #neue Zeilenumbrüche aus gewonnenem Inhalt entfernen
        RemoveNewLine
    </Action>
    
    #auf der Seite wiederholen, bis Sie alle Links in PR-Artikeln gefunden haben
    <Section While>
    
         #Muster anpassen, das einen Link zu PR-Artikel enthält und Link in Kontextvariable speichern $link_url
        <Pattern>

            RegExp <dt><b>{$link_number}. <a href="{$link_url}">

        </Pattern>
        
        #Script ausführen, das die übereinstimmende URL des PR-Artikels verarbeitet
        <Action Eval>
            # some pages have different format and they don't match defined patterns, 
            # therefore continue in execution also if any page fails
            Optional
            
            File process_pr_page.w
        </Action>

 
    </Section>
</Section>

#Ausführung mit Bereich process_result_page beginnen
Main process_result_page

 

Hier haben wir ein weitere Muster definiert, dass alles, was sich zwischen den Tags <div class="cnnMainT1">...</div> befindet, anpassen wird und den übereinstimmenden Wert in der Variable $short_text speichern wird.

Beachten Sie, dass wir nach der Variable einen speziellen Modifier :re(.*?) verwendet haben.

:re weist das System an, den ordnungsgemäßen Begriff zu verwenden, um den Text anzupassen.

.*? ist der ordnungsgemäße Begriff, um jedes Zeichen bis zum Zeichen ‘<’ anzupassen.

Wir haben außerdem einen weiteren Vorgang definiert, der den übereinstimmenden Text in den Standard-Output druckt.

Schritt 5 - PR-Artikel erfassen und in Datei speichern

Jetzt haben wir unsere Aufgabe fast geschafft. In diesem Schritt werden wir Inhalte von der URL der PR-Artikel wie gewünscht in eine Datei schreiben. Lassen Sie uns also eine Datei namens "process_pr_page.w" im selben Verzeichnis wie alle vorherigen Dateien erstellen.

In diesem Script werden wir Inhalte aus der URL laden, die an die Variable $link_url aus dem vorherigen Script angepasst wurden. Außerdem werden wir Daten aus dem PR-Artikel (Titel und Text) anpassen. Als letztes werden wir Inhalt im neuen Format in eine Datei speichern.


<Section>

    Name process_pr_page

    #Inhalt der Seite mit dem PR-Artikel laden
    <Action ContentURL>

        #URL ist in der Kontextvariable $link_url gespeichert
        URL {$link_url}
        
        #Zeilenumbrüche aus dem geladenen Inhalt entfernen
        RemoveNewLine
    </Action>
    
    #Titel des Artikels anpassen
    <Pattern>
        RegExp <h1 class="h1format">{$pr_title}</h1>

    </Pattern>

    
     #Text des Artikels anpassen
    <Pattern>
        RegExp <div align="left">{$pr_text:regexp(.*?)}</div>
    </Pattern>

    #Variable $link_url als Inhalt laden, weil wir das Jahr, den Monat und die ID parsen möchten, 
    #die wir als Dateiname benutzen werden
    <Action ContentVariable>

        Variable $link_url
    </Action>
    
    #Jahr, Monat und ID in Inhalt anpassen
    <Pattern>
        RegExp releases/{$year}/{$month}/prweb{$id}.htm
    </Pattern>

    
    #übereinstimmende Daten in Datei speichern, wo der Dateiname z.B. das Format 2005-1-212133.html hat
    #Formattierung der Datei definiert das Attribut Text
    <Action Print>
        FileName {$year}-{$month}-{$id}.html
        Text <HTML><BODY><H1>{$pr_title}</H1><br><br>{$pr_text}</BODY></HTML>

    </Action>
    
</Section>

#Ausführung in diesem Script mit Bereich process_pr_page starten
Main process_pr_page

Eben habe ich gesagt, dass wir fertig sind.

Ja, wir sind fertig, wir haben jedoch einen kleinen Teil der Spezifikation vergessen, die wir ebenfalls durch die nächsten Seiten der Ergebnisse wiederholen müssen. Lassen Sie uns also noch diesen letzten Schritt in diesem Tutorial durchführen.

Schritt 6 - durch alle Ergebnisseiten wiederholen

Wir müssen das Script main.w wiederholen, weil wir in diesem Script die erste Ergebnisseite geladen haben.

In diesem Script werden wir alle URLs der nächsten Suchseiten anpassen und sie mit demselben Script wie die erste Seite öffnen.

<Logger File>
    Global
    FileName output-main.txt
    Level debug
</Logger>

<Section>
    Name main

    #Variablenname setzen $url (geladener Wert aus ANFRAGE - Formular der Inputfeldsuche)
    <Action Template>
        TemplateText $context->setVariable('$url', \
        "http://www.prweb.com/cgi-bin/search/search.pl?Terms=" . $_REQUEST['search'] . \
        "&Match=0&Realm=prweb_inject&submit=Search");
    </Action>

    <Action ContentURL>
        URL {$url}
    </Action>
    
    #Prozess hat Ergebnisse gefunden
    <Action Eval>
        File process_result_page.w
    </Action>


    #auch nächste Seiten der Suchergebnisse verarbeiten
    <Section>
        Name subpages
        Optional
        
        <Pattern>
            RegExp Results Pages:
        </Pattern>

         #durch alle nächsten Seiten der Suchergebnisse wiederholen
        <Section While>

            Name Next_Pages
            EndAt [
            
            #Muster des nächsten Seitenlinks anpassen und Links in Kontextvariable $url laden
            <Pattern>
                RegExp <a href="{$url}">{$page_number}</a> 
            </Pattern>
            
            #URL richtig definieren, weil sie in HTML nicht vollständig ist
            <Action Template>

                TemplateText    $trans_tbl = get_html_translation_table(HTML_ENTITIES);\
                                $trans_tbl = array_flip($trans_tbl);\
                                $context->setVariable('$url', "http://www.prweb.com/cgi-bin/search/" . \
                                strtr($context->getVariable('$url'), $trans_tbl));
            </Action>

            
            #Script ausführen, das Ergebnisse wie bei der ersten Seite verarbeitet
            <Action Eval>
                File process_result_page.w
            </Action>
        </Section>

    </Section>
  
</Section>


#Ausführung mit dem Bereich namens: main starten
Main main

© 2004-2012 QualityUnit.com, All rights reserved