Golang 爬虫-广度优先(获取html文档中的超链接)
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文档中的超链接)的更多相关文章
- java使用正则从爬虫爬的txt文档中提取QQ邮箱
我的需求是从一堆文档中提取出qq邮箱,写了这篇帖子,希望能帮助和我有一样需求的人,谢谢!...... import java.io.BufferedReader; import java.io.Fil ...
- Java解析word,获取文档中图片位置
前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...
- 一个简易的Python爬虫,将爬取到的数据写入txt文档中
代码如下: import requests import re import os #url url = "http://wiki.akbfun48.com/index.php?title= ...
- javaScript获取文档中所有元素节点的个数
HTML+JS 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- jquery获取元素在文档中的位置信息以及滚动条位置(转)
jquery获取元素在文档中的位置信息以及滚动条位置 http://blog.csdn.net/qq_34095777/article/details/78750886 原文链接 原创 201 ...
- 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中
下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...
- html中如何获取元素在文档中的位置
html中如何获取元素在文档中的位置 一.总结 一句话总结: $("#elem").offset().top $("#elem").offset().left ...
- Xpath 获取html文档的标签
1.html page content: <div class="mnr-c _yE"> <div class="_kk _wI">In ...
- 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)
为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...
随机推荐
- vuejs-指令详解
v-if v-if指令可以完全根据表达式的值在DOM中生成或移除一个元素.如果v-if表达式赋值为false,那么对应的元素就会从DOM中移除:否则,对应元素的一个克隆将被重新插入DOM中,代码如下: ...
- meta、link、script的常用写法
meta 设置编码格式 <meta charset='utf-8'> 设置关键字 <meta name="keywords" content="音乐 播 ...
- neutron 多租户隔离的实现以及子网间路由的实现
1.一个network相当于一个二层网络,使用vxlan 隧道连通所有的CNA节点. 2.一个VPC下有多个network,也就是会分配多个vxlan隧道,这些子网间的路由是通过DVR实现的.DVR就 ...
- MySQL 在Windows平台上的安装及实例多开
MySQL在Windows平台上的安装及实例多开 by:授客 QQ:1033553122 测试环境 Win7 64 mysql-5.7.20-winx64.zip 下载地址: https://cd ...
- Android为TV端助力 转载:内存泄露与内存溢出的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...
- WangleEditor3提交数据(servlet-jsp)
用servlet提交 WangEditor3编辑的内容,找了很多资料没发现,大多用的框架,今天终于解决了,记录一下. WangEditor3不支持放在textarea中,servlet是无法直接获取到 ...
- Testlink1.9.17使用方法(第十章 关键词使用)
第十章 关键词使用:按关键词来搜索用例 QQ交流群:585499566 一. 创建关键字 单击主页“产品管理”区域-->点击[关键字管理]按钮-->创建一个新的关键字.关键字的内容包括:关 ...
- Redis常用命令【列表】
一.简介 基于Linked List实现,元素是字符串类型,列表头尾增删快,中间增删慢,增删元素是常态. 元素可以重复出现,最多包含2^32-1个元素. 二.命令 1.说明 1.1 B block 块 ...
- java----自动类型转换
- [20181105]再论12c set feedback only.txt
[20181105]再论12c set feedback only.txt --//前一阵子的测试,链接:http://blog.itpub.net/267265/viewspace-2216290/ ...