设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间00 现在时间00 缓存数据 对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

对自己狠一点,逼自己努力,再过几年你将会感谢今天发狠的自己、恨透今天懒惰自卑的自己。晚安!

查看: 5592|回复: 8

Go语言并发爬虫的具体实现

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:233
  • 打卡月天数:0
  • 打卡总奖励:3606
  • 最近打卡:2024-03-31 09:09:39
等级头衔

等級:晓枫资讯-上等兵

在线时间
78 小时

积分成就
威望
0
贡献
618
主题
642
精华
0
金钱
5820
积分
1331
注册时间
2022-12-29
最后登录
2025-8-23

发表于 2023-5-15 20:52:32 | 显示全部楼层 |阅读模式
写在前面
  1. 这篇文章主要让大家明白[code]多线程爬虫
复制代码
,因为go语言实现并发是很容易的。[/code]这次的服务端,是我们之前搭建的电子商城平台,所以我们不担心
  1. ip被封
复制代码
之类的问题。
而实际生产环境中,其实我们都是用
  1. python
复制代码
爬虫的。python实现多线程也很简单。
  1. 这次我们可以试试新玩法,试试go语言的并发爬虫。
复制代码
主要是爬取第一页的商品,爬取十次,比较单线程和多线程的时间。

1. 单线程爬虫

 定义一个用户
  1. var Client http.Client
复制代码
主函数
  1. func main() {
  2.         url := "http://localhost:3000/api/v1/products"
  3.         start := time.Now()
  4.         for i := 0; i < 10; i++ {
  5.                 Spider(url, i)
  6.         }
  7.         elapsed := time.Since(start)
  8.         fmt.Printf("Time %s", elapsed)
  9. }
复制代码
爬取函数
  1. func Spider(url string, i int) {
  2.         reqSpider, err := http.NewRequest("GET", url, nil)
  3.         if err != nil {
  4.                 log.Fatal(err)
  5.         }
  6.         reqSpider.Header.Set("content-length", "0")
  7.         reqSpider.Header.Set("accept", "*/*")
  8.         reqSpider.Header.Set("x-requested-with", "XMLHttpRequest")
  9.         respSpider, err := Client.Do(reqSpider)
  10.         if err != nil {
  11.                 log.Fatal(err)
  12.         }
  13.         bodyText, _ := ioutil.ReadAll(respSpider.Body)
  14.         var result Result
  15.         _ = json.Unmarshal(bodyText, &result)
  16.         fmt.Println(i,result.Data)
  17. }
复制代码
运行时间为:
  1. 651.8207ms
复制代码
215251sf313dc2uulfctjd.jpeg


2. 多线程爬虫


2.1 channel main函数

我们构造一个无缓冲的通道,来阻塞主进程,等待子进程的执行。
  1. func main() {
  2.         url := "http://localhost:3000/api/v1/products"
  3.         ch := make(chan bool)
  4.         start := time.Now()
  5.         for i := 0; i < 10; i++ {
  6.                 go Spider(url, ch, i)
  7.         }
  8.         for i := 0; i < 10; i++ {
  9.                 <-ch
  10.         }
  11.         elapsed := time.Since(start)
  12.         fmt.Printf("Time %s", elapsed)
  13. }
复制代码
最后记得在爬虫的结束的时候,把值写入到通道中,不然会一直阻塞主进程
215251n45twt2zst2iemqm.jpeg

运行时间:
  1. 187.7921ms
复制代码
比之前快了非常多。
215251suso3ao93z332d9u.jpeg


2.2 sync.WaitGroup

定义一个进程组并加10个进程
  1.         var wg sync.WaitGroup
  2.         wg.Add(10)
复制代码
开辟十个goruntime
  1.         for i := 0; i < 10; i++ {
  2.                 go func(i int) {
  3.                         defer wg.Done()
  4.                         SpiderWaitGroup(url,i)
  5.                 }(i)
  6.         }
复制代码
阻塞主进程
  1. wg.Wait()
复制代码
结果:
  1. 64.5246ms
复制代码
215252zi988bc3n3c81yo3.jpeg


3. 源码地址

GitHub地址:https://github.com/CocaineCong/Go-Spider-Demo
  1.         NormalStart(url) // 单线程爬虫
  2.         ChannelStart(url) // Channel多线程爬虫
  3.         WaitGroupStart(url) // Wait 多线程爬虫
复制代码
其实多线程的两种都差不多的,只是有时候会因为机器的原因而导致一些误差。
215252oi7o8iededidtzgf.jpeg

到此这篇关于Go语言并发爬虫的具体实现的文章就介绍到这了,更多相关Go语言并发爬虫 内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:常驻代表
  • 打卡总天数:30
  • 打卡月天数:0
  • 打卡总奖励:391
  • 最近打卡:2025-10-31 11:55:29
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
446
积分
62
注册时间
2023-3-5
最后登录
2025-10-31

发表于 2023-6-12 13:55:34 | 显示全部楼层
感谢分享~~~~学习学习~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-10-4 04:40:36 | 显示全部楼层
谢谢分享~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2023-10-5 04:33:27 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2023-10-12 04:39:24 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-25
最后登录
2022-12-25

发表于 2023-10-29 20:26:30 | 显示全部楼层
感谢大大分享~~~~~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
23
积分
26
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2023-11-1 20:38:11 | 显示全部楼层
看看,学习学习~~~~
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-28
最后登录
2022-12-28

发表于 2023-11-3 17:32:05 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
16
积分
12
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2024-1-20 00:46:30 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
6楼
7楼
8楼
9楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表