// needException 需要处理异常? // 这里的url可能是: a.com/b/c/d(没有schema), 不是以.html, .css, .js为后缀的 // 那么断定是一个页面, 此时自动生成一个文件名 => a.com/b/c/d/d_leaui_index.html // 生成的文件名都按一个规则即可, 不必事先mapping // 返回一个[]string 待处理的子 func (this *Crawler) do(url string, needException bool) (children []string) { children = nil url = this.trimUrl(url) if this.isNotNeedUrl(url, needException) { return } // 文件是否已存在 // url = a.com/a/?id=12&id=1221, 那么genUrl=a.com/a/index.html?id=121 genUrl := this.genUrl(url) if this.isExists(genUrl) { return } // 得到内容 fullUrl := this.scheme + url if needException { log.Println("正在处理 `异常` " + fullUrl) } else { log.Println("正在处理 " + fullUrl) } content, err := this.getContent(fullUrl) if !needException && (err != nil || content == "") { // !needException防止处理异常时无限循环 this.exceptionUrl[url] = true return } this.hadDoneUrl[url] = true ext := strings.ToLower(filepath.Ext(this.trimQueryParams(url))) // 很可能是a.css?v=1.3 // css文件中 url(../../img/search-icon.png) if ext == ".css" { children = this.doCSS(url, content) return } // 如果是js, image文件就不往下执行了 if util.InArray(this.noChildrenFileExts, ext) { // 保存该文件 if !this.writeFile(url, content) { return } return } if this.t == 1 { // 解析html里的href, src children = this.doHTML(url, genUrl, content) } return }
// 如果url是 a.com/b/c/d // 生成一个文件a.com/b/c/d/d_leaui_index.html // 返回 d_leaui_index.html // 如果不是一个目录, 返回"" func (this *Crawler) genFilename(url string) (string, bool) { urlArr := strings.Split(url, "/") if urlArr != nil { last := urlArr[len(urlArr)-1] ext := strings.ToLower(filepath.Ext(last)) if ext == "" { return this.defaultFilename, true // 需要append到url后面 } else if util.InArray([]string{".php", ".jsp", ".asp", ".aspx"}, ext) { filename := filepath.Base(last) // a.php filename = util.Substr(filename, 0, len(filename)-len(ext)) // a return filename + ".html", false } } return "", true }