Прокси-серверы Go — руководство по настройке прокси-серверов для работы с Go

Из этой статьи вы узнаете, как настроить прокси-сервер для веб-парсинга в Go.
14 min read
Setting Proxy in GO

Все взаимодействия с Интернетом требуют использования IP-адреса. Веб-сайты используют этот IP-адрес для идентификации пользователя или пользователей, определения вашего местоположения и других метаданных, таких как интернет-провайдер, часовой пояс или тип устройства. Веб-серверы используют эту информацию для адаптации или ограничения доступа к контенту или ресурсам. Это означает, что при веб-парсинге сайты могут блокировать запросы, исходящие с вашего IP-адреса, если сочтут, что структура трафика или поведение являются необычными, похожими на ботов или вредоносными. К счастью, тут могут помочь прокси-серверы.

Прокси-сервер — это сервер-посредник, выполняющий функцию шлюза между пользователем и Интернетом. Он получает запросы от пользователей, перенаправляет их на веб-ресурсы, а затем возвращает полученные данные пользователям. Прокси-сервер позволяет скрытно просматривать веб-страницы и выполнять парсинг, скрывая ваш реальный IP-адрес, что повышает безопасность, конфиденциальность и анонимность.

Прокси-серверы также помогают обходить запреты на использование IP-адресов, изменяя ваш IP-адрес и создавая впечатление, что запросы поступают от разных пользователей. Прокси-серверы, расположенные в разных регионах, позволяют получать доступ к геоспецифичному контенту, например фильмам или новостям, в обход геоблокировки.

Из этой статьи вы узнаете, как настроить прокси-сервер длявеб-парсинга в Go. Вы также узнаете о прокси-серверах Bright Data и о том, как они могут помочь вам упростить этот процесс.

Настройка прокси-сервера

Из этого руководства вы узнаете, как модифицировать приложение для веб-парсинга, написанное на Go, для взаимодействия с веб-сайтом It’s FOSS через локальный прокси-сервер или прокси-сервер на собственном хостинге. Для целей этого руководства предполагается, что среда разработки Go уже настроена.

Для начала вам необходимо настроить прокси-сервер с помощью Squid, программного обеспечения (ПО) для прокси-серверов с открытым исходным кодом. Если вы знакомы с другим ПО прокси-серверов, вы также сможете использовать и это ПО. В данной статье используется Squid на боксе Fedora 39 Linux. В большинстве Linux-дистрибутивов Squid включен в репозитории по умолчанию. Вы также можете ознакомиться с документацией, чтобы загрузить необходимые пакеты для вашей операционной системы.

В терминале выполните следующую команду для установки Squid:

dnf install squid -y

После завершения запустите службу, выполнив следующую команду:

sudo systemctl enable --now squid

Проверьте состояние службы с помощью этой команды:

sudo systemctl status squid

Ваш результат должен выглядеть следующим образом:

Прокси-серверы Go

Это означает, что служба активна и запущена. По умолчанию Squid запускает и прослушивает запросы через порт 3128. Используйте следующую команду curl для проверки передачи данных через прокси-сервер:

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"

Полученный вами ответ должен выглядеть следующим образом:

curl --proxy 127.0.0.1:3128 "http://lumtest.com/myip.json"
{"ip":"196.43.196.126","country":"GH","asn":{"asnum":327695,"org_name":"AITI"},"geo":{"city":"","region":"","region_name":"","postal_code":"","latitude":8.1,"longitude":-1.2,"tz":"Africa/Accra"}}

Метаданные должны включать ваш публичный IP-адрес, страну и организацию, которой этот адрес принадлежит. Это также подтверждает, что вы успешно установили рабочий прокси-сервер.

Настройте демо-парсер

