关注公众号「不穿格子衫的程序猿」,回复「我要白嫖」免费获取400份资料
前两天有小伙伴发了一个大量免费书籍的网站给小编,作为「张江白嫖王」的小编当然要据为己有啊。 于是乎小编简单地分析了一下。感觉手动下载太慢了,然后就简简单单的写了一个爬虫,感觉效果还不错。本着授人以鱼不如授人以渔的原则,小编将源码分享出来,各位看官大人可以自行实验。同时这些资料也会更新到小编的公众号。
整体架构
代码的整体架构还是很简单滴,主要分为以下几步。
-
根据爬虫获取所有下载链接;
-
遍历所有链接,单个处理;
-
对链接进行URL解码生成中文名;
-
根据文件名判断文件是否已经下载,保证幂等;
-
下载文件并保存;
结果演示
为了演示结果,小编有两个文件提前下载了,如下图:
详细代码
如下为详细代码,除了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份资料
所有资料持续更新,并且免费。请各位小伙伴按需自取哦,当然如果感觉不错,能推荐给身边的小伙伴就更好了。
如果大家有比较好的资源欢迎相互交流,共同提高。同时有部分素材来源于网络,如侵,联删。
往期推荐
求一键三连:希望转发、在看、分享给更多同学哟~
公众号:不穿格子衫的程序猿
文章评论