写了一个用来抓取指定URL内部资源的方法

whispermemory · · 3755 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。
// 目前只是实现了对url下所有子url的抓取。 //todo html package main import ( "fmt" "io/ioutil" // "html/template" "bytes" "net/http" "strings" ) var subSlice []byte var arrIndex int //func analysisHtmlSlice(slice []byte, []string) { //} func exist(url string, arrurl []string) bool { for i := 0; i < len(arrurl); i++ { if strings.EqualFold(url, arrurl[i]) { return true } } return false } func isSubOf(suburl string, url string) bool { return strings.Contains(suburl, url) } func findHref(slice []byte) (offset int, urlSlice []byte) { index := bytes.Index(slice[:], subSlice) if index == -1 { offset = -1 // urlSlice = return } index += 6 indexEnd := bytes.IndexByte(slice[index:], '"') if indexEnd == -1 { offset = -1 // urlSlice = -1; return } indexEnd += index offset = indexEnd + 1 urlSlice = slice[index:indexEnd] return } func recursiveAnalysisUrl(url string, urlArr []string) { r, err := http.Get(url) begin := len(urlArr) fmt.Printf("analysis url:%s, 当前位置:%d\n", url, begin) if err != nil { fmt.Printf("%@", err) return } defer r.Body.Close() slice, _ := ioutil.ReadAll(r.Body) offset := 0 for { var urlstr []byte suboffset, urlstr := findHref(slice[offset:]) if suboffset == -1 { break } offset += suboffset if !exist(string(urlstr), urlArr) && isSubOf(string(urlstr), "http://www.dreamingwish.com/") && !strings.EqualFold(string(urlstr), "http://www.dreamingwish.com/") { // fmt.Printf("around") // urlArr[arrIndex] = string(urlstr) urlArr = append(urlArr, string(urlstr)) // fmt.Printf("around") arrIndex++ fmt.Printf("%d:%s\n", arrIndex-1, string(urlstr)) } } fmt.Printf("begin:%d, end:%d", begin, len(urlArr)) for i := begin; i < len(urlArr); i++ { fmt.Printf("这是第%d个url 到第%d个url-------", begin, len(urlArr)) recursiveAnalysisUrl(urlArr[i], urlArr) } } func main() { subSlice = []byte{'h', 'r', 'e', 'f', '=', '"', 'h', 't', 't', 'p'} arrUrl := make([]string, 0, 50) fmt.Printf("当前位置%d\n", len(arrUrl)) arrIndex := 0 recursiveAnalysisUrl("http://www.dreamingwish.com/", arrUrl) for i := 0; i < arrIndex; i++ { fmt.Println("%s", arrUrl[arrIndex]) } }

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

3755 次点击  
加入收藏 微博
3 回复  |  直到 2013-05-15 09:25:28
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传