Golang爬虫获取100份数后端资料

2022年2月11日 408点热度 0人点赞 0条评论

关注公众号不穿格子衫的程序猿」,回复我要白嫖」免费获取400份资料

前两天有小伙伴发了一个大量免费书籍的网站给小编,作为「张江白嫖王」的小编当然要据为己有啊。图片图片图片是乎小编简单地分析了一下感觉手动下载太慢了,然后就简简单单的写了一个爬虫,感觉效果还不错本着授人以鱼不如授人以渔的原则,小编将源码分享出来,各位看官大人可以自行实验。同时这些资料也会更新到小编的公众号。



整体架构

代码的整体架构还是很简单滴,主要分为以下几步。

  1. 根据爬虫获取所有下载链接;

  2. 遍历所有链接,单个处理;

  3. 对链接进行URL解码生成中文名;

  4. 根据文件名判断文件是否已经下载,保证幂等;

  5. 下载文件并保存;



结果演示

为了演示结果,小编有两个文件提前下载了,如下图:

图片

图片

图片


详细代码

如下为详细代码,除了xPach需要我们结合HTML页面进行分析,其余的没什么太大的难度。

package main
import ( "bytes" "fmt" "io" "io/ioutil" "net/http" "net/url" "os" "path" "strings"
"github.com/gocolly/colly")
const ( // 文件对应的域名,这里需要自己填写 fileDomain = "https://awesome-programming-books.github.io/" // xPach 这里需要自己分析HTML页面 xPach = "div[class='is-mac'] > ul > li > a")
func main() {
urlList := getUrlList()
// 下载到本地 for _, fileUrl := range urlList {
fileName := returnFileName(fileUrl) // url解码 if fileName == "" { fmt.Println("文件名称异常:", fileUrl) } if fileExist(fileName) { fmt.Println("文件已经存在:", fileName) continue }
fmt.Println("开始下载,文件为:", fileName) err := download(fileUrl, fileName) if err != nil { fmt.Println("下载失败,文件为:", fileName) } }
}
// 爬虫获取func getUrlList() (urlList []string) {
urlList = make([]string, 0)
c := colly.NewCollector() c.OnHTML(xPach, func(e *colly.HTMLElement) { href := e.Attr("href")    // 去掉前缀,每个相对路径前面有【./】。需要去掉,后续拼接 href = strings.Replace(href, "./", "", 1)
urlList = append(urlList, fileDomain+href) })
if err := c.Visit(fileDomain); err != nil { return }
return}
// 生成文件名称func returnFileName(fileUrl string) string { fileName, err := url.QueryUnescape(fileUrl) // url解码 if err != nil { fmt.Println("解析文件名失败,:", err) return "" } fileName = strings.Replace(fileName, fileDomain, "", 1) // 去掉前缀
return path.Base(fileName) // 去掉目录,只保留最后}
// 判断文件是否存在func fileExist(path string) bool { _, err := os.Lstat(path) return !os.IsNotExist(err)}
// 下载文件func download(url, fileName string) (err error) { fileName = path.Base(fileName)
fmt.Println(fileName) out, err := os.Create(fileName) defer out.Close() resp, err := http.Get(url) defer resp.Body.Close() pix, err := ioutil.ReadAll(resp.Body) _, err = io.Copy(out, bytes.NewReader(pix)) return
}


福利赠送

又到了大家期待的福利时间了。本次赠送的是Golang实战案例20份。

图片


关注公众号不穿格子衫的程序猿」,回复我要白嫖」免费获取400份资料


所有资料持续更新,并且免费。请各位小伙伴按需自取哦,当然如果感觉不错,能推荐给身边的小伙伴就更好了。


如果大家有比较好的资源欢迎相互交流,共同提高。同时有部分素材来源于网络,如侵,联删


往期推荐



网络面试系列:TCP流量控制

网络面试系列:TCP拥塞控制

算法面试系列:多线程顺序打印

Golang面试必问——内存逃逸分析

---END---

求一键三连希望转发在看分享给更多同学哟~

公众号:不穿格子衫的程序猿

相逢即是缘分,希望大家给个小小的关注您的支持是我最大的动力,更多优质好文等您来探索,爱你哟。

77120Golang爬虫获取100份数后端资料

这个人很懒,什么都没留下

文章评论