Чтобы вам было проще следить за ситуацией, воспользуйтесь простым приложением Go для веб-парсинга, доступным вот в этом репозитории GitHub. В парсере представлены заголовки, выдержки и категории последних публикаций в It’s FOSS, популярном блоге, в котором обсуждаются программные продукты с открытым исходным кодом. Затем парсер посещает Lumtest , чтобы получить информацию об IP-адресе, используемом HTTP-клиентом парсера для взаимодействия с Интернетом. Та же логика реализована с использованием трех разных пакетов Go: Colly, goquery и Selenium. Из следующего раздела вы узнаете, как модифицировать каждую реализацию для использования прокси-сервера.

Начните с клонирования репозитория, выполнив следующую команду в своем предпочтительном терминале или оболочке:

$ git clone https://github.com/rexfordnyrk/go_scrap_proxy.git

Этот репозиторий состоит из двух веток: ветки main , в которой находится готовый код, и ветки basic , в которой содержится исходный код, который вы собираетесь изменить. Используйте следующую команду, чтобы извлечь рабочую копию в ветку basic :

$ git checkout basic

Эта ветка содержит три файла .go для реализации парсера с каждой библиотекой без настроенного прокси-сервера. Она также содержит исполняемый файл chromedriver, необходимый для реализации парсера в Selenium:

.
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

1 directory, 8 files

Любой из них можно запустить по отдельности, используя команду go run с определенным именем файла. Например, следующая команда запускает парсер с помощью Colly:

go run ./colly.go 

Ваш результат должен выглядеть следующим образом:

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Эти выходные данные содержат всю информацию из It’s FOSS, полученную с помощью парсинга. В нижней части выходных данных вы найдете информацию об IP-адресе, полученную от Lumtest, в которой указано текущее соединение, используемое парсером. Выполнение всех трех реализаций должно привести к получению аналогичных ответов. После того как вы протестировали все три реализации, вы можете приступить к парсингу с помощью локального прокси-сервера.

Реализация парсеров с локальным прокси-сервером

Из этого раздела вы узнаете обо всех трех реализациях парсера и измените их для использования прокси-сервера. Каждый файл .go состоит из функции main(), с которой запускается приложение, и функции ScrapeWithLibrary(), содержащей инструкции по парсингу.

Использование goquery с локальным прокси-сервером

goquery — это библиотека для Go, которая предоставляет набор методов и функций для анализа HTML-документов и управления ими, аналогично тому, как jQuery работает с JavaScript. Это особенно полезно при веб-парсинге, поскольку позволяет просматривать, запрашивать и изменять структуру HTML-страниц. Однако эта библиотека не обрабатывает сетевые запросы или операции любого рода, поэтому вам необходимо получить и предоставить ей HTML-страницу.

Перейдя к файлу goquery.go , вы найдете реализацию веб-парсера goquery. Откройте его в своей предпочтительной интегрированной среде разработки (IDE) или текстовом редакторе.

В функции ScrapeWithGoquery() необходимо изменить транспорт HTTP-клиента, указав URL-адрес вашего прокси-сервера HTTP, который представляет собой комбинацию имени хоста или IP-адреса и порта в формате http://HOST:PORT.

Обязательно импортируйте пакет net/url в этот файл. Вставьте и замените определение HTTP-клиента следующим фрагментом:

...

