Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing

Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing

青灯夜游
青灯夜游ke hadapan
2023-02-20 19:38:283030semak imbas

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

Gambaran keseluruhan proses perangkak

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

Analisis Praktikal

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 Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing

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 Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding BingPenjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing 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

Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding BingTidak 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 Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing Kemudian kami akan Kami boleh mencari maklumat gambar yang kami perlukan

Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding Bing

Kod pertempuran sebenar

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

Penjelasan terperinci tentang cara menggunakan Golang untuk merangkak kertas dinding BingAdakah 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)
    }
}

Ringkasan

Dalam contoh kami, kami menggunakan pakej alat pihak ketiga untuk menghuraikan data halaman web, kerana menggunakan ungkapan biasa benar-benar terlalu menyusahkan

  • Gunakan pemilih css: goQuery
  • Gunakan pemilih xpath: htmlquery
  • Biasa: pakej terbina dalam, tidak disyorkan, peraturan biasa adalah tidak Mudah ditulis

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!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam