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).
-
hasil <- fmt.Sprintf("Título de %s: %s", url, title): Kami menghantar tajuk yang diekstrak ke saluran hasil, di mana ia akan dibaca kemudian.
fungsi utama
Fungsi utama ialah fungsi utama yang mengkonfigurasi dan mengawal atur cara.
func main() {
url := []rentetan{
"http://olos.novagne.com.br/Olos/login.aspx?logout=true",
"http://sistema.novagne.com.br/novagne/",
}
-
url := []rentetan{...}: Kami mentakrifkan senarai URL yang ingin kami proses. Setiap URL akan dihantar ke goroutine yang akan mengekstrak tajuk halaman.
WaitGroup dan Konfigurasi Saluran
var wg sync.WaitGroup
hasil := make(chan string, len(urls)) // Saluran untuk menyimpan hasil
-
var wg sync.WaitGroup: Kami mencipta tika baharu WaitGroup, yang akan mengawal bilangan goroutin dan memastikan semuanya selesai sebelum program tamat.
-
hasil := make(chan string, len(urls)): Kami mencipta saluran hasil dengan kapasiti yang sama dengan bilangan URL Saluran ini akan menyimpan mesej dengan tajuk atau ralat.
Rumah Goroutines
untuk _, url := url julat {
wg.Tambah(1)
pergi fetchTitle(url, &wg, hasil)
}
-
untuk _, url := url julat: Di sini kita mengulangi setiap URL dalam senarai.
-
wg.Add(1): Untuk setiap URL, kami menambah pembilang WaitGroup untuk menunjukkan bahawa tugas baharu (goroutine) akan dimulakan.
-
go fetchTitle(url, &wg, results): Kami memanggil fetchTitle sebagai goroutine untuk setiap URL, iaitu, kami menjadikannya berjalan selari dengan yang lain.
Menunggu dan Memaparkan Keputusan
wg.Tunggu()
tutup(hasil)
REPO: https://github.com/ionnss/Scrapper-GoRoutine
ion,
hari bumi yang lain
Atas ialah kandungan terperinci Pesaing Scrapper. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan: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