func ScrapeWithGoquery() {
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"

    // Parse the proxy URL
    proxyURL, err := url.Parse(proxyStr)
    if err != nil {
        fmt.Println("Error parsing proxy URL:", err)
        return
    }

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    // Create an HTTP client with the transport
    client := &http.Client{
        Transport: transport,
    }
    
... 

Этот фрагмент кода модифицирует HTTP-клиент, используя транспорт, настроенный для использования локального прокси-сервера. Обязательно замените IP-адрес IP-адресом прокси-сервера.

Теперь запустите эту реализацию с помощью следующей команды из каталога проекта:

go run ./goquery.go

Ваш результат должен выглядеть следующим образом:

$ go run ./goquery.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Использование Colly с локальным прокси-сервером

Colly — это универсальный и эффективный фреймворк веб-парсинга для Go, известный своим удобным API и безупречной интеграцией с библиотеками синтаксического анализа HTML, такими как goquery. Однако, в отличие от goquery, он поддерживает и предоставляет API для обработки различных сетевых моделей поведения, включая асинхронные запросы на высокоскоростной парсинг, локальное кэширование и ограничение скорости для обеспечения эффективного и ответственного использования веб-ресурсов, автоматическую обработку файлов cookie и сеансов, настраиваемые пользовательские агенты и комплексную обработку ошибок. Кроме того, он поддерживает использование прокси-сервера с переключением или ротацией прокси-серверов и может быть расширен для выполнения таких задач, как парсинг контента, созданного на JavaScript, путем интеграции с headless-браузерами.

Откройте файл colly.go в редакторе или IDE и вставьте следующие строки кода сразу после инициализации нового сборщика в функции scrapeWithColly():

...
    // Define the URL of the proxy server
    proxyStr := "http://127.0.0.1:3128"
    // SetProxy sets a proxy for the collector
    if err := c.SetProxy(proxyStr); err != nil {
        log.Fatalf("Error setting proxy configuration: %v", err)
    }
    
...

В этом фрагменте метод Colly SetProxy() применяется для определения прокси-сервера, который будет использоваться этим инстансом сборщика сетевых запросов.

Теперь запустите эту реализацию с помощью следующей команды из каталога проекта:

go run ./colly.go

Ваш результат должен выглядеть следующим образом:

$ go run ./colly.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:29614 org_name:VODAFONE GHANA AS INTERNATIONAL TRANSIT] country:GH geo:map[city:Accra latitude:5.5486 longitude:-0.2012 lum_city:accra lum_region:aa postal_code: region:AA region_name:Greater Accra Region tz:Africa/Accra] ip:197.251.144.148]

Использование Selenium с локальным прокси-сервером

Selenium — это инструмент, который в основном используется для автоматизации взаимодействия с веб-браузерами при тестировании веб-приложений. Он способен выполнять такие задачи, как нажатие кнопок, ввод текста и извлечение данных с веб-страниц, что делает его идеальным средством для веб-парсинга с помощью автоматических взаимодействий. Имитация реальных пользовательских взаимодействий стала возможной благодаря WebDriver, который Selenium использует для управления браузерами. Хотя в этом примере применяется Chrome, Selenium также поддерживает другие браузеры, включая Firefox, Safari и Internet Explorer.

Служба Selenium WebDriver позволяет вам предоставлять прокси-сервер и другие конфигурации, чтобы повлиять на поведение базового браузера при взаимодействии с Интернетом, как и в случае с реальным браузером. Программно это можно настроить с помощью определения selelium.Capabilities{}.

Чтобы использовать Selenium с локальным прокси-сервером, отредактируйте файл selenium.go в ScrapeWithSelenium() и замените определение selelium.Capabilities{} следующим фрагментом:

...

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: "127.0.0.1:3128", // Replace with your proxy settings
        SSL:  "127.0.0.1:3128", // Replace with your proxy settings
    }

    // Configuring the WebDriver instance with the proxy
    caps := selenium.Capabilities{
        "browserName": "chrome",
        "proxy":       proxy,
    }
    
...

Этот фрагмент определяет различные параметры прокси-сервера для Selenium, которые используются для настройки возможностей Selenium для WebDriver. При следующем выполнении будет использовано прокси-соединение.

Теперь запустите реализацию с помощью следующей команды из каталога проекта:

go run ./selenium.go

Ваш результат должен выглядеть следующим образом:

$ go run ./selenium.go

Article 0: {"category":"Newsletter ✉️","excerpt":"Unwind your new year celebration with new open-source projects, and keep an eye on interesting distro updates.","title":"FOSS Weekly #24.02: Mixing AI With Linux, Vanilla OS 2, and More"}
Article 1: {"category":"Tutorial","excerpt":"Wondering how to use tiling windows on GNOME? Try the tiling assistant. Here's how it works.","title":"How to Use Tiling Assistant on GNOME Desktop?"}
Article 2: {"category":"Linux Commands","excerpt":"The free command in Linux helps you gain insights on system memory usage (RAM), and more. Here's how to make good use of it.","title":"Free Command Examples"}
Article 3: {"category":"Gaming 🎮","excerpt":"Here are the best tips to make your Linux gaming experience enjoyable.","title":"7 Tips and Tools to Improve Your Gaming Experience on Linux"}
Article 4: {"category":"Newsletter ✉️","excerpt":"The first edition of FOSS Weekly in the year 2024 is here. See, what's new in the new year.","title":"FOSS Weekly #24.01: Linux in 2024, GDM Customization, Distros You Missed Last Year"}
Article 5: {"category":"Tutorial","excerpt":"Wondering which init service your Linux system uses? Here's how to find it out.","title":"How to Check if Your Linux System Uses systemd"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you're using? Here's how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"197.251.144.148","country":"GH","asn":{"asnum":29614,"org_name":"VODAFONE GHANA AS INTERNATIONAL TRANSIT"},"geo":{"city":"Accra","region":"AA","region_name":"Greater Accra Region","postal_code":"","latitude":5.5486,"longitude":-0.2012,"tz":"Africa/Accra","lum_city":"accra","lum_region":"aa"}}

Хотя вы можете обслуживать прокси-сервер самостоятельно, ваши возможности ограничены различными факторами, включая необходимость настройки новых серверов для новых различных регионов, а также другие проблемы с обслуживанием и безопасностью.

Прокси-серверы Bright Data

Bright Data предлагает отмеченную наградами глобальную инфраструктуру прокси-сети с полным набором прокси-серверов и служб, которые можно использовать для различных целей сбора веб-данных.

Благодаря обширной глобальной сети прокси-серверов Bright Data вы можете легко получать доступ к данным и собирать их в разных странах. Bright Data также предоставляет ряд типов прокси-серверов, включая более 350 миллионов уникальных резидентных прокси-серверовпрокси-серверов интернет-провайжеровпрокси-серверов центров обработки данныхи мобильных прокси-серверов, каждый из которых предлагает уникальные преимущества, такие как легитимность, скорость и надежность, для решения конкретных задач сбора веб-данных.

Кроме того, система ротации прокси-серверов Bright Data обеспечивает высокую анонимность и минимизирует обнаружение, что делает ее идеальной для непрерывного и крупномасштабного сбора веб-данных.

Настройка резидентного прокси-сервера с помощью Bright Data

Получить резидентный прокси-сервер с помощью Bright Data очень просто. Все, что вам нужно сделать, — это зарегистрироваться для получения бесплатной пробной версии. После регистрации вы увидите что-то вроде этого:

Панель управления BD

Нажмите кнопку «Начать работу» в разделе «Резидентные прокси-серверы».

Вам будет предложено заполнить следующую форму:

Настрока резидентных прокси-серверов BD

Теперь укажите имя этого инстанса. Здесь это my_go_demo_proxy. Также необходимо указать тип предоставляемого IP-адреса: выберите «Общий» (Shared) (если вы хотите использовать общие прокси-серверы). Затем укажите уровень геолокации, который вы хотите имитировать при доступе к веб-контенту. По умолчанию это уровень «Страна» или «Зона». Вам также необходимо указать, хотите ли вы кэшировать запрашиваемые веб-страницы. Пока отключите кеширование.

После заполнения этой информации нажмите «Добавить», чтобы создать и подготовить резидентный прокси-сервер.

Затем вам необходимо активировать его. Однако, как нового пользователя, сначала вас попросят ввести платежные реквизиты. Выполнив этот шаг, перейдите на панель управления и нажмите на только что созданный резидентный прокси-сервер:

настройка прокси-серверов в go

Убедитесь, что выбрана вкладка «Параметры доступа».

Здесь вы найдете различные параметры, необходимые для использования резидентного прокси-сервера, такие как хост, порт и учетные данные для аутентификации. Эта информация вас скоро понадобится.

