Używanie wielu serwerów proxy podczas odpytywania strony internetowej

0

Hej,

chciałbym dołączyć do swojej aplikacji możliwość odpytywania strony za pomocą rożnych serwerów proxy. Jest to spowodowane tym że pobieram dane ze strony "przelatując" przez wszystkie strony a ich jest ponad 1200 i nie chce aby mój adres został zablokowany przez zbyt duże odświeżanie i odpytywanie. Jak mogę ustawić pętlę która np co 50 stron zmienia serwer proxy na inny i tak aż pobierze dane ze wszystkich stron?

Pozdrawiam. Jeśli jest coś nie jasne, spróbuje wyjaśnić :D

3

1) tworzysz tablicę z adresami serwerów proxy
2) tworzysz dwie zmienne pomocnicze - aktualny indeks w tablicy z pkt. 1 oraz ilość pobranych stron, która pierwotnie ustawiasz na wartość 0
3) ustawiasz zmienną z indeksem na pierwszą pozycję tablicy
4) pobierasz/odpytujesz stronę korzystając z serwera proxy wpisanego do tablicy pod indeksem wskazywanym przez zmienną pomocniczą
5) zwiększasz obie zmienne
6) jeśli zmienna z ilością pobranych stron dojdzie do 50, to ją zerujesz oraz zwiększasz indeks w tablicy
7) jeśli po zwiększeniu zmiennej z indeksem tablicy okaże się, że przekraczasz zakres tablicy, to ustawiasz ją ponownie na pierwszy element
8) kroki 4-7 powtarzasz do chwili pobrania wszystkich stron.

0

Jak mogę odpytywać serwer za pomocą proxy?

Mógłbyś mi pomóc albo przekierować do odpowiedniego wątku na forum lub w googlach?
Wszystkie serwery są anonymous więc nie wymagane jest logowanie.
screenshot-20190722171346.png

Z góry śliczne dzięki!

Szukałem ale nigdzie nie mogłem znaleźć jak mogę zrobić takie dynamiczne proxy.

0

Jak mogę odpytywać serwer za pomocą proxy?

W pierwszym poście pytałeś, jak zrobić pętlę, która pobiera dane z różnych serwerów. Napisałem, jak powinieneś to zrobić, a teraz pytasz, w jaki sposób się odpytuje serwer. Pomijam nawet fakt, że pojęcie "odpytywania serwera" jest tak mało precyzyjne, że za bardzo nie wiemy, o co Tobie konkretnie chodzi. Problemem jest to, że chyba jesteś totalnie początkujący, więc nawet jakbyś dostał odpowiedź na swoje pytanie, to i tak raczej nie będziesz wiedział, co z nią zrobić.

1
cerrato napisał(a):

Jak mogę odpytywać serwer za pomocą proxy?

W pierwszym poście pytałeś, jak zrobić pętlę, która pobiera dane z różnych serwerów. Napisałem, jak powinieneś to zrobić, a teraz pytasz, w jaki sposób się odpytuje serwer. Pomijam nawet fakt, że pojęcie "odpytywania serwera" jest tak mało precyzyjne, że za bardzo nie wiemy, o co Tobie konkretnie chodzi. Problemem jest to, że chyba jesteś totalnie początkujący, więc nawet jakbyś dostał odpowiedź na swoje pytanie, to i tak raczej nie będziesz wiedział, co z nią zrobić.

Przepraszam źle zformułowałem pytanie

Oto mój kod od pobierania danych:

