go练习:Web 爬虫

该博客介绍了如何使用Go的并发特性构建一个Web爬虫,通过锁和等待组确保并发安全,避免URL重复抓取。文章展示了具体的实现逻辑、优化点、运行结果以及在实现过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这个练习中,我们将会使用 Go 的并发特性来并行化一个 Web 爬虫。

修改 Crawl 函数来并行地抓取 URL,并且保证不重复。

提示:你可以用一个 map 来缓存已经获取的 URL,但是要注意 map 本身并不是并发安全的!

实现逻辑

  1. 采用实现互斥使用map
  2. 增加等待组实现等待线程结束
  3. 使用struct来组合map,锁,等待组三种数据
  4. 为上述struct增加一个exist方法,用于判断url是否存在,不存在则存入且增加等待数量

优势

网上找到同样使用锁+等待组实现的,不过等待组的增加以及访问链接map时使用了两次lock、unlock操作,而两者是可以合并的,本文就是这么处理的。

代码

package main

import (
	"fmt"
	"sync"
)

type Fetcher interface {
   
   
	// Fetch 返回 URL 的 body 内容,并且将在这个页面上找到的 URL 放到一个 slice 中。
	Fetch(url string) (body string, urls []string, err error)
}
type SafeMap struct {
   
   
	v   map[string]int
	mux sync.Mutex    // 访问互斥锁
	wg  sync.WaitGroup  // 等待组
}

func (c *SafeMap) exist(url string) bool {
   
   
	c.mux.Lock()
	defer c.mux.Unlock()
	_, ok := c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值