Теперь пора интегрировать ваш резидентный прокси-сервер Bright Data со всеми тремя реализациями парсера. Хотя этот процесс аналогичен процессу для локального сервера, здесь вам также придется включить аутентификацию. Кроме того, поскольку вы взаимодействуете с Интернетом программным путем, просматривать и принимать SSL-сертификаты от прокси-сервера таким же способом, как в браузере с графическим пользовательским интерфейсом, может оказаться невозможным. Поэтому вам необходимо программно отключить проверку сертификата SSL в веб-клиенте, чтобы ваши запросы выполнялись без проблем.

Начните с создания каталога brightdata в каталоге проекта и скопируйте три файла .go в каталог brightdata. Ваша структура каталогов должна выглядеть следующим образом:

.
├── brightdata
│   ├── colly.go
│   ├── goquery.go
│   └── selenium.go
├── chromedriver
├── colly.go
├── go.mod
├── goquery.go
├── go.sum
├── LICENSE
├── README.md
└── selenium.go

2 directories, 11 files

В дальнейшем вы будете изменять файлы в каталоге brightdata.

Использование goquery с резидентным прокси-сервером Bright Data

В функции ScrapeWithGoquery() необходимо изменить переменную proxyStr, чтобы включить учетные данные для аутентификации в URL-адрес прокси-сервера в формате http://USERNAME:PASSWORD@HOST:PORT. Замените текущее определение следующим фрагментом:

...

func ScrapeWithGoquery() {
    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here
    
    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)
    
    // Parse the proxy URL
...

Затем необходимо изменить транспорт HTTP-клиента, указав конфигурацию, позволяющую игнорировать проверку сертификата SSL/TLS прокси-сервера. Начните с добавления пакета crypto/tls к импорту. Затем замените определение http.Transport следующим фрагментом после анализа URL-адреса прокси-сервера:

...

func ScrapeWithGoquery() {
    
    // Parse the proxy URL
...

    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }

    // Create an HTTP client with the transport
... 

Этот фрагмент кода модифицирует HTTP-клиент, используя транспорт, настроенный для использования локального прокси-сервера. Обязательно замените IP-адрес на IP-адрес вашего прокси-сервера.

Затем запустите эту реализацию, используя следующую команду из каталога проекта:

go run brightdata/goquery.go 

Ваши выходные данные должны выглядеть следующим образом:

$ go run brightdata/goquery.go 

Article 0: {"category":"Newsletter ✉️","excerpt":"Open source rival to Twitter, a hyped new terminal and a cool new Brave/Chrome feature among many other things.","title":"FOSS Weekly #24.07: Fedora Atomic Distro, Android FOSS Apps, Mozilla Monitor Plus and More"}
Article 1: {"category":"Explain","excerpt":"Intel makes things confusing, I guess. Let's try making the processor naming changes simpler.","title":"Intel Processor Naming Changes: All You Need to Know"}
Article 2: {"category":"Linux Commands","excerpt":"The Cut command lets you extract a part of the file to print without affecting the original file. Learn more here.","title":"Cut Command Examples"}
Article 3: {"category":"Raspberry Pi","excerpt":"A UART attached to your Raspberry Pi can help you troubleshoot issues with your Raspberry Pi. Here's what you need to know.","title":"Using a USB Serial Adapter (UART) to Help Debug Your Raspberry Pi"}
Article 4: {"category":"Newsletter ✉️","excerpt":"Damn Small Linux resumes development after 16 years.","title":"FOSS Weekly #24.06: Ollama AI, Zorin OS Upgrade, Damn Small Linux, Sudo on Windows and More"}
Article 5: {"category":"Tutorial","excerpt":"Zorin OS now provides a way to upgrade to a newer major version. Here's how to do that.","title":"How to upgrade to Zorin OS 17"}
Article 6: {"category":"Ubuntu","excerpt":"Learn the logic behind each step you have to follow for adding an external repository in Ubuntu and installing packages from it.","title":"Installing Packages From External Repositories in Ubuntu [Explained]"}
Article 7: {"category":"Troubleshoot 🔬","excerpt":"Getting a warning that the boot partition has no space left? Here are some ways you can free up space on the boot partition in Ubuntu Linux.","title":"How to Free Up Space in /boot Partition on Ubuntu Linux?"}
Article 8: {"category":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP map[asn:map[asnum:7922 org_name:COMCAST-7922] country:US geo:map[city:Crown Point latitude:41.4253 longitude:-87.3565 lum_city:crownpoint lum_region:in postal_code:46307 region:IN region_name:Indiana tz:America/Chicago] ip:73.36.77.244]

Вы заметите, что, несмотря на то, что вы просматриваете одни и те же статьи, проверка IP-адреса прокси-сервера выдала другую информацию, указывающую на переход из другого места или страны.

Использование Colly с резидентным прокси-сервером Bright Data

Несмотря на то, что пакет Colly не предлагает способа программного отключения проверки SSL/TLS, он дает вам возможность предоставить собственный транспорт HTTP-клиенту.

Открыв файл colly.go в своем редакторе или IDE, вставьте следующие строки кода после инициализации нового сборщика внутри функции ScrapeWithColly() (не забудьте добавить импорт net/url и net/http):

...
func ScrapeWithColly() {
    ...
    
    //Create an http.Transport that uses the proxy
    transport := &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true, // Disable SSL certificate verification
        },
    }
    
    // Set the collector instance to use the configured transport
    c.WithTransport(transport)
    
    
