Maison  >  Article  >  développement back-end  >  Concurrent Scrapper

Concurrent Scrapper

Barbara Streisand
Barbara Streisandoriginal
2024-11-06 15:21:03930parcourir

Scrapper Concorrente

Objectif du programme

Accédez aux pages web en même temps pour extraire le titre de chaque page et afficher ces titres dans le terminal. Cela se fait grâce à la concurrence dans Go, qui vous permet d'accéder à plusieurs pages simultanément, ce qui vous fait gagner du temps.

Explication du Code

Forfaits utilisés

import (
    "fmt"
    "net/http"
    "sync"
    "github.com/PuerkitoBio/goquery"
)

fonction fetchTitle

Ce rôle est responsable de :

  • Accéder à une page Web (url)
  • Extraire le titre de la page
  • Evnier le résultat sur une chaîne
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) {
    defer wg.Done() // Marca a goroutine como concluída no WaitGroup

Paramètres de fonction :

  • chaîne d'url : Représente l'adresse de la page web (url) à laquelle nous allons accéder pour obtenir le titre
  • wg *sync.WaitGroup : pointeur vers un WaitGroup, que nous utilisons pour synchroniser l'achèvement de toutes les tâches (goroutines) qui s'exécutent en même temps. Le * indique que nous transmettons une "adresse" à WaitGroup` et non une copie de celle-ci.
  • results chan<- string : Il s'agit d'un canal unidirectionnel qui vous permet d'envoyer des chaînes à une autre partie du programme. Il permet de transmettre des résultats (titres ou messages d'erreur) à la fonction principale

La ligne defer wg.Done() indique au programme de marquer cette tâche (goroutine) comme terminée lorsque la fonction fetchTitle se termine. Ceci est important pour que le principal sache quand toutes les tâches sont terminées.

Requête HTTP


req, err := http.Get(url)
si erreur != nul {
résultats <- fmt.Sprintf("Erreur d'accès à %s : %v", url, err)
revenir
>
différer req.Body.Close()

  • http.Get(url) : Cette ligne effectue une requête HTTP GET à l'URL. Cela signifie que nous accédons à la page et demandons au serveur son contenu.
  • err != nil : Ici, nous vérifions s'il y a eu une erreur lors de l'accès à la page (par exemple, si la page n'existe pas ou si le serveur ne répond pas). S'il y a une erreur, nous envoyons un message au canal de résultats et terminons la fonction avec return.
  • defer req.Body.Close() : Cela garantit qu'une fois que nous avons fini d'utiliser le contenu de la page, nous libérons la mémoire allouée pour le stocker.

Vérification de l'état


si req.StatusCode != 200 {
résultats <- fmt.Sprintf("Erreur d'accès à %s : statut %d %s", url, req.StatusCode, req.Status)
revenir
>

  • req.StatusCode != 200 : On vérifie si le serveur a répondu avec le code 200 OK (indique le succès). Si ce n’est pas 200, cela signifie que la page ne s’est pas chargée correctement. Nous envoyons ensuite un message d'erreur au canal de résultats et terminons la fonction.

Chargement et recherche de titre


doc, err := goquery.NewDocumentFromReader(req.Body)
si erreur != nul {
résultats <- fmt.Sprintf("Erreur lors du chargement du document à partir de %s : %v", url, err)
revenir
>
titre := doc.Find("titre").Text()
résultats <- fmt.Sprintf("Titre de %s : %s", url, titre)
>

  • goquery.NewDocumentFromReader(req.Body) : Nous chargeons le contenu HTML de la page (fourni par req.Body) dans goquery, ce qui vous permet de naviguer et de rechercher des parties spécifiques du HTML.
  • doc.Find("title").Text() : On recherche la balise dans le HTML de la page et récupérez le texte à l'intérieur (c'est-à-dire le titre). </pre> <li> <strong>results <- fmt.Sprintf("Título de %s: %s", url, title)</strong> : Nous envoyons le titre extrait au canal des résultats, où il sera lu plus tard.</li> <h2> fonction principale </h2> <p>La fonction principale est la fonction principale qui configure et contrôle le programme.</p> <p><br> func main() {<br> URL := []chaîne{<br> "http://olos.novagne.com.br/Olos/login.aspx?logout=true",<br> "http://sistema.novagne.com.br/novagne/",<br> ><br> </p> <ul> <li> <strong>urls := []string{...}</strong> : Nous définissons une liste d'URL que nous souhaitons traiter. Chaque URL sera transmise à une goroutine qui extraira le titre de la page.</li> </ul> <h2> Configuration du groupe d'attente et des canaux </h2> <p><br> var wg sync.WaitGroup<br> results := make(chan string, len(urls)) // Canal pour stocker les résultats<br> </p> <ul> <li> <strong>var wg sync.WaitGroup</strong> : Nous créons une nouvelle instance de WaitGroup, qui contrôlera le nombre de goroutines et garantira qu'elles se terminent toutes avant la fin du programme.</li> <li> <strong>results := make(chan string, len(urls))</strong> : Nous créons un canal de résultats d'une capacité égale au nombre d'URL. Ce canal stockera les messages avec des titres ou des erreurs.</li> </ul> <h2> La maison des Goroutines </h2> <p><br> pour _, url := plage d'URL {<br> wg.Add(1)<br> allez chercherTitle(url, &wg, résultats)<br> ><br> </p> <ul> <li> <strong>pour _, url := plage d'urls</strong> : Ici, nous parcourons chaque URL de la liste.</li> <li> <strong>wg.Add(1)</strong> : Pour chaque URL, nous incrémentons le compteur WaitGroup pour indiquer qu'une nouvelle tâche (goroutine) va être démarrée.</li> <li> <strong>go fetchTitle(url, &wg, results)</strong> : Nous appelons fetchTitle comme une <strong>goroutine</strong> pour chaque URL, c'est-à-dire que nous la faisons fonctionner en parallèle avec les autres.</li> </ul> <h2> Attente et affichage des résultats </h2> <p><br> wg.Attendez()<br> fermer(résultats)<br> </p> <hr> <p>REPO : https://github.com/ionnss/Scrapper-GoRoutine</p> <hr> <p>ions,</p> <p>un autre jour de la terre</p> <p>Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!</p></div><div class="nphpQianMsg"><a href="javascript:void(0);">html</a> <a href="javascript:void(0);">String</a> <a href="javascript:void(0);">if</a> <a href="javascript:void(0);">for</a> <a href="javascript:void(0);">var</a> <a href="javascript:void(0);">len</a> <a href="javascript:void(0);">nil</a> <a href="javascript:void(0);">github</a> <a href="javascript:void(0);">http</a> <a href="javascript:void(0);">https</a><div class="clear"></div></div><div class="nphpQianSheng"><span>Déclaration:</span><div>Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn</div></div></div><div class="nphpSytBox"><span>Article précédent:<a class="dBlack" title="De C# à Go : atteindre la compatibilité des codages AES et Base64" href="http://m.php.cn/fr/faq/1796672826.html">De C# à Go : atteindre la compatibilité des codages AES et Base64</a></span><span>Article suivant:<a class="dBlack" title="De C# à Go : atteindre la compatibilité des codages AES et Base64" href="http://m.php.cn/fr/faq/1796672838.html">De C# à Go : atteindre la compatibilité des codages AES et Base64</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>Articles Liés</h2><em><a href="http://m.php.cn/fr/article.html" class="bBlack"><i>Voir plus</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="http://m.php.cn/fr/faq/1796672954.html" title="Suivez-moi dans mon voyage d'apprentissage Go" class="aBlack">Suivez-moi dans mon voyage d'apprentissage Go</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/fr/faq/1796673085.html" title="Comment capturer des erreurs spécifiques dans Go ?" class="aBlack">Comment capturer des erreurs spécifiques dans Go ?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/fr/faq/1796673104.html" title="Comment Go parvient-il au polymorphisme sans les mécanismes traditionnels ?" class="aBlack">Comment Go parvient-il au polymorphisme sans les mécanismes traditionnels ?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/fr/faq/1796672838.html" title="Comment concaténer des chaînes efficacement dans les modèles Go ?" class="aBlack">Comment concaténer des chaînes efficacement dans les modèles Go ?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/fr/faq/1796672890.html" title="Comment puis-je concaténer plusieurs images en une seule image à l’aide du package d’images Go ?" class="aBlack">Comment puis-je concaténer plusieurs images en une seule image à l’aide du package d’images Go ?</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><div class="nphpFoot"><div class="nphpFootBg"><ul class="nphpFootMenu"><li><a href="http://m.php.cn/fr/"><b class="icon1"></b><p>Maison</p></a></li><li><a href="http://m.php.cn/fr/course.html"><b class="icon2"></b><p>Cours</p></a></li><li><a href="http://m.php.cn/fr/wenda.html"><b class="icon4"></b><p>Questions et réponses</p></a></li><li><a href="http://m.php.cn/fr/login"><b class="icon5"></b><p>Mon</p></a></li><div class="clear"></div></ul></div></div><div class="nphpYouBox" style="display: none;"><div class="nphpYouBg"><div class="nphpYouTitle"><span onclick="$('.nphpYouBox').hide()"></span><a href="http://m.php.cn/fr/"></a><div class="clear"></div></div><ul class="nphpYouList"><li><a href="http://m.php.cn/fr/"><b class="icon1"></b><span>Maison</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/course.html"><b class="icon2"></b><span>Cours</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/article.html"><b class="icon3"></b><span>Article</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/wenda.html"><b class="icon4"></b><span>Questions et réponses</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/dic.html"><b class="icon6"></b><span>Dictionnaire</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/course/type/99.html"><b class="icon7"></b><span>Manuel</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/xiazai/"><b class="icon8"></b><span>Télécharger</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/fr/faq/zt" title="Sujet"><b class="icon12"></b><span>Sujet</span><div class="clear"></div></a></li><div class="clear"></div></ul></div></div><div class="nphpDing" style="display: none;"><div class="nphpDinglogo"><a href="http://m.php.cn/fr/"></a></div><div class="nphpNavIn1"><div class="swiper-container nphpNavSwiper1"><div class="swiper-wrapper"><div class="swiper-slide"><a href="http://m.php.cn/fr/" >Maison</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/article.html" class="hover">Article</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/wenda.html" >Questions et réponses</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/course.html" >Cours</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/faq/zt" >Sujet</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/xiazai" >Télécharger</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/game" >Jeu</a></div><div class="swiper-slide"><a href="http://m.php.cn/fr/dic.html" >Dictionnaire</a></div><div class="clear"></div></div></div><div class="langadivs" ><a href="javascript:;" class="bg4 bglanguage"></a><div class="langadiv" ><a onclick="javascript:setlang('zh-cn');" class="language course-right-orders chooselan " href="javascript:;"><span>简体中文</span><span>(ZH-CN)</span></a><a onclick="javascript:setlang('en');" class="language course-right-orders chooselan " href="javascript:;"><span>English</span><span>(EN)</span></a><a onclick="javascript:setlang('zh-tw');" class="language course-right-orders chooselan " href="javascript:;"><span>繁体中文</span><span>(ZH-TW)</span></a><a onclick="javascript:setlang('ja');" class="language course-right-orders chooselan " href="javascript:;"><span>日本語</span><span>(JA)</span></a><a onclick="javascript:setlang('ko');" class="language course-right-orders chooselan " href="javascript:;"><span>한국어</span><span>(KO)</span></a><a onclick="javascript:setlang('ms');" class="language course-right-orders chooselan " href="javascript:;"><span>Melayu</span><span>(MS)</span></a><a onclick="javascript:;" class="language course-right-orders chooselan chooselanguage" href="javascript:;"><span>Français</span><span>(FR)</span></a><a onclick="javascript:setlang('de');" class="language course-right-orders chooselan " href="javascript:;"><span>Deutsch</span><span>(DE)</span></a></div></div><script> var swiper = new Swiper('.nphpNavSwiper1', { slidesPerView : 'auto', observer: true,//修改swiper自己或子元素时,自动初始化swiper observeParents: true,//修改swiper的父元素时,自动初始化swiper }); </script></div></div><!--顶部导航 end--><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>