Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pesaing Scrapper

Pesaing Scrapper

Barbara Streisand
Barbara Streisandasal
2024-11-06 15:21:03930semak imbas

Scrapper Concorrente

Objektif program

Akses halaman web pada masa yang sama untuk mengekstrak tajuk setiap halaman dan memaparkan tajuk ini dalam terminal. Ini dilakukan menggunakan concurrency dalam Go, yang membolehkan anda mengakses berbilang halaman secara serentak, menjimatkan masa.

Penjelasan Kod

Pakej yang digunakan

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

fungsi fetchTitle

Peranan ini bertanggungjawab untuk:

  • Akses halaman web (url)
  • Ekstrak tajuk halaman
  • Evniate hasil ke saluran
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) {
    defer wg.Done() // Marca a goroutine como concluída no WaitGroup

Parameter fungsi:

  • rentetan url: Mewakili alamat halaman web (url) yang akan kami akses untuk mendapatkan tajuk
  • wg *sync.WaitGroup: Penunjuk ke WaitGroup, yang kami gunakan untuk menyegerakkan penyiapan semua tugasan (goroutine) yang berjalan pada masa yang sama. * menunjukkan bahawa kami menghantar "alamat" kepada WaitGroup` dan bukan salinannya.
  • hasil chan<- rentetan: Ini ialah saluran sehala yang membolehkan anda menghantar rentetan ke bahagian lain program. Ia digunakan untuk menghantar hasil (tajuk atau mesej ralat) ke fungsi utama

Barisan tangguh wg.Done() memberitahu program untuk menandakan tugas ini (goroutine) sebagai selesai apabila fungsi fetchTitle selesai. Ini penting supaya main tahu bila semua tugasan telah selesai.

Permintaan HTTP


req, err := http.Get(url)
if err != nil {
hasil <- fmt.Sprintf("Ralat mengakses %s: %v", url, err)
kembali
}
tangguh req.Body.Close()

  • http.Get(url): Baris ini membuat permintaan HTTP GET ke URL. Ini bermakna kami sedang mengakses halaman dan meminta pelayan untuk kandungannya.
  • err != nil: Di sini kami menyemak sama ada terdapat sebarang ralat semasa mengakses halaman (contohnya, jika halaman itu tidak wujud atau pelayan tidak bertindak balas). Jika terdapat ralat, kami menghantar mesej ke saluran hasil dan menamatkan fungsi dengan pulangan.
  • tunda req.Body.Close(): Ini memastikan bahawa selepas kami selesai menggunakan kandungan halaman, kami mengosongkan memori yang diperuntukkan untuk menyimpannya.

Semakan Status


if req.StatusCode != 200 {
hasil <- fmt.Sprintf("Ralat mengakses %s: status %d %s", url, req.StatusCode, req.Status)
kembali
}

  • req.StatusCode != 200: Kami menyemak sama ada pelayan membalas dengan kod 200 OK (menunjukkan kejayaan). Jika bukan 200, ini bermakna halaman tidak dimuatkan dengan betul. Kami kemudian menghantar mesej ralat ke saluran hasil dan menamatkan fungsi.

Pemuatan dan Carian Tajuk


doc, err := goquery.NewDocumentFromReader(req.Body)
if err != nil {
hasil <- fmt.Sprintf("Ralat memuatkan dokumen daripada %s: %v", url, err)
kembali
}
tajuk := doc.Find("title").Teks()
hasil <- fmt.Sprintf("Tajuk %s: %s", url, tajuk)
}

  • goquery.NewDocumentFromReader(req.Body): Kami memuatkan kandungan HTML halaman (disediakan oleh req.Body) ke dalam goquery, yang membolehkan anda menavigasi dan mencari bahagian tertentu HTML.
  • doc.Find("title").Teks(): Kami mencari tag dalam HTML halaman dan dapatkan teks di dalamnya (iaitu tajuk). </pre> <li> <strong>hasil <- fmt.Sprintf("Título de %s: %s", url, title)</strong>: Kami menghantar tajuk yang diekstrak ke saluran hasil, di mana ia akan dibaca kemudian.</li> <h2> fungsi utama </h2> <p>Fungsi utama ialah fungsi utama yang mengkonfigurasi dan mengawal atur cara.</p> <p><br> func main() {<br> url := []rentetan{<br> "http://olos.novagne.com.br/Olos/login.aspx?logout=true",<br> "http://sistema.novagne.com.br/novagne/",<br> }<br> </p> <ul> <li> <strong>url := []rentetan{...}</strong>: Kami mentakrifkan senarai URL yang ingin kami proses. Setiap URL akan dihantar ke goroutine yang akan mengekstrak tajuk halaman.</li> </ul> <h2> WaitGroup dan Konfigurasi Saluran </h2> <p><br> var wg sync.WaitGroup<br> hasil := make(chan string, len(urls)) // Saluran untuk menyimpan hasil<br> </p> <ul> <li> <strong>var wg sync.WaitGroup</strong>: Kami mencipta tika baharu WaitGroup, yang akan mengawal bilangan goroutin dan memastikan semuanya selesai sebelum program tamat.</li> <li> <strong>hasil := make(chan string, len(urls))</strong>: Kami mencipta saluran hasil dengan kapasiti yang sama dengan bilangan URL Saluran ini akan menyimpan mesej dengan tajuk atau ralat.</li> </ul> <h2> Rumah Goroutines </h2> <p><br> untuk _, url := url julat {<br> wg.Tambah(1)<br> pergi fetchTitle(url, &wg, hasil)<br> }<br> </p> <ul> <li> <strong>untuk _, url := url julat</strong>: Di sini kita mengulangi setiap URL dalam senarai.</li> <li> <strong>wg.Add(1)</strong>: Untuk setiap URL, kami menambah pembilang WaitGroup untuk menunjukkan bahawa tugas baharu (goroutine) akan dimulakan.</li> <li> <strong>go fetchTitle(url, &wg, results)</strong>: Kami memanggil fetchTitle sebagai <strong>goroutine</strong> untuk setiap URL, iaitu, kami menjadikannya berjalan selari dengan yang lain.</li> </ul> <h2> Menunggu dan Memaparkan Keputusan </h2> <p><br> wg.Tunggu()<br> tutup(hasil)<br> </p> <hr> <p>REPO: https://github.com/ionnss/Scrapper-GoRoutine</p> <hr> <p>ion,</p> <p>hari bumi yang lain</p> <p>Atas ialah kandungan terperinci Pesaing Scrapper. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!</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>Kenyataan:</span><div>Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn</div></div></div><div class="nphpSytBox"><span>Artikel sebelumnya:<a class="dBlack" title="Dari C# to Go: Mencapai Keserasian Pengekodan AES dan Base64" href="http://m.php.cn/ms/faq/1796672826.html">Dari C# to Go: Mencapai Keserasian Pengekodan AES dan Base64</a></span><span>Artikel seterusnya:<a class="dBlack" title="Dari C# to Go: Mencapai Keserasian Pengekodan AES dan Base64" href="http://m.php.cn/ms/faq/1796672838.html">Dari C# to Go: Mencapai Keserasian Pengekodan AES dan Base64</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>Artikel berkaitan</h2><em><a href="http://m.php.cn/ms/article.html" class="bBlack"><i>Lihat lagi</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/ms/faq/1796672954.html" title="Ikuti saya dalam perjalanan saya belajar Pergi" class="aBlack">Ikuti saya dalam perjalanan saya belajar Pergi</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ms/faq/1796673085.html" title="Bagaimanakah saya boleh Menangkap Ralat Khusus dalam Go?" class="aBlack">Bagaimanakah saya boleh Menangkap Ralat Khusus dalam Go?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ms/faq/1796673104.html" title="Bagaimana Mencapai Polimorfisme Tanpa Mekanisme Tradisional?" class="aBlack">Bagaimana Mencapai Polimorfisme Tanpa Mekanisme Tradisional?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ms/faq/1796672838.html" title="Bagaimana untuk Menggabungkan Rentetan dengan Cekap dalam Templat Go?" class="aBlack">Bagaimana untuk Menggabungkan Rentetan dengan Cekap dalam Templat Go?</a><div class="clear"></div></li><li><b></b><a href="http://m.php.cn/ms/faq/1796672890.html" title="Bagaimanakah saya boleh menggabungkan berbilang imej ke dalam satu imej menggunakan pakej imej Go?" class="aBlack">Bagaimanakah saya boleh menggabungkan berbilang imej ke dalam satu imej menggunakan pakej imej 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/ms/"><b class="icon1"></b><p>Rumah</p></a></li><li><a href="http://m.php.cn/ms/course.html"><b class="icon2"></b><p>Kursus</p></a></li><li><a href="http://m.php.cn/ms/wenda.html"><b class="icon4"></b><p>Soal Jawab</p></a></li><li><a href="http://m.php.cn/ms/login"><b class="icon5"></b><p>saya</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/ms/"></a><div class="clear"></div></div><ul class="nphpYouList"><li><a href="http://m.php.cn/ms/"><b class="icon1"></b><span>Rumah</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/course.html"><b class="icon2"></b><span>Kursus</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/article.html"><b class="icon3"></b><span>Artikel</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/wenda.html"><b class="icon4"></b><span>Soal Jawab</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/dic.html"><b class="icon6"></b><span>Kamus</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/course/type/99.html"><b class="icon7"></b><span>Manual</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/xiazai/"><b class="icon8"></b><span>Muat turun</span><div class="clear"></div></a></li><li><a href="http://m.php.cn/ms/faq/zt" title="Topik"><b class="icon12"></b><span>Topik</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/ms/"></a></div><div class="nphpNavIn1"><div class="swiper-container nphpNavSwiper1"><div class="swiper-wrapper"><div class="swiper-slide"><a href="http://m.php.cn/ms/" >Rumah</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/article.html" class="hover">Artikel</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/wenda.html" >Soal Jawab</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/course.html" >Kursus</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/faq/zt" >Topik</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/xiazai" >Muat turun</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/game" >Permainan</a></div><div class="swiper-slide"><a href="http://m.php.cn/ms/dic.html" >Kamus</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:;" class="language course-right-orders chooselan chooselanguage" 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: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>