golang 并发爬虫

golang 并发爬虫

之前的一篇文章中展示了一个使用 python 和 aiohttp 搭建的并发爬虫,这篇文章使用 golang 实现同样的功能,旨在理解 python async 异步和 golang 异步编程之间的差别.

代码

package main

import (
    json "encoding/json"
    "fmt"
    ioutil "io/ioutil"
    "net/http"
)

func httpGet(url string) (result []byte, err error) {
    resp, err1 := http.Get(url)
    if err1 != nil {
        err = err1
        return
    }

    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    return body, err
}

func get36kr(page int, ch chan map[string]interface{}) map[string]interface{} {
    var mapResult map[string]interface{}
    url := fmt.Sprintf("https://36kr.com/api/search-column/mainsite?per_page=1&page=%d", page)
    resp, err := httpGet(url)
    if err == nil {
        json.Unmarshal(resp, &mapResult)
    }
    return mapResult
}

func main() {
    // 使用通道进行通信
    ch := make(chan map[string]interface{})
    totalPage := 100
    donePageCount := 0
    var itemList []map[string]interface{}

    for i := 1; i <= totalPage; i++ {
        go func() {
            ch <- get36kr(i, ch)
        }()
    }

    // 汇总结果
    for {
        donePageCount++
        data := <-ch
        itemList = append(itemList, data)
        if donePageCount == totalPage {
            str, _ := json.MarshalIndent(&itemList, "", "  ")
            fmt.Println(string(str))
            break
        }
    }
}

原文地址:https://www.cnblogs.com/aloe-n/p/11153090.html

时间: 2024-10-17 09:31:26

golang 并发爬虫的相关文章

golang并发编程

golang并发编程 引子 golang提供了goroutine快速实现并发编程,在实际环境中,如果goroutine中的代码要消耗大量资源时(CPU.内存.带宽等),我们就需要对程序限速,以防止goroutine将资源耗尽.以下面伪代码为例,看看goroutine如何拖垮一台DB.假设userList长度为10000,先从数据库中查询userList中的user是否在数据库中存在,存在则忽略,不存在则创建. //不使用goroutine,程序运行时间长,但数据库压力不大 for _,v:=ra

Golang 网络爬虫框架gocolly/colly 二 jQuery selector

Golang 网络爬虫框架gocolly/colly 二 jQuery selector colly框架依赖goquery库,goquery将jQuery的语法和特性引入到了go语言中.如果要灵活自如地采集数据,首先要了解jQuery选择器.以下内容是翻译jQuery官方网站 <Category: Selectors>章节内容: Category: Selectors Borrowing from CSS 1–3, and then adding its own, jQuery offers

Golang 简单爬虫实现,爬取小说

为什么要使用Go写爬虫呢? 对于我而言,这仅仅是练习Golang的一种方式. 所以,我没有使用爬虫框架,虽然其很高效. 为什么我要写这篇文章? 将我在写爬虫时找到资料做一个总结,希望对于想使用Golang写爬虫的你能有一些帮助. 爬虫主要需要解决两个问题: 获取网页 解析网页 如果这两个都无法解决的话就没法再讨论其他了. 开发一个爬取小说网站的爬虫会是一个不错的实践. 这是两个实例: Golang 简单爬虫实现 golang 用/x/net/html写的小爬虫,爬小说 这是需要的两个项目: go

golang 并发顺序输出数字

参考 package main import ( "fmt" "sync/atomic" "time" ) func main() { var count uint32 trigger := func(i uint32, fn func()) { for { if n := atomic.LoadUint32(&count); n == i { fn() atomic.AddUint32(&count, 1) break } ti

马蜂窝搜索基于 Golang 并发代理的一次架构升级

搜索业务是马蜂窝流量分发的重要入口.很多用户在使用马蜂窝时,都会有目的性地主动搜索与自己旅行需求相关的各种信息,衣食住行,事无巨细,从而做出最符合需求的旅行决策. 因此在马蜂窝,搜索业务交互的下游模块非常多,主要有目的地.POI.热门景点.美食.商场.酒店.问答.攻略.机票火车票等等,通过实时.精准地返回搜索结果,帮助用户做出个性化旅行决策. 面对越来越高的流量,马蜂窝技术团队积极尝试对搜索架构进行优化和升级,来保证搜索业务的稳定和性能. 方案背景 由于历史原因,优化前的搜索服务与下游模块交的互

Golang并发中channel的分析

问题:面对并发问题,是用channel解决,还是用Mutex解决? 如果自己心里还没有清晰的答案,那就读下这篇文章,你会了解到: 使用channel解决并发问题的核心思路和示例 channel擅长解决什么样的并发问题,Mutex擅长解决什么样的并发问题 一个并发问题该怎么入手解解决 一个重要的plus思维 前戏 前面很多篇的文章都在围绕channel介绍,而只有前一篇sync的文章介绍到了Mutex,不是我偏心,而是channel在Golang是first class级别的,设计在语言特性中的,

Golang并发模型:select进阶

前一篇文章<Golang并发模型:轻松入门select>介绍了select的作用和它的基本用法,这次介绍它的3个进阶特性. nil的通道永远阻塞 如何跳出for-select select{}阻塞 nil的通道永远阻塞 当case上读一个通道时,如果这个通道是nil,则该case永远阻塞.这个功能有1个妙用,select通常处理的是多个通道,当某个读通道关闭了,但不想select再继续关注此case,继续处理其他case,把该通道设置为nil即可.下面是一个合并程序等待两个输入通道都关闭后才退

golang版并发爬虫

准备爬取内涵段子的几则笑话,先查看网址:http://www.budejie.com/text/ 简单分析后发现每页的url呈加1趋势 第一页: http://www.budejie.com/text/1 第二页:http://www.budejie.com/text/2 ... 每页的段子: <a href="/detail-28278217.html"> 内容</a> <a href="/detail-28270675.html"&

用golang写爬虫

我是在windows系统上安装的go,使用goland编辑. Hello world: package main import "fmt" func main() { fmt.Println("Hello, world") } ctrl+alt+f10运行 下载网页 这里先从Golang原生http库开始,直接使用 net/http 包内的函数请求 import "net/http" ... resp, err := http.Get("