Go和JavaScript結合使用:抓取網頁中的影像連結

mmz_77發表於2023-11-07

前言

在當今數字化時代,資料是金錢的源泉,對於許多專案和應用程式來說,獲取並利用網際網路上的資料是至關重要的。其中之一的需求場景是從網頁中抓取圖片連結,這在各種專案中都有廣泛應用,特別是在動漫類圖片收集專案中。

需求場景:動漫類圖片的專案需求

假設我們正在開發一個動漫類圖片收集專案,我們需要從百度圖片搜尋結果中獲取相關圖片的連結。這些連結將用於下載影像並建立我們的圖片資料庫。這個需求背景可以應用於各種領域,從藝術研究到娛樂資訊。

Go和JavaScript結合優點

Go和JavaScript結合使用具有多個優點,尤其適用於網頁內容的抓取和解析任務:

  1. 併發處理 :Go是一門強大的併發程式語言,能夠輕鬆處理多個HTTP請求,從而提高抓取速度。
  2. JavaScript處理 :JavaScript在網頁載入後可以修改DOM(文件物件模型),這對於抓取那些透過JavaScript動態載入的影像連結非常有用。
  3. 豐富的庫支援 :Go和JavaScript都有豐富的庫和工具生態系統,可以輕鬆解決各種問題。
  4. 效能和效率 :Go以其高效的效能而聞名,JavaScript則是Web前端的標配,兩者結合可以在爬取任務中取得理想的效果。

反爬應對策略

在進行網路爬取時,常常會遇到反爬機制,這些機制旨在保護網站免受不合法的資料採集。以下是應對反爬機制的策略:

  1. 使用代理 :配置代理伺服器,隱藏您的真實IP地址,降低被封禁的風險。在完整爬取程式碼中,我們將使用以下代理資訊:
  2. 模擬使用者行為 :透過設定合法的使用者代理(User-Agent)頭,使請求看起來像是由真實的瀏覽器發出的,而不是爬蟲。
  3. 限速 :避免過於頻繁的請求,透過新增延遲或使用定時器來控制爬取速度,以減少被檢測到的風險。
  4. 處理驗證碼和登入 :某些網站可能會要求使用者輸入驗證碼或進行登入才能訪問內容,需要相應的程式碼來處理這些情況。

爬取流程

爬取流程可以分為以下步驟:

  1. 使用Go傳送HTTP請求,獲取百度圖片搜尋結果頁面的HTML內容。
  2. 使用JavaScript解析頁面,提取影像連結。

下面是爬取流程的詳細描述:

步驟1:傳送HTTP請求

首先,我們使用Go來傳送HTTP請求,以獲取百度圖片搜尋結果頁面的HTML內容。這裡使用Go標準庫的net/http包來實現,同時配置代理資訊:

proxyHost := "
proxyPort := "5445"
proxyUser := "16QMSOML"
proxyPass := "280651"
proxyUrl := fmt.Sprintf("http://%s:%s@%s:%s", proxyUser, proxyPass, proxyHost, proxyPort)
proxy := func(_ *http.Request) (*url.URL, error) {
    return url.Parse(proxyUrl)
}
transport := &http.Transport{
    Proxy: proxy,
}
client := &http.Client{
    Transport: transport,
}
url := "https://www.baidu.com/images/search?q=anime"
resp, err := client.Get(url)
defer resp.Body.Close()
if err != nil {
    log.Fatal(err)
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}
// 此時,body中包含了百度圖片搜尋結果頁面的HTML內容

步驟2:使用JavaScript解析頁面

在這一步驟中,我們使用一個Go庫,例如github.com/rogchap/v8go,來執行JavaScript程式碼並解析頁面。以下是一個示例程式碼片段,演示如何使用JavaScript來提取影像連結:

ctx, _ := v8go.NewContext(nil)
_, _ = ctx.RunScript(`
    var images = document.querySelectorAll('img');
    var imageLinks = [];
    for (var i = 0; i < images.length; i++) {
        var src = images[i].src;
        imageLinks.push(src);
    }
    imageLinks;
`, "getImages.js")
result, _ := ctx.RunScript("getImages();", "getImagesCaller.js")
imageLinks, _ := result.ToSlice()
// 現在,imageLinks中包含了從頁面中提取的影像連結
總結
最後,透過將抓取的影像連結用於下載影像,您可以建立您的動漫圖片收集專案。請注意,此示例中的程式碼僅用於演示目的,實際專案中可能需要更多的功能和改進。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31522063/viewspace-2993362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章