Dawno dawno temu podjąłem się parsowania danych z pewnej strony www, na której obowiązywał limit ilości zapytań z jednego adresu IP. Działało to mniej więcej tak, że po kilku zapytaniach dany adres IP był blokowany na kilka minut. Ponieważ do pobrania było bardzo dużo rekordów, filtr ten skutecznie mnie blokował. Zacząłem szukać rozwiązania i po kilku iteracjach doszedłem do prostego i relatywnie taniego sposobu.
Na rynku istnieje wielu dostawców usługi zwanej Hosting SEO (do pozycjonowania) – od zwykłego hostingu różni się możliwością wykorzystania wielu adresów IP w ramach jednego konta. Adresy IP są stosunkowo drogie (jeśli potrzebujemy kilkadziesiąt), ale w hostingu SEO ta sama pula adresów dostępna jest dla wielu kont klientów. Za konto z pulą 32 adresów IP zapłacimy rzędu 20-30 zł za miesiąc. Po wykupieniu usługi i zalogowaniu się do panelu admina powinniśmy mieć dostęp do listy “naszych” adresów ip.
Zanim przejdziemy do rozwiązania, zróbmy prosty test. Spróbujmy z poziomu serwera sprawdzić adres IP. Zrobimy to za pomocą prostego skryptu php:
<?php
$ch = curl_init('http://whatismyip.org/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$myIp = curl_exec($ch);
preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/',$myIp, $out);
print_r($out);
?>
Skrypt uruchamiamy przez przeglądarkę (tani serwer raczej nie oferuje dostępu przez ssh). Wynik powinien wyglądać mniej więcej tak:
Array
(
[0] => Array
(
[0] => 212.59.244.5
)
)
Adres IP, który się wyświetli jest najprawdopodobniej przypisany domyślnie do naszego konta. Możemy przez panel administratora go zmienić i spróbować ponownie. Niestety takie rozwiązanie nie pomoże nam w szybkim zmienianiu adresów. Okazuje się, że wystarczy przy wywoływaniu CURL dodać informację, z którego interfejsu sieciowego serwera chcemy skorzystać. Na liście dostępnych dla mojego konta adresów IP były 32 pozycje:
Użyjmy pierwszego adresu z listy:
<?php
$ch = curl_init('http://whatismyip.org/');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
curl_setopt($ch,CURLOPT_INTERFACE,"31.6.69.41");
$myIp = curl_exec($ch);
preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/',$myIp, $out);
print_r($out);
?>
Otrzymujemy wynik:
Array
(
[0] => Array
(
[0] => 31.6.69.41
)
)
Działa! Za pomocą CURL możemy zdziałać cuda. Wystarczy tylko dopisać logikę, która losowo będzie przy każdym zapytaniu zmieniała adresy IP.
Jeśli ktoś jest dociekliwy to może odkryć jeszcze jedną rzecz. Wykupując najtańsze konto (z najmniejszą liczbą adresów IP) będziemy działali prawdopodobnie na tej samej maszynie co właściciele droższych pakietów. Możemy więc korzystać z całej puli adresów IP przypisanych do tego serwera, nawet jeśli nie są dla nas dostępne w panelu. U mnie działały np. takie adresy spoza listy: 31.6.69.42, 31.6.69.43, 31.6.69.45, 31.6.69.47 (więcej nie próbowałem). Użycie adresu nie przypisanego do danej maszyny spowoduje zwrócenie pustego stringa – nasze dane nie wiedziały jak wrócić.
Trzeba pamiętać jeszcze o małej małych zasobach serwera dla takiego konta hostingowego – jeśli zaczniemy generować za duże obciążenie prędzej czy później odezwie się admin z pretensjami.
Może komuś z Was się takie coś kiedyś przyda.
adres |