for (int i = 1; i < 1; i++)
            {
                var url = "https://www.otomoto.pl/osobowe/audi/a3/?page=" + i;

                var httpClient = new HttpClient();
                var html = await httpClient.GetStringAsync(url);

                var htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);

                var Cars = htmlDocument.DocumentNode.Descendants("div")
                    .Where(node => node.GetAttributeValue("class", "")
                    .Equals("offers list")).ToList();

                var CarsListItems = Cars[0].Descendants("article")
                    .Where(node => node.GetAttributeValue("data-test", "")
                    .Contains("search-result-item")).ToList();

                foreach (var CarsParamsList in CarsListItems)
                {
                    var marka = CarsParamsList.Descendants("a")
                        .Where(node => node.GetAttributeValue("class", "")
                        .Equals("offer-title__link")).First().InnerText.Trim('\n', ' ');
                    Console.WriteLine(marka);


                    var year = CarsParamsList.Descendants("li")
                        .Where(node => node.GetAttributeValue("data-code", "")
                        .Equals("year")).First().InnerText.Trim('\n', ' ');
                    Console.WriteLine(year);

                    var mileage = CarsParamsList.Descendants("li")
                        .Where(node => node.GetAttributeValue("data-code", "")
                        .Equals("mileage")).First().InnerText.Trim('\n', ' ');
                    Console.WriteLine(mileage);

                    try
                    {
                        var engine = CarsParamsList.Descendants("li")
                          .Where(node => node.GetAttributeValue("data-code", "")
                          .Equals("engine_capacity")).First().InnerText.Trim('\n', ' ');
                        Console.WriteLine(engine);
                    }
                    catch
                    {
                        Console.WriteLine("Brak informacji");
                    }

                    var fuel = CarsParamsList.Descendants("li")
                        .Where(node => node.GetAttributeValue("data-code", "")
                        .Contains("fuel_type")).First().InnerText.Trim('\n', ' ');
                    Console.WriteLine(fuel);
                    Console.WriteLine("---------------------------------------------------");
                }
            }

Nie wiem teraz jak dodać kod dotyczący serwera proxy, nie mogłem znaleźć nic przydatnego w internecie. Proszę o pomoc co i jak mógłbym wykorzystać.

Tak, jestem początkujący, staram się robić wszystko aby zrozumieć ten język i piąć się coraz wyżej. W tej chwili potrzebuje nakierowania, aby pójść dalej.

1

Możesz wykorzystać konstruktor HttpClienta, który przyjmuje jako parametr obiekt typu HttpClientHandler. W tym obiekcie możesz zdefiniować proxy.

0

Dziękuję za podpowiedź.

Czyli jeśli wykorzystam ClientHandlera to wystarczy teraz że zrobię pętlę która co 50 pobranych stron będzie zmieniała indexy w tabeli, czyli zmieniały adresy proxy, dobrze rozumiem? :)

            string[,] SPlist = new string[10, 2] {
            { "52.52.87.235", ":8080" },
            { "142.44.243.144", ":8080" },
            { "178.32.80.234", ":1080" },
            { "183.88.244.87", ":8080" },
            { "5.128.35.36", ":3128" },
            { "139.59.53.106", ":3128" },
            { "54.37.17.150", ":8080" },
            { "109.193.195.11", ":8080" },
            { "35.199.105.78", ":8080" },
            { "95.208.208.237", ":8080" }
        };

            //int actualServerProxy = 0;
            //int actualPort = 0;
            //int pages = 0;



            for (int i = 1; i < 1; i++)
            {
                var url = "https://www.otomoto.pl/osobowe/audi/a3/?page=" + i;

                HttpClientHandler handler = new HttpClientHandler()
                {
                    Proxy = new WebProxy("http://" + SPlist[0,0] + SPlist[0, 1]),
                    UseProxy = true,
                };

                var httpClient = new HttpClient(handler);
                var html = await httpClient.GetStringAsync(url);

                var htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);
1

Rozwiązanie mojego wątku poniżej, jak by ktoś potrzebował:

Dziękuje za pomoc, temat można zamknąć.

            string[] SPlist = new string[10] {
             "94.75.76.10:8080",
             "142.44.243.144:8080",
             "178.32.80.234:1080",
             "183.88.244.87:8080",
             "5.128.35.36:3128",
             "139.59.53.106:3128",
             "54.37.17.150:8080",
             "109.193.195.11:8080",
             "35.199.105.78:8080",
             "95.208.208.237:8080" 
         };

            int actualServerProxy;
            for (int i = 0; i < 20; i++)
            {
                var url = "https://www.otomoto.pl/osobowe/audi/a3/?page=" + i + 1;

                actualServerProxy = ((int)((i + 1) / 50)) % SPlist.Length;

                HttpClientHandler handler = new HttpClientHandler()
                {
                    Proxy = new WebProxy("http://" + SPlist[actualServerProxy]),
                    UseProxy = true,
                };

                var httpClient = new HttpClient(handler);
                var html = await httpClient.GetStringAsync(url);

                var htmlDocument = new HtmlDocument();
                htmlDocument.LoadHtml(html);

1 użytkowników online, w tym zalogowanych: 0, gości: 1