Перейти к основному содержанию
Go - отличный выбор для создания высокопроизводительных параллельных веб-парсеров. Интеграция прокси Catproxy выполняется просто с помощью пакета стандартной библиотеки net/http путем настройки пользовательского http.Transport.

Базовая настройка

Ключ к использованию прокси с аутентификацией в Go - создание пользовательского http.Client с Transport, в котором установлено поле Proxy.
basic_setup.go
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func main() {
    // 1. Скопируйте их со страницы «Настройки прокси» вашего прокси
    proxyHost := "proxy.catproxy.net"
    proxyPort := 5555
    proxyUser := "PROXY_USERNAME"
    proxyPass := "PROXY_PASSWORD"

    // 2. Соберите URL прокси с учётными данными
    proxyURLString := fmt.Sprintf("http://%s:%s@%s:%d", proxyUser, proxyPass, proxyHost, proxyPort)
    proxyURL, err := url.Parse(proxyURLString)
    if err != nil {
        log.Fatalf("Failed to parse proxy URL: %v", err)
    }

    // 3. Создайте кастомный HTTP-транспорт и задайте прокси
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    // 4. Создайте HTTP-клиент на основе этого транспорта
    client := &http.Client{
        Transport: transport,
    }

    // 5. Отправьте запрос!
    fmt.Println("Making request to IP checker...")
    resp, err := client.Get("https://api.ipify.org?format=json")
    if err != nil {
        log.Fatalf("Failed to make request: %v", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed to read response body: %v", err)
    }

    fmt.Printf("Success! Your proxy IP is: %s\n", string(body))
}

Пример из реальной практики: парсинг заголовков Hacker News

Давайте создадим простое, но эффективное приложение на Go для парсинга заголовков лучших историй с главной страницы Hacker News (news.ycombinator.com). Это классическая цель для парсинга. Этот пример демонстрирует, как создать повторно используемую функцию для парсинга, что позволяет легко адаптировать ее для других целей. Мы будем работать с Hacker News так, как будто находимся в Великобритании (GB).
В этом примере используется пакет goquery для удобного парсинга HTML, аналогичного jQuery. Установите его командой: go get github.com/PuerkitoBio/goquery
hn_scraper.go
package main

import (
    "fmt"
    "log"
    "net/http"
    "net/url"

    "github.com/PuerkitoBio/goquery"
)

// --- Your Base Credentials ---
const (
    BASE_USERNAME   = "PROXY_USERNAME"
    PASSWORD        = "PROXY_PASSWORD"
    PROXY_HOST      = "proxy.catproxy.net"
    PROXY_PORT      = 5555
)

// createProxyClient creates and returns an http.Client configured with our proxy.
func createProxyClient(region string) (*http.Client, error) {
    // Dynamically construct the username for the target region
    proxyUser := fmt.Sprintf("%s-country-%s", BASE_USERNAME, region)

    proxyURLString := fmt.Sprintf("http://%s:%s@%s:%d", proxyUser, PASSWORD, PROXY_HOST, PROXY_PORT)
    proxyURL, err := url.Parse(proxyURLString)
    if err != nil {
        return nil, fmt.Errorf("failed to parse proxy URL: %w", err)
    }

    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    client := &http.Client{
        Transport: transport,
    }

    return client, nil
}

func main() {
    targetRegion := "gb" // Great Britain
    fmt.Printf("--- Scraping Hacker News from %s ---\n", targetRegion)

    // Create our custom, proxy-enabled HTTP client
    client, err := createProxyClient(targetRegion)
    if err != nil {
        log.Fatal(err)
    }

    // Make the request to Hacker News
    resp, err := client.Get("https://news.ycombinator.com")
    if err != nil {
        log.Fatalf("Failed to scrape Hacker News: %v", err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != 200 {
        log.Fatalf("Hacker News returned a non-200 status code: %d %s", resp.StatusCode, resp.Status)
    }

    // Load the HTML document into goquery
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    if err != nil {
        log.Fatalf("Failed to parse HTML: %v", err)
    }

    fmt.Println("Top 5 Headlines:")
    // Find the story links and print their titles
    doc.Find("tr.athing .titleline > a").Each(func(i int, s *goquery.Selection) {
        if i < 5 { // Limit to the top 5 for this example
            title := s.Text()
            fmt.Printf("%d. %s\n", i+1, title)
        }
    })
}

Как запустить

  1. Убедитесь, что у вас установлен Go.
  2. Установите пакет goquery: go get github.com/PuerkitoBio/goquery
  3. Сохраните код как hn_scraper.go.
  4. Запустите из терминала: go run hn_scraper.go

Ожидаемый результат

Terminal
--- Scraping Hacker News from gb ---
Top 5 Headlines:
1. Show HN: I built a terminal UI for ChatGPT
2. The unreasonable effectiveness of just showing up everyday
3. Why are manhole covers round?
4. A 16-bit virtual machine from scratch
5. SQLite is not a toy database
Этот пример показывает, как чисто структурировать приложение для парсинга на Go, отделив создание прокси-клиента от основной логики парсинга. Этот шаблон можно легко расширить для параллельного парсинга с помощью горутин.