Go语言---并发版爬虫

并发版爬虫

在上一篇中,简单版的百度贴吧爬虫,我们只能单个进行爬,速度缓慢,利用Go语言的并发特性,我们可以单开辟一个协程进行处理。

package main

import (
	"fmt"
	"net/http"
	"os"
	"strconv"
)

func HttpGet(ur1 string) (result string, err error) {
	resp, err1 := http.Get(ur1)
	if err1 != nil {
		err = err1
		return
	}

	defer resp.Body.Close()

	//读取网页内容
	buf := make([]byte, 1024*4)
	for {
		n, err := resp.Body.Read(buf)
		if n == 0 { //读取结束或者出问题了
			fmt.Println("resp.Body.Read.err=", err)
			break
		}

		result += string(buf[:n])
	}
	return
}

// 爬取一个网页
func SqiderPage(i int, page chan<- int) {
	//明确要在那一个范围进行搜索
	ur1 := "https://tieba.baidu.com/f?ie=utf-8&kw=%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F&pn=" +
		strconv.Itoa((i-1)*50)
	fmt.Printf("正在爬%d页网页:%s\n", i, ur1)

	//爬
	result, err := HttpGet(ur1)
	if err != nil {
		fmt.Println("HttpGet.err=", err)
		return
	}

	//把内容写入文件
	fileName := strconv.Itoa(i) + ".html"
	f, err1 := os.Create(fileName)
	if err1 != nil {
		fmt.Println("os.Create.err1=", err1)
		return
	}
	f.WriteString(result) //写

	f.Close()

	page <- i
}

func DoWork(start, end int) {
	fmt.Printf("正在爬取%d到%d的页面\n", start, end)

	page := make(chan int)
	for i := start; i <= end; i++ {
		go SqiderPage(i, page)
	}

	for i := start; i <= end; i++ {
		//阻塞等待看,避免还没有爬玩就DoWork退出
		fmt.Printf("第%d个页面爬取完成\n", <-page)
	}
}

func main() {
	var start, end int
	fmt.Printf("请输入起始页(>=1):")
	fmt.Scan(&start)
	fmt.Printf("请输入终止页(>=起始页):")
	fmt.Scan(&end)

	DoWork(start, end)
}
  • 与之前不同的是,我们在DoWork中开辟了新的子协程去处理爬虫go SqiderPage(i, page)
  • 为了避免for循环在爬虫没有结束的时候,就退出而导致爬虫失败,我们采用了channel来阻塞等待爬虫成功。
  • 经过测试,并发版的爬虫效率要高很多。

但是目前的爬虫,没有对我们所需的信息进行筛选,下一篇我们会对这一部分进行补充。

相关推荐

  1. Go语言---并发爬虫

    2024-07-17 11:28:07       23 阅读
  2. 使用go并发网络爬虫

    2024-07-17 11:28:07       50 阅读
  3. Go 语言并发的威力

    2024-07-17 11:28:07       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 11:28:07       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 11:28:07       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 11:28:07       58 阅读
  4. Python语言-面向对象

    2024-07-17 11:28:07       69 阅读

热门阅读

  1. 洛阳建筑设计资质市场未来趋势

    2024-07-17 11:28:07       21 阅读
  2. 数学建模中的辅助变量、中间变量、指示变量

    2024-07-17 11:28:07       25 阅读
  3. CSS Modules:重构前端样式的未来?

    2024-07-17 11:28:07       24 阅读
  4. drop、truncate和delete的区别及效率

    2024-07-17 11:28:07       24 阅读
  5. DDD学习笔记七

    2024-07-17 11:28:07       24 阅读
  6. 怎么把VMamba作为Feature Extractor集成到现有模型

    2024-07-17 11:28:07       24 阅读