go利用x/net/html包实现的蜘蛛
2016-07-21 10:46
477 查看
看了网上很多个spider版本, 几乎都是使用regexp包正则匹配实现.
其实使用DOC, 性能更好, 也更优雅
其实使用DOC, 性能更好, 也更优雅
package main import ( "fmt" "net/http" "os" "golang.org/x/net/html" ) func visit(links []string, n *html.Node) []string { if n.Type == html.ElementNode && n.Data == 'a' { for _, a := range n.Attr { if a.Key == "href" { links = append(links, a.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { links = visit(links, c) } return links } func main() { for _, url := range os.Args[1:] { links, err := findLinks(url) if err != nil { fmt.Fprintf(os.Stderr, "findlinks2: %v\n", err) continue } for _, link := range links { fmt.Println(link) } } } func findLinks(url string) ([]string, error) { resp, err := http.Get(url) if err != nil { return nil, err } if resp.StatusCode != http.StatusOK { resp.Body.Close() return nil, fmt.Errorf("getting %s: %s", url, resp.Status) } doc, err := html.Parse(resp.Body) resp.Body.Close() if err != nil { return nil, fmt.Errorf("pax resing %s as HTML: %v", url, err) } return visit(nil, doc), nil }
相关文章推荐
- HTML 引用资源路径整理
- 解决Ckeditor编辑器不显示html实体,自动过滤html的问题
- iphone上对于动态生成的html元素绑定点击事件$(document).click()失效解决办法
- Html body的滚动条禁止与启用
- 使用FreeMarker生成静态HTML
- html头文件中的 content = "IE=edge,chrome=1"
- html常见布局问题
- 认识html文件基本结构
- 嵌入在html页面中图像格式的区别与选用
- HTML 基础 元素 属性 标题
- 自定义Html标签方式
- HTML DOM addEventListener() 方法
- <!DOCTYPE>的含义及用法
- html音频音量调节
- html 图片垂直居中
- HTML基础篇(标签和属性整--已剔除不被浏览器支持的部分)
- 网页图片的懒加载和预加载
- html替换和不可替换元素
- html中显示xml
- HTML 特殊符号编码对照表