Sigue la cuenta oficial "Programa Ape Who Doesn't Wear a Plaid Shirt " y responde " Quiero prostituirme gratis" para obtener 400 datos gratis
Hace dos días, un pequeño amigo envió un sitio web con una gran cantidad de libros gratuitos al editor. Como editor de "Zhangjiang Bai Prostitute", por supuesto, el editor debería quedárselo. Así que hice un análisis simple . Siento que la descarga manual es demasiado lenta, y luego simplemente escribí un rastreador, y el efecto no es malo . Basado en el principio de que es mejor enseñarle a un hombre a pescar que darle un pez, el editor compartirá el código fuente para que puedas experimentar por ti mismo. Al mismo tiempo, esta información también se actualizará en la cuenta pública del editor.
Estructura general
La estructura general del código sigue siendo muy simple, dividida principalmente en los siguientes pasos.
-
Obtenga todos los enlaces de descarga según el rastreador;
-
Atraviesa todos los enlaces, procesamiento único;
-
URL-decodifica el enlace para generar un nombre chino;
-
Determine si el archivo se ha descargado de acuerdo con el nombre del archivo para garantizar la idempotencia;
-
Descargue el archivo y guárdelo;
Presentación de resultados
Para demostrar los resultados, el editor tiene dos archivos descargados previamente, como se muestra a continuación:
Código detallado
El siguiente es el código detallado, excepto que xPach necesita que analicemos la página HTML, el resto no es demasiado difícil.
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
}
regalo de bienestar
Es hora de los beneficios tan esperados. En esta ocasión se presentan 20 casos prácticos de Golang.
Sigue la cuenta oficial "Programa Ape Who Doesn't Wear a Plaid Shirt " y responde " Quiero prostituirme gratis" para obtener 400 datos gratis
Toda la información se actualiza continuamente y es gratuita. Amigos, recojan según sea necesario. Por supuesto, si se siente bien, sería mejor si se lo puede recomendar a sus amigos.
Si tiene mejores recursos, puede comunicarse entre sí y mejorar juntos. Al mismo tiempo, algunos materiales provienen de Internet, como la invasión y la eliminación conjunta .
Recomendado en el pasado
Tres conexiones con un clic : espero reenviar , mirar y compartir con más estudiantes ~
Cuenta pública : Programador que no usa camisa a cuadros