Почему время ответа при использовании прокси в библиотеке reqwest увеличивается до 4-13 секунд?

Мне предоставили список прокси из другого скрипта, написанного на языке Python, где среднее время ответа составляет 800 мс. В то же время, у меня время ответа варьируется от 3 до 6 секунд, и я не могу понять, в чем причина. 

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

Без использования прокси среднее время ответа составляет 100 мс. Что может быть причиной такой разницы в времени ответа при использовании прокси? 

```plaintext
--------------------------------
Request time: 2310
--------------------------------
```

```rust
use reqwest::blocking::Client;
use std::error::Error;
use std::{fs, thread};
use std::sync::{Arc, RwLock};
use std::time::{Duration, Instant};
use rand::{thread_rng, Rng};
use reqwest::cookie::Jar;
use reqwest::header::{HeaderMap, CONTENT_TYPE, COOKIE, REFERER, USER_AGENT};
use reqwest::Url;

fn init_clients(proxy_list: &str, headers: HeaderMap) -> Vec<Client> {
    let proxy_list: Vec<&str> = proxy_list.split("\n").collect();

    let mut clients = vec![];

    for ip in proxy_list {
        let proxy = reqwest::Proxy::all(ip).unwrap();
        clients.push(Client::builder()
            .default_headers(headers.clone())
            .cookie_store(true)
            .proxy(proxy.clone())
            .build()
            .unwrap());
    }

    clients
}

fn make_request(client: &Client, url: &str) -> Result<String, Box<dyn Error>> {
    let response = client
        .get(url)
        .send()?
        .text()?;

    Ok(response)
}

fn main() {
    let proxy_list = fs::read_to_string("./proxy2.txt").expect("Unable to read proxy list");
    // Остальной код...
}
```
  • 14 сентября 2024 г. 11:43
Ответы на вопрос 1
Существует несколько факторов, которые могут объяснить разницу во времени ответа при использовании прокси с библиотекой `reqwest` по сравнению с тем временем ответа, которое наблюдается в другом скрипте на Python. Вот несколько аспектов, на которые стоит обратить внимание:

1. **Задержка от прокси**: Разное время ответа может быть вызвано тем, что различные библиотеки имеют разные способы работы с сетевыми соединениями и прокси-серверами. Возможно, Python-скрипт гораздо лучше справляется с обработкой ошибок и повторными попытками соединения, что может привести к меньше времени ожидания.

2. **Настройки клиента `reqwest`**: Обратите внимание на ваши настройки клиента `reqwest`. Убедитесь, что у вас правильно установлены таймауты (например, таймаут подключения и чтения) для клиента. Вы можете настроить их, используя методы `timeout()` и другие.

3. **Формат прокси**: Убедитесь, что формат прокси (IP и порт) в вашем файле `proxy2.txt` соответствует тому, что ожидает библиотека `reqwest`. Прокси должны быть в формате `http://user:password@ip:port` или `http://ip:port`, если аутентификация не требуется.

4. **Скорость отклика прокси**: Возможно, сам прокси-сервер медленный или находится на большом расстоянии от вашего географического положения. Тестируйте время ответа каждого прокси отдельно, чтобы определить, есть ли среди них медленные.

5. **Кэширование и поведение приложения**: Возможно, ваше приложение или прокси-сервер, который вы используете, добавляет задержку (например, прокси может не поддерживать кэширование). Проверьте, какие заголовки отправляются и получаются.

6. **Количество создаваемых клиентов**: Если вы создаете много клиентов для каждого прокси при инициализации, это может занять время и не рекомендовано. Попробуйте создать один клиент с заданным прокси для каждого запроса вместо создания множества клиентов.

7. **Использование асинхронного выполнения**: Рассмотрите возможность использования асинхронной версии `reqwest`, так как она может обрабатывать запросы более эффективно и уменьшит общее время выполнения программы.

Вот пример того, как можно задать таймауты:

```rust
let client = Client::builder()
    .default_headers(headers.clone())
    .cookie_store(true)
    .proxy(proxy.clone())
    .timeout(Duration::from_secs(5)) // Установка таймаута в 5 секунд
    .build()
    .unwrap();
```

Также, если хотите проверить конкретный прокси, вы можете сделать простой тест:

```rust
let start = Instant::now();
match make_request(&client, "http://example.com") {
    Ok(_) => println!("Request successful, time: {:?}", start.elapsed()),
    Err(e) => eprintln!("Error occurred: {:?}", e),
}
```

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