Как использовать proxy с помощью библиотеки Requests?
В этой статье вы рассмотрите, как использовать библиотеку Python Requests за прокси-сервером. Разработчики используют прокси-серверы для анонимности, безопасности, а иногда даже используют несколько, чтобы предотвратить запрет веб-сайтов на их IP-адреса.
Прокси-серверы также имеют ряд других преимуществ, таких как обход фильтров и цензуры. Не стесняйтесь узнать больше о вращающихся прокси, прежде чем продолжить, но давайте начнем! Прокси здесь можно приобрести по доступной цене. Качественные прокси от PapaProxy это залог обхода любых блокировок и ограничений!
Предварительные условия и установка
Эта статья предназначена для тех, кто хотел бы спарсить сайт используя прокси в Python. Прокси здесь будут нужны, чтобы спрятать наш настоящий IP. Чтобы извлечь максимум пользы из материала, необходимо:
- Иметь опыт работы с Python 3.
- Python 3 установлен на вашей локальной машине.
Проверьте, установлен ли пакет python-requests pacakges, открыв терминал и набрав:
pip freeze
pip freeze
отобразит все текущие пакеты python и их версии, поэтому проверьте, присутствует ли он. Если нет, установите его, выполнив:
pip install requests
Как использовать прокси в Requests
- Чтобы использовать прокси в Python, сначала импортируйте пакет requests.
- Далее создайте словарь
proxies
, определяющий HTTP и HTTPS соединения. Эта переменная должна быть словарем, который сопоставляет протокол с URL прокси. Кроме того, создайте переменную url, содержащую веб-страницу, с которой вы собираетесь делать скрейпинг.
Обратите внимание, что в приведенном ниже примере словарь определяет URL прокси для двух отдельных протоколов: HTTP и HTTPS. Каждое соединение соответствует отдельному URL и порту, но это не означает, что они не могут быть одинаковыми
Наконец, создайте переменную ответа, которая использует любой из методов запроса. Метод будет принимать два аргумента: созданную вами переменную URL и определенный словарь с proxy.
Вы можете использовать один и тот же синтаксис для разных вызовов api, но независимо от того, какой вызов вы делаете, вам необходимо указать протокол.
import requests
proxies = {
'http': 'http://proxy.example.com:8080',
'https': 'http://secureproxy.example.com:8090',
}
url = 'http://mywebsite.com/example'
response = requests.post(url, proxies=proxies)
HTTP методы в библиотеке Requests
response = requests.get(url)
response = requests.post(url, data={"a": 1, "b": 2})
response = requests.put(url, data=put_body)
response = requests.delete(url)
response = requests.patch(url, data=patch_update)
response = requests.head(url)
response = requests.options(url)
Аутентификация через прокси
Если вам необходимо добавить аутентификацию, вы можете переписать свой код, используя следующий синтаксис:
response = requests.get(url, auth=('user', 'pass'))
Сессии в библиотеке requests
Вы также можете столкнуться с необходимостью сбора данных с веб-сайтов, использующих сессии, в этом случае вам придется создать объект сессии. Это можно сделать, сначала создав переменную session и установив ее в метод requests Session()
. Затем, как и раньше, вы отправляете свои прокси сессии через метод requests
, но на этот раз в качестве аргумента передается только url.
import requests
session = requests.Session()
session.proxies = {
'http': 'http://10.10.10.10:8000',
'https': 'http://10.10.10.10:8000',
}
url = 'http://mywebsite.com/example'
response = session.get(url)
Сохраняем Proxy в переменные окружения
Вы можете столкнуться с повторным использованием одного и того же прокси для каждого запроса, поэтому не стесняйтесь вычищать свой код, задавая некоторые переменные окружения:
export HTTP_PROXY='http://10.10.10.10:8000'
export HTTPS_PROXY='http://10.10.10.10:1212'
Если вы решили установить переменные окружения, больше нет необходимости прописывать прокси в вашем коде. Как только вы сделаете запрос, будет выполнен вызов api!
Чтение ответов из requests
Если вы хотите прочитать ваши данные:
response = requests.get(url)
text_resp = response.text
JSON: для ответов в формате JSON пакет requests предоставляет встроенный метод.
response = requests.get(url)
json_resp = response.json()
Ротация прокси с помощью библиотеки requests
Помните, мы говорили, что некоторые разработчики используют более одного прокси? Теперь и вы можете!
В любом случае, если вы неоднократно занимаетесь скраппингом с веб-страницы, хорошей практикой является использование более одного прокси, потому что существует большая вероятность того, что ваш скраппер будет заблокирован, то есть ваш IP-адрес будет заблокирован. Культура отмены скраппинга существует! Поэтому, чтобы избежать отмены, лучше всего использовать вращающиеся прокси. Ротационный прокси-сервер - это прокси-сервер, который назначает новый IP-адрес из пула прокси-серверов для каждого соединения.
Для ротации IP-адресов сначала необходимо иметь пул IP-адресов. Вы можете использовать бесплатные прокси, найденные в интернете, или коммерческие решения. В большинстве случаев, если ваш сервис полагается на соскобленные данные, бесплатного прокси, скорее всего, будет недостаточно.
Как ротировать IP-адреса с помощью requests?
Для того чтобы начать ротацию IP-адресов, вам нужен список бесплатных прокси. В случае, если бесплатные прокси подходят для ваших нужд, здесь вы можете найти список бесплатных прокси. Сегодня вы будете писать скрипт, который выбирает и ротирует прокси.
- Сначала импортируйте библиотеки
requests
,BeautifulSoup
иchoice
. - Далее определите метод
get_proxy()
, который будет отвечать за получение IP-адресов для использования. В этом методе вы определите ваш url как любой ресурс из списка прокси, который вы решите использовать. После отправки api-вызова запроса преобразуйте ответ в объект Beautiful Soup, чтобы облегчить извлечение. Используйте библиотеку парсера html5lib для разбора HTML веб-сайта, как это делается в браузере. Создайте переменную proxy, которая использует функцию choice для случайного выбора IP-адреса из списка прокси, сгенерированного soup. В функции map можно использовать лямбда-функцию для преобразования HTML-элемента в текст как для полученных IP-адресов, так и для номеров портов. - Создайте метод
proxy_request
, который принимает 3 аргумента:тип_запроса
,url
и**kwargs
. Внутри этого метода определите свой словарь прокси как прокси, возвращенный из методаget_proxy
. Как и раньше, вы будете использовать запросы, передавая в них свои аргументы.
import requests
ip_addresses = [ "mysuperproxy.com:5000", "mysuperproxy.com:5001", "mysuperproxy.com:5100", "mysuperproxy.com:5010", "mysuperproxy.com:5050", "mysuperproxy.com:8080", "mysuperproxy.com:8001",
"mysuperproxy.com:8000", "mysuperproxy.com:8050" ]
def proxy_request(request_type, url, **kwargs):
while True:
try:
proxy = random.randint(0, len(ip_addresses) - 1)
proxies = {"http": ip_addresses(proxy), "https": ip_addresses(proxy)}
response = requests.get(request_type, url, proxies=proxies, timeout=5, **kwargs)
print(f"Используемый в настоящее время прокси-сервер: {proxy['https']}")
break
except:
print("Ошибка, ищем другой прокси-сервер")
return response
Вот и всё!
Заключение
Хотя может возникнуть соблазн сразу же начать скраппинг с помощью новых модных прокси, все же есть несколько ключевых моментов, которые вам следует знать. Для начала, не все прокси одинаковы. Существуют различные типы, три основных: прозрачные прокси, анонимные прокси и элитные прокси.
В большинстве случаев вы будете использовать элитные прокси, платные или бесплатные, поскольку они являются лучшим решением для того, чтобы избежать обнаружения. Если вы используете прокси с единственной целью - сохранить конфиденциальность, возможно, вам стоит использовать анонимные прокси. Не рекомендуется использовать прозрачные прокси, если на то нет особых причин, так как прозрачные прокси раскрывают ваш реальный IP-адрес и то, что вы используете прокси-сервер.
Теперь, когда мы все прояснили, пришло время начать скраппинг с помощью прокси в Python. Итак, отправляйтесь туда и делайте все запросы, какие только сможете придумать!
А если использовать отечественные? Я беру российские прокси на http://targetproxy.com/, там всегда все валидное и хорошо везде проходит. Будут такие адреса работать с библиотекой? Не хочется просто что-то другое искать, эти ребята уже проверенные.