Проблема с прокси C# в скрипте тестовой консоли - PullRequest
0 голосов
/ 02 августа 2020

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

Однако я пытался сделайте небольшой C# консольный скрипт для тестирования различных способов добавления прокси, например, с учетными данными или без них, и получите рабочий IP-адрес: Порт из Интернета> http://www.freeproxylists.net/, чтобы проверить его, как мои собственные данные в этом тесте не сработало. Я не понимаю, почему этот тестовый сценарий не работает, когда мой основной проект.

Я все равно получаю доступ к старому сайту, которым владею, поэтому я не блокирую свой собственный домашний IP-адрес, поскольку я могу получить к нему доступ Интернет (или любую другую страницу или сайт) в браузере легко.

Без использования прокси-сервера я просто получаю 30-секундное ожидание (время ожидания), затем «Ошибка тайм-аута», с прокси-сервером я получаю НЕТ ждать вообще (бесплатный прокси ИЛИ тот, который у меня есть с учетными данными) перед "Ошибка тайм-аута" - так что независимо от того, использую ли я прокси или нет, он не может вернуть ответ.

Я, вероятно, просто сплю, но хотел бы чтобы знать, что я делаю неправильно, поскольку я просто скопировал свой метод MakeHTTPGetRequest из класса Scraper своих основных проектов и просто удалил все операторы case в try / catch, чтобы проверить наличие ошибок Connection / Timeout / 404 / Service / Server и т. д. c и поместите его в один простой метод Main здесь ...

public static void Main(string[] args)
{
    string url = "https://www.strictly-software.com"; // a site I own
    //int port = ????; // working in main project crawler
    int port = 3128; // from a list of working free proxies
    string proxyUser = "????"; // working in main project crawler
    string proxyPassword = "????"; // working in main project crawler
    string proxyIP = "167.99.230.151"; // from a list of working proxies

    ShowDebug("Make a request to: " + url + " with proxy:" + proxyIP + ":" + port.ToString());
    
    // user basic IP and Port proxy with no login
    WebProxy proxy = new WebProxy(proxyIP, port);

    /*
        // use default port, username and password to login
        // get same error with correct personal proxy and login but not
        // in main project
        WebProxy proxy = new WebProxy(proxyIP, port)
        {
        Credentials = new NetworkCredential(proxyUser, proxyPassword)
        };
    */

    ShowDebug("Use Proxy: " + proxy.Address.ToString());

    HttpWebRequest client = (HttpWebRequest)WebRequest.Create(url);

    client.Referer = "https://www.strictly-software.com";
    client.Method = "GET";
    client.ContentLength = 0;
    client.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";client.Proxy = proxy;
    client.UserAgent = "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0";
    client.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
    client.Headers.Add("Accept-Encoding", "gzip,deflate");
    client.KeepAlive = true;
    client.Timeout = 30;

    ShowDebug("make request with " + client.UserAgent.ToString());


    try
    {
        // tried adding this to see if it would help but didn't
        //ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
        // get the response
        HttpWebResponse response = (HttpWebResponse)client.GetResponse();

        ShowDebug("response.ContentEncoding = " + response.ContentEncoding.ToString());
        ShowDebug("response.ContentType  = " + response.ContentType.ToString());

        ShowDebug("Status Desc: " + response.StatusDescription.ToString());
        ShowDebug("HTTP Status Code: " + response.StatusCode.ToString());


        ShowDebug("Now get the full response back");

    //  old method not working with £ signs
        StreamReader ResponseStream = new StreamReader(response.GetResponseStream(), Encoding.UTF8);

        string ResponseContent = ResponseStream.ReadToEnd().Trim();

        ShowDebug("content from response == " + Environment.NewLine + ResponseContent);

        ResponseStream.Close();
        response.Close();

    }
    catch (WebException ex)
    { 
    
        ShowDebug("An error occurred");
        ShowDebug("WebException " + ex.Message.ToString());         
        ShowDebug(ex.Status.ToString());

    }
    catch(Exception ex)
    {
        ShowDebug("An error occurred");
        ShowDebug("Exception " + ex.Message.ToString());
    }
    finally
    {
        ShowDebug("At the end");                
    }
}

Сообщения об ошибках из консоли (ShowDebug - это просто оболочка для сообщения time +) ...

02/08/2020 00:00:00: Make a request to: https://www.strictly-software.com with proxy:167.99.230.151:3128
02/08/2020 00:00:00: Use Proxy: http://167.99.230.151:3128/
02/08/2020 00:00:00: make request with Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
02/08/2020 00:00:00: An error occurred
02/08/2020 00:00:00: WebException The operation has timed out
02/08/2020 00:00:00: Timeout
02/08/2020 00:00:00: At the end

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

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

Я просто хотел обновить свой основной проект, добавив новые методы для передачи пользовательских прокси, или не использовать прокси для 1-й попытки, но если это не удастся затем используйте один для последней попытки или используйте прокси по умолчанию: порт et c.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы устанавливаете тайм-аут на 30 миллисекунд: client.Timeout = 30;

Это может вызывать ваши таймауты.

Подробнее здесь .

0 голосов
/ 10 августа 2020

Не уверен, что это решит вашу проблему, но: документация для HttpWebRequest утверждает следующее:

Локальный компьютер или файл конфигурации приложения может указывать, что прокси по умолчанию используемый. Если свойство Proxy указано, то параметры прокси из свойства Proxy переопределяют локальный компьютер или файл конфигурации приложения, и экземпляр HttpWebRequest будет использовать указанные параметры прокси. Если прокси-сервер не указан в файле конфигурации и свойство Proxy не указано, класс HttpWebRequest использует параметры прокси, унаследованные от Inte rnet Explorer на локальном компьютере. Если в Inte rnet Explorer нет настроек прокси, то запрос отправляется прямо на сервер.

Может в настройках IE прокси настроен? Это не объясняет, почему запрос не выполняется с использованием настраиваемого прокси, но, возможно, стоит попробовать.

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

Я предполагаю, что, когда прокси не используется, запрос не выполняется из-за материала IE и прокси, сам прокси просто не работает.

Надеюсь, это решит проблему ...

...