Tutoreil d' extraction de données- récupérer des articles depuis www.prweb.com

Dans ce tutoriel nus aimerions vous montrer comment nous résolvons un problème signalé par l'un de nos clients. La configuration du client est la suivante:

  1. recherche sous www.prweb.com pour n'importe quel mot clé (ex: "café noir")
  2. tous les résultats trouvés doivent être répartis - pas seulement les 10 premiers résultats, mais également les pages de recherche suivantes (ex: pour "café noir il y avait plus de 1600 articles trouvés)
  3. chaque article trouvé doit être ouvert et son contenu doit être enregistré sous: {$year}-{$month}-{$id}.html

Le client nous a demandé si la tâche pouvait être effectuée avec Unit Miner. Et nous avons répondu un grand "OUI", car c'est exactement pour cela que nous avons créé Unit Miner. Servons-nous de ce tutoriel vous voir comment réaliser cette tâche avec Unit Miner.

Etape 1 - ouvrir la recherche

Nous avons en premier lieu défini  un Logger tag, car pendant le développement il est toujours bon de savoir ce qu'il se passe dansUnit Miner. Aussi, si je comprend ce qu'il se passe sous Unit Miner, dès que je rédige un script, les erreurs sont stockées dans le script.

Nous allons créer un script, très simple, que nous allons nommer: main.w e.g. inside directory Wrapper/samples/prweb


#defines logger, which will log all debug messages
<Logger File>
    Global
    
    #store output of logger to file
    FileName output-debug.txt
    Level debug
</Logger>

#main section
<Section>
    Name main

  

</Section>

Main main

La nouvelle principale est surlignée dans le code source:

Etape 2 - formulaire HTML

Dans cette étape, nous allons vous montrer comment composer un petit document HTML , qui contiendra un petit formulaire avec un champs de recherche. Nous allons également vous montrer comment lancer un secript sous Unit Miner lorsque chaque segment du script peut être soumis à une recherche.

Nous allons créer un fichier php sous Wrapper/samples/prweb directory. Il faut créer des bibliothèques s'il n'en existe aucune. Dans le fichier, vous trouverez une section en langage HTML, contenant un petit formulaire et un champs PHP, qui éxécutera les données au format main.w.

Nous voulons utiliser que le Titre de la nouvelle principale et le petit texte situé sous l'image.
Comme vous le voyez, ce dernier est encadré de tags <div class="cnnMainT1Hd"></div> et le texte est contenu entre les 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();
}

?>

Etape 3 -lancer une recherche sous www.prweb.com et récupérer la première page de résultats

 Si maintenant nous retournerons en arrière à notre nouveau scénario main.w.

Nous ajouterons à notre commande de structure vide, qui chargera des données soumises (la valeur "de recherche" de champs. Pour ce purpouse nous utiliserons < le Modèle(Gabarit) d'Action > l'étiquette, qui nous permettra d'exécuter n'importe quel code de PHP. Dans cette étiquette nous composerons url, qui est utilisé pour chercher dans www.prweb.com.

Comme la chose suivante, que nous ferons dans ce pas(étape) nous chargerons le contenu rendu par la recherche. Pour cela nous utiliserons l'étiquette < Exécutent ContentURL > Et comme la dernière chose nous exécuterons le nouveau scénario (que nous n'avons pas encore) nommé "process_result_page.w".

Ce nouveau scénario devrait traiter tout ce qui est à la page de résultat - les moyens saisissent urls d'articles PR.

Chaque script contient la saction principale qui télécharge la page depuis l'URL indiquée, puis réalise une action avec le contenu téléchargé. Nous allons voir comment associer les données aux étapes suivantes.

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

<Section>

    Name main

    #Set variable name $url (loaded value from REQUEST - form input field search)
    <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>
    
    #process found resultset
    <Action Eval>
        File process_result_page.w
    </Action>


</Section>


#start execution with section named: main
Main main

Etape 4 - récupérer les urls d'articles PR

 Dans les étapes précédentes, nous avons voulu exécuter le scénario nommé process_result_page.w. Donc vous montrons comment nous préparerons ce scénario.

