CoderCastrov logo
CoderCastrov
Парсер

Использование TOR для избежания блокировки при парсинге

Использование TOR для избежания блокировки при парсинге
просмотров
2 мин чтение
#Парсер

Сколько раз вы думали, что написали идеальный парсер, который может работать ночью и собирать сотни, тысячи, миллионы данных с веб-сайтов, но когда вы просыпаетесь, вы получаете множество ошибок, таких как 404 Not Found, 401 Unauthorized, 403 Forbidden или 429 Too Many Requests?

Чтобы избежать блокировки, я понял, что использование TOR может помочь, если причина блокировки связана с IP-адресом.

Почему мои парсеры блокируются?

Хотя этот список не является исчерпывающим, он охватывает основные причины блокировки парсеров.

Что такое TOR?

TOR - это сокращение от "The Onion Project" (Проект Луковица). Причина, по которой он связан с луковицей, заключается в том, что сообщения шифруются с использованием нескольких слоев (как луковица) и маршрутизируются через разные компьютеры, причем каждый компьютер расшифровывает только один слой и пересылает его на следующий компьютер/сервер. Таким образом, для каждого компьютера посередине известны только компьютер, с которого поступает сообщение, и компьютер, на который оно направляется, но не источник.

Если вы не понимаете, о чем я говорю, посмотрите это видео на YouTube.

И лучшая вещь в TOR заключается в том, что IP-адреса меняются каждые 10 минут (для Tor Browser или вы можете настроить через tor controller). Это может предотвратить блокировку парсерами по IP-адресам.

Как использовать TOR в Python?

import requests

session = requests.session()
session.proxies = {}
session.proxies['http'] = 'socks5://localhost:9150' #9150 для браузера; 9050 для TOR-сервиса
session.proxies['https'] = 'socks5://localhost:9150'

Вот и всё! Довольно просто. Стандартный пакет requests с настройкой прокси. Или вы можете использовать пакет Stem для работы с контроллером TOR.

from stem import Signal
from stem.control import Controller

def switchIP():
    with Controller.from_port(port=9051) as controller:
        controller.authenticate()
        controller.signal(Signal.NEWNYM)

Также измените User_Agent

User-Agent сообщает серверу, какой веб-браузер используется. Возможно, сервер будет блокировать веб-браузер, который слишком часто обращается к серверу.

К счастью, User-Agent легко подделать. Вместо того, чтобы изобретать велосипед, всегда лучше сначала искать пакеты онлайн. И я нашел fake-useragent, пакет для случайной генерации строки User-Agent.

Просто сделайте следующее:

from fake_useragent import UserAgentheaders = {"User_Agent":UserAgent().random}

Отказ от ответственности

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