首页 > 后端开发 > Golang > 正文

刮板竞争对手

Barbara Streisand
发布: 2024-11-06 15:21:03
原创
929 人浏览过

Scrapper Concorrente

计划目标

同时访问网页,提取每个页面的标题,并将这些标题显示在终端中。这是使用 Go 中的并发性完成的,它允许您同时访问多个页面,从而节省时间。

守则解释

使用的包

import (
    "fmt"
    "net/http"
    "sync"
    "github.com/PuerkitoBio/goquery"
)
登录后复制

获取标题函数

该角色负责:

  • 访问网页(url)
  • 提取页面标题
  • 将结果转移到通道
func fetchTitle(url string, wg *sync.WaitGroup, results chan<- string) {
    defer wg.Done() // Marca a goroutine como concluída no WaitGroup
登录后复制

函数参数:

  • url string: 代表我们要访问获取标题的网页地址(url)
  • wg *sync.WaitGroup:指向 WaitGroup 的指针,我们用它来同步同时运行的所有任务(goroutines)的完成。 * 表示我们正在向 WaitGroup` 传递一个“地址”,而不是它的副本。
  • results chan

defer wg.Done() 行告诉程序在 fetchTitle 函数完成时将此任务(goroutine)标记为已完成。这很重要,以便 main 知道所有任务何时完成。

HTTP请求


请求,错误:= http.Get(url)
if err != nil {
结果 返回
}
延迟 req.Body.Close()

  • http.Get(url):此行向 URL 发出 HTTP GET 请求。这意味着我们正在访问该页面并向服务器询问其内容。
  • err != nil:这里我们检查访问页面时是否有错误(例如页面不存在或服务器没有响应)。如果出现错误,我们会向结果通道发送一条消息,并以 return 结束函数。
  • defer req.Body.Close():这确保我们使用完页面内容后,释放分配来存储它的内存。

状态检查


if req.StatusCode != 200 {
results 返回
}

  • req.StatusCode != 200:我们检查服务器是否响应代码 200 OK(表示成功)。如果不是 200,则表示页面未正确加载。然后我们向结果通道发送一条错误消息并终止该函数。

标题加载和搜索


doc, err := goquery.NewDocumentFromReader(req.Body)
if err != nil {
results 返回
}
标题 := doc.Find("标题").Text()
结果 }

  • goquery.NewDocumentFromReader(req.Body):我们将页面的 HTML 内容(由 req.Body 提供)加载到 goquery 中,它允许您导航和搜索 HTML 的特定部分。
  • doc.Find("title").Text(): 我们寻找标签 ;在页面的 HTML 中并获取其中的文本(即标题)。
  • results :我们将提取的标题发送到结果通道,稍后将在其中读取。

主要功能

main函数是配置和控制程序的主函数。


func main() {
url := []字符串{
"http://olos.novagne.com.br/Olos/login.aspx?logout=true",
“http://sistema.novagne.com.br/novagne/”,
}

  • urls := []string{...}:我们定义要处理的 URL 列表。每个 URL 将被传递到一个 goroutine,该 goroutine 将提取页面标题。

WaitGroup 和通道配置


var wgsync.WaitGroup
results := make(chan string, len(urls)) // 存储结果的通道

  • var wgsync.WaitGroup:我们创建一个新的 WaitGroup 实例,它将控制 goroutine 的数量并确保它们在程序结束之前全部完成。
  • results := make(chan string, len(urls)):我们创建一个容量等于 URL 数量的结果通道。该通道将存储带有标题或错误的消息。

Goroutines 之家


对于 _, url := 范围 url {
wg.Add(1)
去 fetchTitle(url, &wg, 结果)
}

  • for _, url := range urls:这里我们循环遍历列表中的每个 URL。
  • wg.Add(1):对于每个 URL,我们递增 WaitGroup 计数器以指示将启动一个新任务(goroutine)。
  • go fetchTitle(url, &wg, results):我们将 fetchTitle 称为每个 URL 的 goroutine,也就是说,我们让它与其他 URL 并行运行。

等待并显示结果


wg.Wait()
关闭(结果)


回购:https://github.com/ionnss/Scrapper-GoRoutine


离子,

又一个地球日

以上是刮板竞争对手的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!