Créez s'il vous plaît un fichier  avec le nom process_result_page.w dans le même annuaire(répertoire) que main.w. À l'intérieur du scénario nous chargerons la page de résultat contente (url est strored à l'intérieur de la variable de contexte $url). Nous insérerons Tandis que le cycle, qui réitérera par tous les modèles trouvés dans le document. À l'intérieur de la Section Tandis que nous insérerons le Modèle d'étiquette, qui cherchera à l'intérieur du contenu chargé pour les événements de modèle défini et chargeront des variables correspondues de valeurs (les URL d'articles PR). Et finalement nous exécuterons le scénario suivant nommé "process_pr_page.w", qui traitera chaque détail paginent separatelly.

 Pour correspondre aux données nous devons spécifier la correspondance au modèle. Le modèle suivant dit au système de correspondre à tout entre les étiquettes < la classe de division = "cnnMainT1Hd" > <h2> < un * > ... </a> </h2> < / la division > et stocker la valeur correspondue dans la variable $main_title
Alors nous avons défini l'action qui fera quelque chose avec la valeur dans cette variable. Dans notre cas il imprimera seulement le résultat à la production standard utilisant la commande de Texte, mais vous pouvez sauver(économiser) la valeur au fichier, faire un encart de base de données, ou utiliser le vaue pour charger et le mien une autre page.


<Section>

    Name process_result_page
    
    #load content from url defined in context variable $url
    <Action ContentURL>

        URL {$url}
        
        #from retrieved content remove new line breakes
        RemoveNewLine
    </Action>
    
    #iterate in page until you find all links to PR articles
    <Section While>
    
        #match pattern which contains link to PR article and store link into context variable $link_url
        <Pattern>

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

        </Pattern>
        
        #execute script, which will process matched URL of PR article
        <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>

#start execution with section process_result_page
Main process_result_page

Nous avons défini ici un schéma supplémentaire qui correspond à tout ce qui contenu entre les tags <div class="cnnMainT1">...</div> et nous avons enregistré les valeurs correspondantes sous $short_text.

Attention! Nous avons utilisé un modificateur spécifique :re(.*?) après la variable.

:re dit au système d'utiliser une expression regulière pour coller au texte

.*? est une expression régulière qui correspond à chaque caractère suivant le caractère ‘<’.

Nous avons également défini une action qui imprime le texte associé par défaut.

Etape 5 - récupérer des articles PR et les enregistrer sous la forme de fichiers

Nous sommes bientôt arrivés à la fin de cette tâche. ici, nous allons devoir rédiger un contenu à partir de l'URL d'articles vers les fichiers spécifiés. Créons un fichier nommé "process_pr_page.w" que nous placerons au même endroit que les autres fihciers.

Dans ce script nous allons charger le contenu de l'url sous la forme de la variable $link_url depuis le script précédent. Nous allons également associer les données des articles pR (titres et textes). Puis, pour terminer, nous allons tout enregistrer osus un fichier au nouveau format.


<Section>

    Name process_pr_page

    #load content of page containing PR article
    <Action ContentURL>

        #url is stored in context variable $link_url
        URL {$link_url}
        
        #remove line breaks from loaded content
        RemoveNewLine
    </Action>
    
    #match titel of article
    <Pattern>
        RegExp <h1 class="h1format">{$pr_title}</h1>

    </Pattern>

    
    #match text of PR article
    <Pattern>
        RegExp <div align="left">{$pr_text:regexp(.*?)}</div>
    </Pattern>

    #load variable $link_url as content, because we like to parse from url year, month and id, 
    #which we will use as filename
    <Action ContentVariable>

        Variable $link_url
    </Action>
    
    #match year, month and id in content
    <Pattern>
        RegExp releases/{$year}/{$month}/prweb{$id}.htm
    </Pattern>

    
    #store matched data to file, where filename will have format e.g. 2005-1-212133.html
    #formatting of file defines attribute Text
    <Action Print>
        FileName {$year}-{$month}-{$id}.html
        Text <HTML><BODY><H1>{$pr_title}</H1><br><br>{$pr_text}</BODY></HTML>

    </Action>
    
</Section>

#start execution in this script with section process_pr_page
Main process_pr_page

Voilà, nous y sommes.

Mais il reste un petit détail à régler:  nous devons également classer les autres pages de résultats. Efectuons cette dernière étape avec ce tutoriel.

Etape 6 - classer toutes les pages de résultats

Nous devons éditer de nouveau le script main.w, car dans ce script que nous avons téléchargé, seule la première page de résultat a été répertoriée.

Dans ce script nous allons faire correspondre toutes les urls des autres pages de recherche et les ouvrir dans le même script que la première page de résultats.

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

<Section>
    Name main

    #Set variable name $url (loaded value from REQUEST - form input field search)
    <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>
    
    #process found resultset
    <Action Eval>
        File process_result_page.w
    </Action>


    #process also next pages of search result
    <Section>
        Name subpages
        Optional
        
        <Pattern>
            RegExp Results Pages:
        </Pattern>

        #iterate through all next pages of search resultset
        <Section While>

            Name Next_Pages
            EndAt [
            
            #match pattern of next page link and load link into context variable $url
            <Pattern>
                RegExp <a href="{$url}">{$page_number}</a> 
            </Pattern>
            
            #define URL in correct way, because in HTML it's not complete
            <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>

            
            #execute script, which process results as it was done with first page
            <Action Eval>
                File process_result_page.w
            </Action>
        </Section>

    </Section>
  
</Section>


#start execution with section named: main
Main main

© 2004-2012 QualityUnit.com, All rights reserved