...

Этот фрагмент определяет HTTP-транспорт с отключенной проверкой SSL и использует метод WithTransport() в Colly для настройки транспорта сборщика сетевых запросов.

Измените переменную proxyStr так, чтобы она содержала учетные данные резидентного прокси-сервера (как и в случае с goquery). Замените строку proxyStr следующим фрагментом:

...

    // Define the proxy server with username and password
    proxyUsername := "username" //Your residential proxy username 
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host" //Your Residential Proxy Host
    proxyPort := "server_port"  //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

...

Не забудьте заменить строковые значения значениями со страницы «Параметры доступа» вашего резидентного прокси-сервера.

Потом запустите эту реализацию, используя следующую команду из каталога проекта:

go run brightdata/colly.go
go run brightdata/colly.go 
…

Check Proxy IP map[asn:map[asnum:2856 org_name:British Telecommunications PLC] country:GB geo:map[city:Turriff latitude:57.5324 longitude:-2.3883 lum_city:turriff lum_region:sct postal_code:AB53 region:SCT region_name:Scotland tz:Europe/London] ip:86.180.236.254]

В части выходных данных «Проверьте IP-адрес прокси-сервера» вы заметите смену страны, несмотря на то, что используются те же учетные данные.

Использование Selenium с резидентным прокси-сервером Bright Data

При работе с Selenium необходимо изменить определение selenium.Proxy{}, чтобы использовать строку URL-адреса прокси-сервера с учетными данными. Замените текущее определение прокси-сервера следующим:

...

    // Define the proxy server with username and password
    proxyUsername := "username"      //Your residential proxy username
    proxyPassword := "your_password" //Your Residential Proxy password here
    proxyHost := "server_host"       //Your Residential Proxy Host
    proxyPort := "server_port"       //Your Port here

    proxyStr := fmt.Sprintf("http://%s:%s@%s:%s", url.QueryEscape(proxyUsername), url.QueryEscape(proxyPassword), proxyHost, proxyPort)

    // Define proxy settings
    proxy := selenium.Proxy{
        Type: selenium.Manual,
        HTTP: proxyStr,
        SSL:  proxyStr,
    }
    
...

Не забудьте импортировать пакет net/url.

Этот фрагмент определяет различные параметры прокси-сервера и объединяется для создания URL-адреса прокси-сервера, используемого в конфигурации прокси-сервера.

Теперь необходимо настроить Chrome WebDriver с опциями отключения проверки SSL при использовании резидентного прокси-сервера, как это было сделано в предыдущих реализациях. Для этого измените аргументы определения chromeCaps, включив в них опцию --ignore-certificate-errors следующим образом:

