Дневники парсинга данных: Часть 1
Мое путешествие по сбору цифрового мусора из интернета.
Я уже некоторое время задумывался о том, о чем должна быть моя первая статья. Через неделю я решил пойти на риск и попросил GPT (конечно же, искусственный интеллект _должен _быть упомянут в каждой статье, которую вы читаете на данный момент) сгенерировать для меня пять советов по улучшению результатов, которые вы получаете от еженедельных приключений по сбору данных. Однако я понял, что сам многое должен узнать. И вот, я учусь и рассказываю вам об этом:
Совет 1:
Используйте прокси-сервис или VPN. Одна из самых распространенных механизмов защиты от скрапинга, которые используют веб-сайты, заключается в обнаружении и блокировке запросов с одного и того же IP-адреса или юзер-агента. Это может помешать вам скрапить большие объемы данных или получить доступ к ограниченному контенту. Чтобы избежать этого, вы можете использовать прокси-сервис или VPN (виртуальная частная сеть), чтобы скрыть свой IP-адрес и юзер-агент.
Это я знал, но никогда не использовал. Я просто пропускал веб-сайты, которые блокировали меня, и довольствовался плохими данными с маленьких веб-сайтов. В какой-то момент я начал устанавливать поле User-Agent в HTTP-заголовке, отправляемом через API запроса Python, на что-то из этого списка, что решило большую часть моих проблем.
Но так как GPT хочет, чтобы я использовал прокси и VPN, давайте попробуем. Вот что он предложил.
Существует много прокси-сервисов и VPN, доступных онлайн, как бесплатных, так и платных. Некоторые из популярных: — ScrapingBee: Веб-скрапинг API, который обрабатывает прокси, безголовые браузеры, разгадывание капчи и т.д. — Luminati: Большая сеть резиденциальных, мобильных и центров обработки данных прокси для веб-скрапинга. — [тот VPN-сервис, который спонсирует всех, которого я ненавижу] — Tor: Бесплатное и открытое программное обеспечение, которое обеспечивает анонимное общение, маршрутизируя ваш трафик через сеть добровольных узлов.
ScrapingBee был довольно простым и понятным в использовании. У него даже есть конструктор запросов на своем веб-сайте, который позволяет создавать запросы для скрапинга с помощью графического интерфейса (в некоторой степени; все равно нужно знать, что делает код).
Затем я стал любопытным и попробовал использовать ProtonVPN (без сомнения, лучший VPN), чтобы менять IP каждый раз, когда я сталкивался с ошибкой HTTP 403:
import requests
from bs4 import BeautifulSoup
import subprocess
def make_request(url):
try:
response = requests.get(url)
if response.status_code == 200:
return response.text
elif response.status_code == 403:
print("Запрос заблокирован. Подключение к ProtonVPN...")
connect_to_vpn()
return make_request(url)
else:
print(f"Запрос завершился с кодом состояния {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Произошла ошибка: {str(e)}")
def connect_to_vpn():
try:
subprocess.run(['protonvpn-cli', 'connect'])
except subprocess.CalledProcessError:
print("Интерфейс командной строки ProtonVPN не найден. Убедитесь, что ProtonVPN установлен.")
def disconnect_from_vpn():
try:
subprocess.run(['protonvpn-cli', 'disconnect'])
except subprocess.CalledProcessError:
print("Интерфейс командной строки ProtonVPN не найден. Убедитесь, что ProtonVPN установлен.")
url = "https://example.com"
html = make_request(url)
if html:
# print(html)
soup = BeautifulSoup(html, 'html.parser')
print(soup)
disconnect_from_vpn()
Думаю, мне действительно нравится изобретать велосипед на этом этапе.
Luminati.io начал с хорошего старта. Сайт завис, как только я создал аккаунт, а затем сообщил мне, что мой аккаунт в protonmail не подходит.
После того, как я отказался от своего gmail, сайт отказался подтверждать мой адрес электронной почты, так как ссылка постоянно терялась.
И, наконец, вы можете использовать Tor, чтобы спасти свой самолет от попытки захвата 👍🏽.
Это так же просто, как создание объекта сессии из библиотеки [requests](https://pypi.org/project/requests/)
и установка SOCK5-прокси с портом 9050 (для службы Tor) или портом 9150 (для Tor-браузера) как для http, так и для https.
import requests
# Настройка сессии с прокси Tor
session = requests.session()
session.proxies = {
'http': 'socks5://localhost:9050',
'https': 'socks5://localhost:9050'
}
# Отправка запроса через прокси Tor
url = 'https://example.com'
response = session.get(url)
# Проверка ответа
if response.status_code == 200:
print(response.text)
else:
print(f"Запрос завершился с кодом состояния {response.status_code}")
И, полагаю, это приводит нас к концу Части 1. Мы рассмотрели различные способы избежать блокировки веб-сайтов при парсинге их данных. Не нужно говорить, что будьте внимательны к условиям использования веб-сайта, который вы пытаетесь парсить, и не попадайте в неприятности. Хороший парсинг требует усилий, и это действительно было очень мучительно, но я надеюсь, что вы что-то узнали, как и я. Увидимся на другой стороне!