package main

import(
    "fmt"
    "net/http"
    "io/ioutil"
    "regexp"
    "strings"
)

var href_reg *regexp.Regexp

var hrefs_been_found map[string]int

var hrefs_undone []string

func get_all_href(url string)([]string){
    var ret [] string
    resp,err := http.Get(url)
    if err!=nil {
        fmt.Println(err)
        return ret
    }
    defer resp.Body.Close()
    body,_ := ioutil.ReadAll(resp.Body)

    hrefs := href_reg.FindAllString(string(body),-1)

    for _,v := range hrefs{
        str := strings.Split(v,"\"")[1]

        if len(str)<1{
            continue
        }

        switch str[0]{
        case 'h':
            ret = append(ret,str)
        case '/':
            if len(str)!=1 && str[1]=='/'{
                ret = append(ret,"http:"+str)
            }

            if len(str)!=1 && str[1]!='/'{
                ret = append(ret,url+str[1:])
            }
        default:
            ret = append(ret,url+str)

        }

    }

    return ret
}

func init_global_var(){
    href_pattern :=   "href=\"(.+?)\""
    href_reg = regexp.MustCompile(href_pattern)

    hrefs_been_found = make(map[string]int)
}

func is_href_been_found(href string)bool{
    _,ok := hrefs_been_found[href]
    return ok
}

func add_hrefs_to_undone_list(hrefs []string){
    for _,value := range hrefs {
        ok := is_href_been_found(value)
        if !ok {
            fmt.Printf("new url:(%s)\n",value);
            hrefs_undone = append(hrefs_undone,value)
            hrefs_been_found[value]=1
        }else{
            hrefs_been_found[value]++
        }

    }
}

func main(){
    init_global_var()

    var pos = 0
    var urls = []string{"http://www.baidu.com"}
    add_hrefs_to_undone_list(urls)

    for {
        if pos >= len(hrefs_undone) {
            break
        }
        url:= hrefs_undone[0]
        hrefs_undone = hrefs_undone[1:]

        hrefs := get_all_href(url)
        add_hrefs_to_undone_list(hrefs)
    }
}

Golang 爬虫-广度优先(获取html文档中的超链接)的更多相关文章

  1. java使用正则从爬虫爬的txt文档中提取QQ邮箱

    我的需求是从一堆文档中提取出qq邮箱,写了这篇帖子,希望能帮助和我有一样需求的人,谢谢!...... import java.io.BufferedReader; import java.io.Fil ...

  2. Java解析word,获取文档中图片位置

    前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...

  3. 一个简易的Python爬虫,将爬取到的数据写入txt文档中

    代码如下: import requests import re import os #url url = "http://wiki.akbfun48.com/index.php?title= ...

  4. javaScript获取文档中所有元素节点的个数

    HTML+JS 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. jquery获取元素在文档中的位置信息以及滚动条位置(转)

    jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886     原文链接 原创 201 ...

  6. 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中

    下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...

  7. html中如何获取元素在文档中的位置

    html中如何获取元素在文档中的位置 一.总结 一句话总结: $("#elem").offset().top $("#elem").offset().left ...

  8. Xpath 获取html文档的标签

    1.html page content: <div class="mnr-c _yE"> <div class="_kk _wI">In ...

  9. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

随机推荐

  1. [总结]vue开发常见知识点及问题资料整理(持续更新)

    package.json中的dependencies与devDependencies之间的区别 –save-dev 和 –save 的区别 我们在使用npm install 安装模块或插件的时候,有两 ...

  2. Xcode常用的文件路径

    1.Provisioning Profile文件在哪找? ~/Library/MobileDevice/Provisioning Profiles 2.master 在那找? ~/.cocoapods

  3. WPF控件库:文字按钮的封装

    需求:封装按钮,按钮上面只显示文字.在鼠标移上去.鼠标点击按钮.以及将按钮设为不可用时按钮的背景色和前景色需要发生变化 实现:继承Button类,封装如下6个属性: #region 依赖属性 /// ...

  4. JHipster开发环境安装

    本文演示如何在CentOS7上安装Jhipster以及其依赖组件. 这里采用官方推荐的Yarn安装方法,操作系统版本为CentOS 7.4. 1 安装JDK 推荐版本:OpenJDK 1.8.0-64 ...

  5. [20190226]测试使用bbed恢复索引.txt

    [20190226]测试使用bbed恢复索引.txt --//上午做tab$删除恢复测试时发现,tab$的索引i_tab1很小.可以尝试使用bbed解决这个问题.--//首先在普通表上做一个测试看看. ...

  6. AWS云使用100条宝贵经验分享

    在今天的文章中,我整理出了大量当初曾经错过.而至今仍将我追悔莫及的Amazon Web Services(简称AWS)使用心得.在几年来的实践当中,我通过在AWS之上新手构建及部署各类应用程序而积累到 ...

  7. Android 自定义ListView单击事件失效

    因为自带的listView不能满足项目需求,通过实现自己的Adapter去继承ArrayAdapter 来实现自定义ListView的Item项目. 出现点击ListView的每一项都不会执行setO ...

  8. c/c++ 通用的(泛型)算法 generic algorithm 总览

    通用的(泛型)算法 generic algorithm 总览 特性: 1,标准库的顺序容器定义了很少的操作,比如添加,删除等. 2,问题:其实还有很多操作,比如排序,查找特定的元素,替换或删除一个特定 ...

  9. c/c++ 函数模板初探

    函数模板初探 1,由来:有时候,函数的逻辑是一样的,只是参数的类型不同,比如下面 int Max(int a, int b){ return a > b ? a : b; } double Ma ...

  10. vmWare 虚机文件不能启动的事故处理

    由于公司停电,导致几十台vmWare虚拟机器启动报错. 错误:Failed to power on virtual machine XXX. Failed to lock the file Click ...