... 
    caps.AddChrome(chrome.Capabilities{Args: []string{
        "--headless=new", // Start browser without UI as a background process
        "--ignore-certificate-errors", // // Disable SSL certificate verification
    }})
...

По умолчанию Selenium не поддерживает аутентифицированную конфигурацию прокси-сервера. Однако вы можете обойти эту проблему, используя небольшой пакет для создания расширения Chrome для аутентифицированного прокси-соединения.

Сначала добавьте пакет в свой проект, используя команду go get:

go get https://github.com/rexfordnyrk/proxyauth

Затем импортируйте пакет в файл brightdata/selenium.go, добавив строку «github.com/rexfordnyrk/proxyauth» в блок импорта в верхней части файла.

Затем вам необходимо создать расширение Chome с помощью метода BuildExtension() из пакета proxyauth и передать его вместе со своими учетными данными резидентного прокси-сервера Bright Data. Для этого вставьте следующий фрагмент кода после определения chromeCaps, но перед строкой caps.AddChrome(chromeCaps):

…
    //Building proxy auth extension using BrightData Proxy credentials
    extension, err := proxyauth.BuildExtention(proxyHost, proxyPort, proxyUsername, proxyPassword)
    if err != nil {
        log.Fatal("BuildProxyExtension Error:", err)
    }

    //including the extension to allow proxy authentication in chrome
    if err := chromeCaps.AddExtension(extension); err != nil {
        log.Fatal("Error adding Extension:", err)
    }

…

Этот фрагмент кода создает расширение Chrome и добавляет его в Chrome WebDriver, чтобы разрешить аутентифицированные веб-запросы с помощью предоставленных учетных данных прокси-сервера.

Эту реализацию можно запустить с помощью следующей команды из каталога проекта:

go run brightdata/selenium.go

Ваш результат должен выглядеть следующим образом:

$ go run brightdata/selenium.go 

Article 0: {"categoryText":"Newsletter ✉️","excerpt":"Check out the promising new features in Ubuntu 24.04 LTS and a new immutable distro.","title":"FOSS Weekly #24.08: Ubuntu 24.04 Features, Arkane Linux, grep, Fedora COSMIC and More"}
…
Article 8: {"categoryText":"Ubuntu","excerpt":"Wondering which Ubuntu version you’re using? Here’s how to check your Ubuntu version, desktop environment and other relevant system information.","title":"How to Check Ubuntu Version Details and Other System Information"}

Check Proxy IP {"ip":"176.45.169.166","country":"SA","asn":{"asnum":25019,"org_name":"Saudi Telecom Company JSC"},"geo":{"city":"Riyadh","region":"01","region_name":"Riyadh Region","postal_code":"","latitude":24.6869,"longitude":46.7224,"tz":"Asia/Riyadh","lum_city":"riyadh","lum_region":"01"}}

Опять же, если вы посмотрите на информацию об IP-адресе в нижней части выходных данных, вы заметите, что для отправки запроса также используется другая страна. Это показывает, что ротация прокси-серверов Bright Data работает.

Как видите, использовать Bright Data в приложении Go очень просто. Сначала вы создаете резидентный прокси-сервер на платформе Bright Data и получаете свои учетные данные. Затем вы меняете код с учетом этой информации, чтобы использовать прокси-сервер для взаимодействия с Интернетом.

Заключение

Веб-прокси-серверы являются важным компонентом персонализированного взаимодействия пользователей в Интернете. Из этой статьи вы узнали все о прокси-серверах и о том, как настроить собственный прокси-сервер с помощью Squid. Вы также узнали, как интегрировать локальный прокси-сервер в приложения Go, в данном случае в веб-парсер.

Если вас интересует работа с прокси-серверами, вам следует рассмотреть возможность использования Bright Data. Эта современная прокси-сеть позволяет быстро собирать данные, не беспокоясь о дополнительной инфраструктуре или обслуживании.