`
david_je
  • 浏览: 373149 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Go写的爬虫

    博客分类:
  • go
Go 
阅读更多
    今天整理资料,惊奇发现去年7月份参加GDG的“七周七语言”活动时候,写的一个Go语言程序的。程序很简单,主要是访问一个博客网站,下载并保存网页,具体要求请见http://be001.com/jams/110

    先上程序:
   
    package main

import (
 "fmt"
 "os"
 "log"
 "net/http"
 "io/ioutil"
 "bytes"
 "encoding/base64"
 "path"
 "strings"
 "regexp"
)

const (
   BASEURL = "http://blog.csdn.net/xushiweizh"
   PATTERN = "href=\"([^<\"]+)\""
   INDEX = len(BASEURL)
   ROOT = "C:/docs/GoCode/disk/"
)

func getContent(url string) string{
     resp,err := http.Get(url)
     if err != nil{
        //handle error
        log.Fatal(err)
     }
     defer resp.Body.Close()
     body,err := ioutil.ReadAll(resp.Body)
     return string(body)
}

func base64Encoding(s string)string{
     var buf bytes.Buffer
     encoder := base64.NewEncoder(base64.StdEncoding, &buf)
     defer encoder.Close()
     encoder.Write([]byte(s))
     return buf.String()
}

func saveFile(content,filename string)error{
     base64Name  := base64Encoding(filename)
     if base64Name == "" {
        return nil
     }
     fout,err := os.Create(path.Join(ROOT,base64Name))
     defer fout.Close()
     if err != nil{
        //handler error
        log.Fatal(err)
        return err
     }
     for _,line := range strings.Split(content,"\r\n"){
        fout.WriteString(line + "\r\n")
     }
     return nil
}

func save(url string,links map[string]bool){
    content := getContent(url)
    err := saveFile(content,url[INDEX:])
    if err != nil{
       log.Fatal(err)
    } 
    links[url]=true
}

func traverse(regxp *regexp.Regexp, url string, links map[string]bool){
   LAST := strings.LastIndex(BASEURL,"/")
     for _, scan := range regxp.FindAllStringSubmatch(getContent(BASEURL),-1){
        var url string
        if strings.Contains(scan[1],"http://"){
           if strings.Contains(scan[1],BASEURL){
               url = scan[1]  
           }else{
             continue
           } 
        }else{
           if strings.Contains(scan[1],BASEURL[LAST:]){
               url = BASEURL[:LAST]+scan[1]
           }else{
             continue
           }
        }
        if v,ok := links[url];ok{
           if v == true {
              fmt.Println("Has download")
           }else{
              save(url,links) 
           }
        }else{
           save(url,links)
        }  
     }
}

func main(){
   links := make(map[string] bool)
   regxp,err := regexp.Compile(PATTERN)
   if err != nil{
      log.Fatal(err)
   }
   traverse(regxp,BASEURL,links)
   for key,val := range links{
       if !val{
          traverse(regxp,key,links)
       }
   }
}


    



分享到:
评论

相关推荐

    go语言实现的简单爬虫来爬取CSDN博文

    如何实现一个爬虫系统或则简单的小脚本?一般是定义一个入口页面,然后一个页面会有其他页面...golang由于其编译速度很快,而且对并发(goroutine)的天然支持,配合chan的协程处理,可以很好地实现一个稳定高效的爬虫系统.

    go语言爬虫

    在"Go语言爬虫"这个项目中,我们可以看到`marmot-master`这个文件夹,这很可能是一个Git仓库的克隆,包含了大神编写的Go语言爬虫代码。`marmot`可能是指该项目的名称,通常开发者会为自己的项目起一个形象且易于记忆...

    golang语言爬虫 并发版爬虫源码

    本主题聚焦于“golang语言爬虫并发版爬虫源码”,这是一份由Google资深工程师深入解析的教程,旨在帮助开发者理解如何利用Go语言的并发特性构建高效的网络爬虫。 Go语言的核心特性之一就是其强大的并发模型,它采用...

    golang语言爬虫 单任务版爬虫源码

    3. **Go语言爬虫实现** - **初始化**:创建URL管理器,通常以种子URL开始。 - **爬虫主循环**:使用goroutine启动下载器,获取网页内容,然后在解析器中提取新的URL并添加到URL管理器。 - **并发控制**:Go语言的...

    golang图片爬虫源码

    golang爬虫源码,支持图片列表以及单页面图片爬取,对于初学者有参考意义。该版本支持采集列表规则,页码{{n}}为变量 如:《https://www.58pic.com/collect/fav-{{n}}.html》 其中n为页码,起始页码一般默认为1 ####...

    使用 Go 写爬虫 —— scrape 闯关.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    Go语言写(爬虫2)

    在本节中,我们将深入探讨如何使用Go语言编写网络爬虫,这主要针对已经具备Go编程基础的开发者。Go语言,又称Golang,是Google推出的一种静态类型、编译型的编程语言,以其高效的性能、简洁的语法和强大的并发能力在...

    golang多线程爬虫

    在IT行业中,Go语言(Golang)因其高效、并发能力强以及强大的标准库而被广泛用于构建网络服务,尤其是爬虫程序。"golang多线程爬虫"项目就是利用Go语言来实现的一个能够同时处理多个任务的网络爬虫,旨在提高数据...

    go语言链接爬虫

    go语言链接爬虫 go语言链接爬虫 go语言链接爬虫 go语言链接爬虫 go语言链接爬虫

    Go-百度云爬虫

    【Go-百度云爬虫】是一种使用Go语言开发的网络爬虫程序,专门针对百度云进行数据抓取。在IT领域,爬虫是自动化获取网页信息的重要工具,它能够高效地遍历网络并提取所需数据。Go语言由于其并发性能优秀、语法简洁...

    go原生爬虫实现 简单爬虫实现代码实例

    在本文中,我们将深入探讨如何使用Go语言(Golang)原生库来实现一个简单的网络爬虫。Go语言因其高效、简洁的语法和强大的并发能力,成为开发爬虫的热门选择。我们将通过一个具体的代码实例来阐述这个过程。 首先,...

    Go-一个轻量级golang爬虫调度包

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。它设计简洁,易于学习,尤其适合处理并发任务,这使得Go成为构建高效网络爬虫的理想选择。 **轻量级爬虫...

    Go语言写(爬虫1)

    在本课程中,我们将深入探讨如何使用Go语言编写网络爬虫。Go语言,又称为Golang,是由Google开发的一种静态类型的、编译型的、并发型的语言,因其...在实践中,不断学习和优化,将使我们成为更优秀的Go语言爬虫开发者。

    ws_Go_websocket_golang_gows爬虫_源码

    标题中的“ws_Go_websocket_golang_gows爬虫”表明这是一个使用Go语言和gows库创建的WebSocket服务,并且与网络爬虫有关。然而,通常WebSocket主要用于提供实时数据流,而非网络爬虫,因此这里可能是指利用WebSocket...

    首次关于Golang高级爬虫实战课程+Golang语言实战应用之Beego轻博客开发教学

    非常难得的关于Golang开发的高级实战课程,之前已经发布了非常多的Go语言基础学习教程,本次的课程是关于实战应用篇的技术教学。课程内容分为两个大的部分,第一部分就是非常重要的第一次关于GO语言的爬虫开发实战...

    golang语言爬虫 获取城市列表和url

    总结起来,这个项目涵盖了Go语言的基本语法、网络请求、HTML解析、并发编程等多个方面,是学习和实践Go语言爬虫开发的一个良好起点。通过这个项目,开发者可以深入了解Go语言在网络爬虫领域的应用,同时提升对HTML...

    golang爬虫库

    "golang爬虫库"是指使用Go语言编写的用于网页抓取和数据提取的工具集合。这些库通常包含了处理HTTP请求、解析HTML文档、管理cookies和session、模拟登录、反反爬虫策略等功能,帮助开发者快速搭建高效稳定的网络爬虫...

    Go-Go语言编写单机版并发版分布式版网络爬虫

    Go语言编写单机版,并发版,分布式版网络爬虫

    微信公众号爬虫 (支持全自动化批量爬取微信公众号所有文章 Go语言实现)

    此项目是微信公众号批量自动化爬虫的核心实现, 面向开发者开源, 可以当做go语言包引入到自己项目中, 完整产品必须二次开发实现,QQ交流群: 563954381 微信的防作弊一直在不断更新完善,过于频繁的抓取可能导致微信...

    Go-爬虫带你了解一下Golang的市场行情

    在当前的IT行业中,Go语言(Golang)作为一门由Google设计的语言,因其简洁的语法、高效的性能以及在并发处理上的出色能力,逐渐受到了开发者们的广泛关注。本篇文章将重点探讨Go语言在Web爬虫领域的应用及其市场...

Global site tag (gtag.js) - Google Analytics