Heim  >  Artikel  >  Backend-Entwicklung  >  Scrapper-Konkurrent

Scrapper-Konkurrent

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 15:21:03930Durchsuche

Scrapper Concorrente

Programmziel

Greifen Sie gleichzeitig auf Webseiten zu, um den Titel jeder Seite zu extrahieren und diese Titel im Terminal anzuzeigen. Dies geschieht mithilfe der Parallelität in Go, die Ihnen den gleichzeitigen Zugriff auf mehrere Seiten ermöglicht und so Zeit spart.

Erläuterung des Kodex

Verwendete Pakete

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

fetchTitle-Funktion

Diese Rolle ist verantwortlich für:

  • Zugriff auf eine Webseite (URL)
  • Seitentitel extrahieren
  • Übertragen Sie das Ergebnis auf einen Kanal
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) {
    defer wg.Done() // Marca a goroutine como concluída no WaitGroup

Funktionsparameter:

  • URL-Zeichenfolge: Stellt die Adresse der Webseite (URL) dar, auf die wir zugreifen, um den Titel zu erhalten
  • wg *sync.WaitGroup: Zeiger auf eine WaitGroup, die wir verwenden, um den Abschluss aller gleichzeitig laufenden Aufgaben (Goroutinen) zu synchronisieren. Das * zeigt an, dass wir eine „Adresse“ an WaitGroup übergeben und keine Kopie davon.
  • Ergebnisse chan<- string: Dies ist ein Einwegkanal, der es Ihnen ermöglicht, Strings an einen anderen Teil des Programms zu senden. Es wird verwendet, um Ergebnisse (Titel oder Fehlermeldungen) an die Hauptfunktion zu übergeben

Die Zeile „defer wg.Done()“ weist das Programm an, diese Aufgabe (Goroutine) als abgeschlossen zu markieren, wenn die fetchTitle-Funktion beendet ist. Dies ist wichtig, damit main weiß, wann alle Aufgaben erledigt sind.

HTTP-Anfrage


req, err := http.Get(url)
if err != nil {
Ergebnisse <- fmt.Sprintf("Fehler beim Zugriff auf %s: %v", url, err)
zurück
}
defer req.Body.Close()

  • http.Get(url): Diese Zeile stellt eine HTTP GET-Anfrage an die URL. Das bedeutet, dass wir auf die Seite zugreifen und den Server nach ihrem Inhalt fragen.
  • err != nil: Hier prüfen wir, ob beim Zugriff auf die Seite ein Fehler aufgetreten ist (z. B. wenn die Seite nicht existiert oder der Server nicht antwortet). Im Fehlerfall senden wir eine Nachricht an den Ergebniskanal und beenden die Funktion mit return.
  • defer req.Body.Close(): Dies stellt sicher, dass wir, nachdem wir mit der Verwendung des Seiteninhalts fertig sind, den für die Speicherung zugewiesenen Speicher freigeben.

Statusprüfung


wenn req.StatusCode != 200 {
Ergebnisse <- fmt.Sprintf("Fehler beim Zugriff auf %s: Status %d %s", url, req.StatusCode, req.Status)
zurück
}

  • req.StatusCode != 200: Wir prüfen, ob der Server mit dem Code 200 OK geantwortet hat (zeigt Erfolg an). Wenn es nicht 200 ist, bedeutet das, dass die Seite nicht richtig geladen wurde. Anschließend senden wir eine Fehlermeldung an den Ergebniskanal und beenden die Funktion.

Laden und Suchen von Titeln


doc, err := goquery.NewDocumentFromReader(req.Body)
if err != nil {
Ergebnisse <- fmt.Sprintf("Fehler beim Laden des Dokuments von %s: %v", url, err)
zurück
}
title := doc.Find("title").Text()
Ergebnisse <- fmt.Sprintf("Titel von %s: %s", URL, Titel)
}

  • goquery.NewDocumentFromReader(req.Body): Wir laden den HTML-Inhalt der Seite (bereitgestellt durch req.Body) in goquery, wodurch Sie durch bestimmte Teile des HTML navigieren und diese durchsuchen können.
  • doc.Find("title").Text(): Wir suchen nach dem Tag im HTML der Seite und holen Sie sich den darin enthaltenen Text (d. h. den Titel). </pre> <li> <strong>results <- fmt.Sprintf("Título de %s: %s", url, title)</strong>: Wir senden den extrahierten Titel an den Ergebniskanal, wo er später gelesen wird.</li> <h2> Hauptfunktion </h2> <p>Die Hauptfunktion ist die Hauptfunktion, die das Programm konfiguriert und steuert.</p> <p><br> func main() {<br> URLs := []string{<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>: Wir definieren eine Liste von URLs, die wir verarbeiten möchten. Jede URL wird an eine Goroutine übergeben, die den Seitentitel extrahiert.</li> </ul> <h2> WaitGroup- und Kanalkonfiguration </h2> <p><br> var wg sync.WaitGroup<br> results := make(chan string, len(urls)) // Kanal zum Speichern der Ergebnisse<br> </p> <ul> <li> <strong>var wg sync.WaitGroup</strong>: Wir erstellen eine neue Instanz von WaitGroup, die die Anzahl der Goroutinen steuert und sicherstellt, dass sie alle abgeschlossen werden, bevor das Programm endet.</li> <li> <strong>results := make(chan string, len(urls))</strong>: Wir erstellen einen Ergebniskanal mit einer Kapazität, die der Anzahl der URLs entspricht. Dieser Kanal speichert Nachrichten mit Titeln oder Fehlern.</li> </ul> <h2> Heimat der Goroutinen </h2> <p><br> für _, URL := Bereichs-URLs {<br> wg.Add(1)<br> Gehen Sie fetchTitle(url, &wg, results)<br> }<br> </p> <ul> <li> <strong>for _, url := range urls</strong>: Hier durchlaufen wir jede URL in der Liste.</li> <li> <strong>wg.Add(1)</strong>: Für jede URL erhöhen wir den WaitGroup-Zähler, um anzuzeigen, dass eine neue Aufgabe (Goroutine) gestartet wird.</li> <li> <strong>go fetchTitle(url, &wg, results)</strong>: Wir rufen fetchTitle als <strong>Goroutine</strong> für jede URL auf, das heißt, wir lassen sie parallel zu den anderen laufen.</li> </ul> <h2> Warten und Ergebnisse anzeigen </h2> <p><br> wg.Wait()<br> schließen(Ergebnisse)<br> </p> <hr> <p>REPO: https://github.com/ionnss/Scrapper-GoRoutine</p> <hr> <p>Ionen,</p> <p>ein weiterer Tag der Erde</p> <p>Das obige ist der detaillierte Inhalt vonScrapper-Konkurrent. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!</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>Stellungnahme:</span><div>Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn</div></div></div><div class="nphpSytBox"><span>Vorheriger Artikel:<a class="dBlack" title="Von C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen" href="http://m.php.cn/de/faq/1796672826.html">Von C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen</a></span><span>Nächster Artikel:<a class="dBlack" title="Von C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen" href="http://m.php.cn/de/faq/1796672838.html">Von C# bis Go: AES- und Base64-Kodierungskompatibilität erreichen</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>In Verbindung stehende Artikel</h2><em><a href="http://m.php.cn/de/article.html" class="bBlack"><i>Mehr sehen</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/de/faq/1796672954.html" title="Begleiten Sie mich auf meiner Reise, auf der ich Go lerne" class="aBlack">Begleiten Sie mich auf meiner Reise, auf der ich Go lerne</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1796673085.html" title="Wie erfasse ich bestimmte Fehler in Go?" class="aBlack">Wie erfasse ich bestimmte Fehler in Go?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1796673104.html" title="Wie erreicht Go Polymorphismus ohne traditionelle Mechanismen?" class="aBlack">Wie erreicht Go Polymorphismus ohne traditionelle Mechanismen?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1796672838.html" title="Wie verkette ich Strings in Go-Vorlagen effizient?" class="aBlack">Wie verkette ich Strings in Go-Vorlagen effizient?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/de/faq/1796672890.html" title="Wie kann ich mit dem Go-Image-Paket mehrere Bilder zu einem einzigen Bild verketten?" class="aBlack">Wie kann ich mit dem Go-Image-Paket mehrere Bilder zu einem einzigen Bild verketten?</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/de/"><b class="icon1"></b><p>Heim</p></a></li><li><a href="http://m.php.cn/de/course.html"><b class="icon2"></b><p>Kurs</p></a></li><li><a href="http://m.php.cn/de/wenda.html"><b class="icon4"></b><p>Fragen und Antworten</p></a></li><li><a href="http://m.php.cn/de/login"><b class="icon5"></b><p>Mein</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/de/"></a><div class="clear"></div></div><ul class="nphpYouList"><li><a href="http://m.php.cn/de/"><b class="icon1"></b><span>Heim</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/course.html"><b class="icon2"></b><span>Kurs</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/article.html"><b class="icon3"></b><span>Artikel</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/wenda.html"><b class="icon4"></b><span>Fragen und Antworten</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/dic.html"><b class="icon6"></b><span>Wörterbuch</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/course/type/99.html"><b class="icon7"></b><span>Handbuch</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/xiazai/"><b class="icon8"></b><span>Herunterladen</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/de/faq/zt" title="Thema"><b class="icon12"></b><span>Thema</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/de/"></a></div><div class="nphpNavIn1"><div class="swiper-container nphpNavSwiper1"><div class="swiper-wrapper"><div class="swiper-slide"><a href="http://m.php.cn/de/" >Heim</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/article.html" class="hover">Artikel</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/wenda.html" >Fragen und Antworten</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/course.html" >Kurs</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/faq/zt" >Thema</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/xiazai" >Herunterladen</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/game" >Spiel</a></div><div class="swiper-slide"><a href="http://m.php.cn/de/dic.html" >Wörterbuch</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:setlang('fr');" class="language course-right-orders chooselan " href="javascript:;"><span>Français</span><span>(FR)</span></a><a onclick="javascript:;" class="language course-right-orders chooselan chooselanguage" 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>