Rumah > Artikel > pembangunan bahagian belakang > Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing
Tidak perlu dikatakan, hanya gunakan ular sawa untuk membuat crawler requests
boleh mengambil alih dunia. Walau bagaimanapun, saya mendengar bahawa pakej terbina dalam http
dalam golang adalah sangat hebat Walaupun saya tidak perlu melakukan apa-apa kerja, saya hanya ingin mempelajari perkara baru dan menyemak titik pengetahuan yang berkaitan dengan permintaan dan tindak balas. protokol http. Tanpa berlengah lagi, mari mulakan dengan
Klik ke bawah artikel ini untuk Bing Wallpapers dan cuba dahulu. Kepala anjing menyelamatkan nyawa Kepala anjing menyelamatkan nyawa Kepala anjing menyelamatkan nyawa
graph TD 请求数据 --> 解析数据 --> 数据入库
Seperti yang anda boleh lihat daripada carta alir di atas, sebenarnya, crawler tidak menyusahkan prosesnya hanya tiga langkah. Seterusnya, mari kita bincangkan tentang perkara yang perlu dilakukan dalam setiap langkah
Meminta data: Di sini kita perlu menggunakan pakej http pakej terbina dalam di golang untuk memulakan permintaan ke alamat sasaran . Langkah ini telah selesai
Menghuraikan data: Di sini kami perlu menghuraikan data yang diminta, kerana kami tidak memerlukan keseluruhan data yang diminta, kami hanya memerlukan data kunci tertentu. Langkah ini juga dipanggil pembersihan data
Storan data: Tidak sukar untuk memahami bahawa ini ialah operasi penyimpanan data yang dihuraikan
Mula-mula pergi ke tapak web rasmi Bing Wallpaper untuk memerhatikan Jika anda seorang perangkak, anda perlu sangat sensitif terhadap data. Ini ialah maklumat halaman utama. Keseluruhan halaman ini sangat ringkas
Seterusnya, anda perlu memanggil alat pembangun penyemak imbas (anda sepatutnya sudah biasa dengan ini. Jika anda tidak biasa dengannya, ia akan sukar untuk diikuti). Hanya tekan F12
atau klik kanan untuk menyemak Tetapi apa? Pada kertas dinding Bing, klik kanan tidak boleh memanggil konsol dan hanya boleh dipanggil secara manual. Jangan risau, ikuti gambar pertama. Jika chrome rakan sekelas dalam bahasa Cina, operasi yang sama dilakukan Pilih lebih banyak alat dan pilih alat pembangun
Tidak mengejutkan, semua orang mesti melihat halaman seperti ini
Tidak mengapa, ia hanyalah beberapa ralat anti-merangkak pada tapak web Bing Wallpaper. (Saya tidak mempunyai ralat anti-merangkak ini semasa saya merangkak lama dahulu) Ini tidak menjejaskan operasi kami
Seterusnya, pilih alat ini untuk membantu kami mencari dengan cepat elemen yang kami mahu Kemudian kami akan Kami boleh mencari maklumat gambar yang kami perlukan
Berikut ialah data untuk merangkak satu halaman
package main import ( "fmt" "github.com/PuerkitoBio/goquery" "io" "io/ioutil" "log" "net/http" "os" "time" ) func Run(method, url string, body io.Reader, client *http.Client) { req, err := http.NewRequest(method, url, body) if err != nil { log.Println("获取请求对象失败") return } req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36") resp, err := client.Do(req) if err != nil { log.Println("发起请求失败") return } if resp.StatusCode != http.StatusOK { log.Printf("请求失败,状态码:%d", resp.StatusCode) return } defer resp.Body.Close() // 关闭响应对象中的body query, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Println("生成goQuery对象失败") return } query.Find(".container .item").Each(func(i int, s *goquery.Selection) { imgUrl, _ := s.Find("a.ctrl.download").Attr("href") imgName := s.Find(".description>h3").Text() fmt.Println(imgUrl) fmt.Println(imgName) DownloadImage(imgUrl, i, client) time.Sleep(time.Second) fmt.Println("-------------------------") }) } func DownloadImage(url string, index int, client *http.Client) { req, err := http.NewRequest("POST", url, nil) if err != nil { log.Println("获取请求对象失败") return } req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36") resp, err := client.Do(req) if err != nil { log.Println("发起请求失败") return } data, err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("读取请求体失败") return } baseDir := "./image/image-%d.jpg" f, err := os.OpenFile(fmt.Sprintf(baseDir, index), os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) if err != nil { log.Println("打开文件失败", err.Error()) return } defer f.Close() _, err = f.Write(data) if err != nil { log.Println("写入数据失败") return } fmt.Println("下载图片成功") } func main() { client := &http.Client{} url := "https://bing.ioliu.cn/?p=%d" method := "GET" Run(method, url, nil, client) }
Berikut ialah rangkak data berbilang halamanKod untuk merangkak berbilang halaman tidak banyak berubah Kita masih perlu memerhatikan ciri-ciri tapak web pertama
Adakah anda menjumpai apa-apa? Halaman pertama p=1, halaman kedua p=2 dan halaman kesepuluh p=10
Jadi kita hanya mulakan gelung for dan kemudian menggunakan semula kod yang merangkak halaman tunggal sebelum ini
// 爬取多页的main函数如下 func main() { client := &http.Client{} url := "https://bing.ioliu.cn/?p=%d" method := "GET" for i := 1; i < 5; i++ { // 实现分页操作 Run(method, fmt.Sprintf(url, i), nil, client) } }
Dalam contoh kami, kami menggunakan pakej alat pihak ketiga untuk menghuraikan data halaman web, kerana menggunakan ungkapan biasa benar-benar terlalu menyusahkan
Pembelajaran yang disyorkan: Tutorial Golang
Atas ialah kandungan terperinci Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!