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.js 技术

    本文主要从8个章节详解vue技术揭秘,小编觉得挺有用的,分享给大家. 为了把 Vue.js 的源码讲明白,课程设计成由浅入深,分为核心.编译.扩展.生态四个方面去讲,并拆成了八个章节,如下: 准备工作 ...

  2. 打包错误--Error:A problem was found with the configuration of task ':app:packageRelease'.

    解决办法: app目录下的build.gradle文件 将 shrinkResources 的值改为 false 或者直接去掉 shrinkResources true  表示 :打包的时候会去删除一 ...

  3. 从面向服务架构(SOA)学习:微服务时代应该借鉴的5条经验教训

    [编者按]本文作者为 Matt McLarty,通过介绍 SOA 的兴衰变化,总结了微服务应该借鉴的5条经验教训.文章系国内 ITOM 管理平台 OneAPM 编译呈现. SOA 的兴衰变化让我们更了 ...

  4. [20170603]12c Top Frequency histogram.txt

    ---恢复内容开始--- [20170603]12c Top Frequency histogram.txt --//个人对直方图了解很少,以前2种直方图类型对于目前的许多应用来讲已经足够,或者讲遇到 ...

  5. jQuery ajax()使用serialize()提交form数据到后台

    1.选中要删除的学生信息 2.点击 删除选中 按钮,把复选框中的值取出提交到后台 3.后台获取选中的id 4.前端也跟着删除数据 示例代码: 前端代码: <!DOCTYPE html> & ...

  6. Linux学习历程——Centos 7 man命令

    一.man命令介绍 man,为单词manual的缩写,是linux下的帮助指令. 二.实例 以man命令为例,输入 man  man  获取man命令的帮助文档 可以看出,使用man命令查询到的帮助信 ...

  7. 利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果

    利用系统函数模拟实现nginx 系统脚本启动的特殊颜色专业效果/etc/init.d/nginxd {start/stop/restart/reload}利用if语句实现: ============= ...

  8. Flask中使用cookie和session

    Flask中使用cookie和session 设置cookie from flask import Flask,Response app = Flask(__name__) @app.route('/ ...

  9. PE 添加系统管理员账号(域控可加)转

    使用U盘制作一个PE系统,这里推荐老毛桃或者大白菜:开机进入Bios,选择U盘启动:进入U盘启动画面后,选择一个PE系统:进入PE系统后,我们去本机系统盘,将 C:/Windows/System32/ ...

  10. oracle外部表

    关于外部表的描述 正确描述 the create table as select statement can be used to upload data into a normal table in ...