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. JS中的柯里化(currying)

    何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参 ...

  2. Apache Beam WordCount编程实战及源码解读

    概述:Apache Beam WordCount编程实战及源码解读,并通过intellij IDEA和terminal两种方式调试运行WordCount程序,Apache Beam对大数据的批处理和流 ...

  3. Linux 安装 lrzsz,使用 rz、sz 上传下载文件

    yum install -y lrzsz 上传文件到服务器 rz 命令后会出现一个文件选择框,选择.确定即可 从服务器下载文件 sz 文件名即可

  4. Nginx 配置下载附件让浏览器提示用户是否保存

    Nginx配置下载附件让浏览器提示用户是否保存   by:授客  QQ:1033553122   测试环境 nginx-1.10.0 问题描述: 前端页面,IE11浏览器下请求下载附件模板,针对xls ...

  5. Android为TV端助力 内存溢出与内存泄露

    内存溢出就是软件运行需要的内存,超出了java虚拟机给他分配的可用的最大内存 内存泄露就是在缓存图片文字等等的时候,没有关闭流所导致的内存泄露

  6. android Camera相机类

    Camera相机类相关的几个流程方法 Camera.open(cameraId) 打开相机 camera.setDisplayOrientation(0) 设置相机水平方向 mCamera.setPr ...

  7. 全参考视频质量评价方法(PSNR,SSIM)以及与MOS转换模型

    转载处:http://blog.csdn.NET/leixiaohua1020/article/details/11694369 最常用的全参考视频质量评价方法有以下2种: PSNR(峰值信噪比):用 ...

  8. Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )

    第三章 初始配置(配置用户.产品) 一. 设置用户 QQ交流群:585499566 在TestLink系统中,每个用户都可以维护自己的私有信息.admin可以创建用户,但不能看到其它用户的密码.在用户 ...

  9. Android ScrollView内部组件设置android:layout_height="fill_parent"无效的解决办法

    问题:scrollview内部组件都设置了android:layout_height="fill_parent"却没有效果. 解决办法:设置scrollview的fillViewp ...

  10. vue.runtime.esm.js:593 [Vue warn]: Invalid prop: custom validator check failed for prop "value".报错解决

    在uni中使用 picker组件,一直报错 vue.runtime.esm.js:593 [Vue warn]: Invalid prop: custom validator check failed ...