Лайфхаки

Маленькие, полезные хитрости

Как использовать прокси с авторизацией в python Requests. Как использовать прокси в Requests

31.08.2023 в 10:47

Как использовать прокси с авторизацией в python Requests. Как использовать прокси в Requests

  • Чтобы использовать прокси в Python, сначала импортируйте пакет requests.
  • Далее создайте словарьproxies, определяющий HTTP и HTTPS соединения. Эта переменная должна быть словарем, который сопоставляет протокол с URL прокси. Кроме того, создайте переменную url, содержащую веб-страницу, с которой вы собираетесь делать скрейпинг.

Обратите внимание, что в приведенном ниже примере словарь определяет URL прокси для двух отдельных протоколов: HTTP и HTTPS. Каждое соединение соответствует отдельному URL и порту, но это не означает, что они не могут быть одинаковыми

Наконец, создайте переменную ответа, которая использует любой из методов запроса. Метод будет принимать два аргумента: созданную вами переменную URL и определенный словарь с proxy.

Вы можете использовать один и тот же синтаксис для разных вызовов api, но независимо от того, какой вызов вы делаете, вам необходимо указать протокол.

Python свой прокси сервер. Пишем прокси сервер DNS запросов с кэшированием на Python.

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

Конструктивно декоратор в Python представляет собой некоторую функцию, аргументом которой является другая функция. Декоратор предназначен для добавления дополнительного функционала к данной функции без изменения содержимого последней.

In this article, we will write a simple code for proxying network requests. That is, our program will accept requests addressed to another, send them to the destination, receive the response, and send it back to the recipient. This intermediate link or proxy. We will implement this using the built-in socket library.

We will also implement caching of requests using decorators. A decorator in Python is a function that takes another function as an argument. A decorator is intended to add additional functionality to a given function without changing its content.

Proxy Server

Here is a simple example of a proxy server in Python:

import socket import time def log_request(func): def wrapper(*args, kwargs): print(f"Request: {func.__name__} {args} {kwargs}") return func(*args, kwargs) return wrapper @log_request def handle_request(conn, addr): request = conn.recv(1024) print(f"Received request: {request}") # Send the request to the destination destination = ("www.example.com", 80) conn.sendto(request, destination) # Receive the response response, _ = conn.recvfrom(1024) print(f"Received response: {response}") # Send the response back to the client conn.sendto(response, addr) print("Connection closed") if __name__ == "__main__": sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(("0.0.0.0", 8080)) sock.listen(5) while True: conn, addr = sock.accept() handle_request(conn, addr)

This code defines a proxy server that listens on port 8080 and accepts incoming requests. It logs each request and sends it to the destination (in this case, www.example.com on port 80). It then receives the response and sends it back to the client.

Caching with Decorators

We can use decorators to cache the results of the handle_request function. Here is an example:

import functools def cache_result(ttl=60): # 1 minute def decorator(func): cache = {} def wrapper(*args, kwargs): key = str(args) + str(kwargs) if key in cache: return cache[key] result = func(*args, kwargs) cache[key] = result if len(cache) > 1000: # 1000 entries cache.popitem(last=False) return result return wrapper return decorator @cache_result(ttl=300) # 5 minutes @log_request def handle_request(conn, addr): request = conn.recv(1024) print(f"Received request: {request}") # Send the request to the destination destination = ("www.example.com", 80) conn.sendto(request, destination) # Receive the response response, _ = conn.recvfrom(1024) print(f"Received response: {response}") # Send the response back to the client conn.sendto(response, addr) print("Connection closed")

This code defines a decorator called cache_result that caches the results of the handle_request function for a specified amount of time (in this case, 5 minutes). The decorator uses a dictionary to store the cached results and checks for expired entries.

By using this decorator, we can cache the results of the proxy server and reduce the number of requests sent to the destination.

Такая обертка функции, которую потом можно использовать как функцию.

Python proxy server. Что такое прокси-сервер?

Прокси-сервер (proxy server) – это сервер, исполняющий роль посредника между клиентом и целевым сервером. Прокси-сервер действует «от лица» клиента и, в зависимости от поставленной задачи, может выполнять различные преобразования данных. На рисунке ниже показана логика работы прокси-сервера:

Мы поставили перед собой задачу разработать прокси-сервер, используя только стандартные библиотеки Python. Перед началом разработки были сформулированы следующие критерии функциональности приложения:

  • Каждое новое соединение клиента с прокси-сервером, должно инициировать новое соединение с целевым сервером.
  • Каждый пакет данных, приходящий на прокси-сервер от клиента, должен пересылаться целевому серверу.
  • Каждый пакет данных, приходящий на прокси-сервер от целевого сервера, должен пересылаться соответствующему клиенту.
  • Поддержка работы с несколькими клиентами.
  • Высокая скорость.
  • Малый объем потребляемых ресурсов.

Python Requests socks5. Подготовка запросов

При получении объектаResponseот вызова API илиSession, используется атрибутPreparedRequestфункцииrequest. В некоторых случаях над телом и заголовками (и чем угодно еще) можно будет провести дополнительную работу перед отправкой запроса. Простейший способ следующий:

s = Session ( ) req = Request ( 'POST' , url , data = data , headers = headers ) prepped = req . prepare ( ) # делаем что-то с prepped.body prepped . body = 'No, I want exactly this as the body.' # делаем что-то с prepped.headers prepped headers resp s send prepped stream stream verify verify proxies proxies cert cert timeout timeout resp status_code

Поскольку с объектомRequestне происходит ничего особенного, его можно сразу подготовить и изменить объектPreparedRequest. Затем он отправляется с остальными параметрами, которые вы бы отправили вrequests.*илиSession.*.