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. imagenimagenimagenAsí 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.

  1. Obtenga todos los enlaces de descarga según el rastreador;

  2. Atraviesa todos los enlaces, procesamiento único;

  3. URL-decodifica el enlace para generar un nombre chino;

  4. Determine si el archivo se ha descargado de acuerdo con el nombre del archivo para garantizar la idempotencia;

  5. 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:

imagen

imagen

imagen


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.

imagen


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



Serie de entrevistas de red: Control de flujo TCP

Serie de entrevistas sobre redes: Control de congestión de TCP

Serie de entrevistas sobre algoritmos: impresión secuencial multiproceso

La entrevista de Golang debe preguntar: análisis de escape de memoria

---FINAL---

Tres conexiones con un clic : espero reenviar , mirar y compartir con más estudiantes ~

Cuenta pública : Programador que no usa camisa a cuadros

La reunión es el destino, ¡espero que todos presten un poco de atención ! Su apoyo es mi mayor motivación. Más artículos buenos y de alta calidad están esperando que los explore. Los amo.