爬取 BILIBILI 专栏图片的程序
利用 go 语言,获取哔哩哔哩专栏的图片,lsp再也不用手动一个个下载了。。。。
用到的都是 go 语言自带的包,放心食用
完整代码package main import ( “fmt” “io/ioutil” “net/http” “os” “regexp” “strings” )
// 定义根路径 var rootPath = “./imgs”
func SaveImg(url string, page chan string) { name := url[strings.LastIndex(url, “/”)+1:] // fmt.Println(name) 获取保存的名字
if url[:4] != “http” { url = “http:” + url // 添加 http 前缀 }
content, err := HttpGet(url) if err != nil { fmt.Println(“img get err:”, err) return }
path := rootPath + name f, err := os.Create(path) // 创建图片文件 if err != nil { fmt.Println(path+” err:”, err) return } defer f.Close() // 关闭
f.Write(content) // 写入 page <- name // 发送 }
func HttpGet(url string) (result []byte, err error) { req, _ := http.NewRequest(“GET”, url, nil) // 创建请求对象 req.Header.Add(“User-Agent”, “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36 Edg/89.0.774.50”)
client := &http.Client{} // 创建客户端 resp, err := client.Do(req) // 发送请求 if err != nil { fmt.Println(“request err”, err) return } if resp.Status != “200 OK” { err = fmt.Errorf(url + ” >>>> ” + resp.Status) return }
defer resp.Body.Close()
result, err = ioutil.ReadAll(resp.Body) if err != nil { fmt.Println(“err”, err) return }
return }
func main() { // cv := “cv6597100” var cv string var fn string if len(os.Args) == 1 { fmt.Println(“输入cv号:”) fmt.Scan(&cv) fn = cv } else if len(os.Args) == 2 { cv = os.Args[1] fn = cv } else if len(os.Args) == 3 { cv = os.Args[1] rootPath = os.Args[2] fn = cv } else if len(os.Args) == 4 { cv = os.Args[1] rootPath = os.Args[2] fn = os.Args[3] } else { fmt.Println(“err”) return }
url := “https://www.bilibili.com/read/” + cv cont, err := HttpGet(url) if err != nil { fmt.Println(“err:”, err) return }
result := string(cont) // 正则匹配 图片 url ret1 := regexp.MustCompile(`(//i0.hdslb.com/bfs/article/.*?[j|p|g][p|n|i][g|f])`) alls := ret1.FindAllStringSubmatch(result, -1) // fmt.Println(alls)
page := make(chan string) n := len(alls) //创建保存图片的文件夹 rootPath = rootPath + “/” + fn + “/” os.MkdirAll(rootPath, 777) for _, imgURL := range alls { // fmt.Println(imgURL[1]) go SaveImg(imgURL[1], page) // 获取图片 }
for i := 0; i < n; i++ { fmt.Printf(“%s 下载完成n”, <-page) // 接收消息 }
}
有什么建议意见请留言讨论
谢谢观看
浪费了你人生中的几百秒真的很抱歉。。。
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试