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对文档树进行遍历并对标签进行操作的实例,都是最 ...
随机推荐
- 2017-11-07 中文代码示例之Angular入门教程尝试
"中文编程"知乎专栏原址 原文: 中文代码示例教程之Angular尝试 为了检验中文命名在Angular中的支持程度, 把Angular官方入门教程的示例代码中尽量使用了中文命名. ...
- 如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor
要想快速完成一个项目, 自动化是很关键很有用的一块. 自动化测试比人工测试快很多. 特别是在回归测试中. 实践证明, 虽然投入了时间在写自动化测试代码上, 但是在回归测试中节省了大量的时间,同时及时发 ...
- 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 ...
- git 入门教程之github 教程
github 教程 github 是一个基于 git 的代码托管平台,是平时工作学习的好帮手,学会如何用好 github 网站能够帮助我们更好分享代码或者与其他开发人员合作. 注册 github 账号 ...
- C#调用原生C++ COM对象(在C++中实现C#的接口)
为了跨平台在.net core中使用COM,不能使用Windows下的COM注册机制,但是可以直接把IUnknown指针传给C#,转换为指针,再转换为C#的接口(interface). 做了这方面的研 ...
- JHipster生成微服务架构的应用栈(二)- 认证微服务示例
本系列文章演示如何用JHipster生成一个微服务架构风格的应用栈. 环境需求:安装好JHipster开发环境的CentOS 7.4(参考这里) 应用栈名称:appstack 认证微服务: uaa 业 ...
- Linux 无线网卡配置
无线网卡常见的配置选项 某TL-WR842N路由器无线配置选项含义: 无线名称 路由器的无线(Wi-Fi)名称.无线密码 无线加密使用WPA2-PSK/WPA-PSK加密方式.AES加密算法,无线密码 ...
- OAF--基础
OAF是WEB界面,FORM是由JDK将FORM里面的东西插入到HTML UI里的: OAF由 Oracle Business Components for JAVA(BC4J)框架作为其模型部分,完 ...
- Linux文件管理命令 cat
1.cat 命令:将文件内容连接后传送到标准输出或重定向到文件. 1)命令语法格式:cat [OPTION] [FILE]... 2)命令选项参数说明如下所示. -n(number):从第一行开始对文 ...
- windows 解放鼠标快捷键
win+ 调整某个窗口的放大缩小靠边站,最小化 窗口间的切换alt+tablealt (按住)+table(一下)+ 上下左右 alt(一下)+table(一下)相邻切换 alt(按住)+tables ...