Отримайте посилання на список
Після оплати в кабінеті з'являється посилання виду get.advanced.name/<ID>. Воно віддає рядки ip:port, по одному на адресу. HTTP і SOCKS5 працюють на одному порту.
Парсеру потрібно багато адрес, швидка ротація і жодного лічильника трафіку. Один пакет Advanced.name дає від 5000 до 50 000 IPv4-адрес за одним посиланням, до 5000 паралельних потоків і пул, де щодня змінюється приблизно третина адрес.
Чотири речі вирішують, чи дійде обхід до кінця, чи помре на першій капчі.
Стільки адрес, щоб один IP не стукав на сайт двічі на хвилину
Від 5000 (пакет №1) до 50 000 (пакет №6) адрес в одному списку
Свіжий пул: забанені IP мають піти раніше, ніж ви до них дійдете
Приблизно третина пулу змінюється щодоби, список оновлюється кожні 10 хвилин
Паралельні з'єднання на весь обхід
Від 500 до 5000 потоків залежно від пакета, усі протоколи на одному порту
Ніхто не рахує гігабайти
Ліміту трафіку немає в жодному безлімітному пакеті: ви платите за пакет і потоки
Регіон, пакет, термін. Ціна вказана за один авторизований IP, кожен додатковий IP додає 10%.
Після оплати в кабінеті з'являється посилання виду get.advanced.name/<ID>. Воно віддає рядки ip:port, по одному на адресу. HTTP і SOCKS5 працюють на одному порту.
Список відкривається лише з IP, які ви додали в кабінеті. Ніяких логінів і паролів у конфігу парсера: ключем є адреса.
Завантажте список, ідіть по ньому по колу, а якщо запит упав, повторіть URL через наступний проксі. Скрипт нижче робить саме це на стандартній бібліотеці.
Вкажіть у CSV_URL посилання на вивантаження з кабінету, задайте COUNTRY і MIN_SPEED, а цільові URL покладіть у urls.txt. Скрипт лишає лише потрібну країну, завантажує кожен URL через наступний проксі і повторює запит з іншої адреси, якщо попередній упав. Спершу перевірте пул Socks List Processor.
#!/usr/bin/env python3
"""Multithreaded scraper for Advanced.name proxies.
Reads the CSV proxy export, keeps the country and speed you need, then fetches a
list of target URLs through rotating proxies with automatic retries. Standard
library only, no pip. Edit the CONFIG block and run: python3 scrape.py
"""
# ================================ CONFIG ====================================
CSV_URL = "https://get.advanced.name/YOUR_LIST_ID.csv" # CSV export link from your dashboard
COUNTRY = "DE" # ISO 3166-1 alpha-2 (e.g. DE, NL, US), or "" for the whole pool
MIN_SPEED = 3 # keep proxies with speed >= this value (higher is better)
THREADS = 50 # parallel requests
TIMEOUT = 15 # seconds per request
RETRIES = 3 # proxies to try before a URL is marked failed
URLS_FILE = "urls.txt" # one target URL per line
OUT_DIR = "pages" # fetched HTML is written here as 1.html, 2.html, ...
# ============================================================================
import csv
import io
import itertools
import os
import sys
import threading
import urllib.request
from concurrent.futures import ThreadPoolExecutor, as_completed
# CSV columns from the dashboard export, ';' separated:
# ip ; port ; country ; speed ; uptime ; exit_ip
COL_IP, COL_PORT, COL_COUNTRY, COL_SPEED, COL_UPTIME = 0, 1, 2, 3, 4
UA = "Mozilla/5.0 (compatible; scraper/1.0)"
def load_proxies():
"""Download the CSV list, keep the wanted country and speed, fastest first."""
raw = urllib.request.urlopen(CSV_URL, timeout=30).read().decode("utf-8", "replace")
pool = []
for row in csv.reader(io.StringIO(raw), delimiter=";"):
if len(row) <= COL_SPEED or not row[COL_PORT].strip().isdigit():
continue
country = row[COL_COUNTRY].strip().upper()
speed = int(row[COL_SPEED] or 0)
if COUNTRY and country != COUNTRY.upper():
continue
if speed < MIN_SPEED:
continue
pool.append((row[COL_IP].strip() + ":" + row[COL_PORT].strip(), speed))
pool.sort(key=lambda item: -item[1])
return [addr for addr, _ in pool]
def opener_for(proxy):
handler = urllib.request.ProxyHandler({"http": "http://" + proxy, "https": "http://" + proxy})
return urllib.request.build_opener(handler)
def main():
proxies = load_proxies()
if not proxies:
sys.exit("No proxies match COUNTRY=%r and MIN_SPEED=%d." % (COUNTRY, MIN_SPEED))
with open(URLS_FILE, encoding="utf-8") as fh:
urls = [u for u in map(str.strip, fh) if u and not u.startswith("#")]
os.makedirs(OUT_DIR, exist_ok=True)
print("proxies: %d (%s), urls: %d, threads: %d" % (len(proxies), COUNTRY or "any", len(urls), THREADS))
rotation = itertools.cycle(proxies)
lock = threading.Lock()
done = {"ok": 0, "fail": 0}
def fetch(index, url):
for _ in range(RETRIES):
with lock:
proxy = next(rotation)
req = urllib.request.Request(url, headers={"User-Agent": UA})
try:
body = opener_for(proxy).open(req, timeout=TIMEOUT).read()
except Exception:
continue
with open(os.path.join(OUT_DIR, "%d.html" % index), "wb") as out:
out.write(body)
return True
return False
with ThreadPoolExecutor(max_workers=THREADS) as pool:
futures = {pool.submit(fetch, i, u): u for i, u in enumerate(urls, 1)}
for fut in as_completed(futures):
ok = fut.result()
with lock:
done["ok" if ok else "fail"] += 1
total = done["ok"] + done["fail"]
sys.stderr.write("\r%d/%d ok %d fail %d" % (total, len(urls), done["ok"], done["fail"]))
sys.stderr.flush()
print("\nsaved %d pages to %s/ (%d failed)" % (done["ok"], OUT_DIR, done["fail"]))
if __name__ == "__main__":
main()
Передавайте проксі в кожен запит: зберіть opener з ProxyHandler або дайте requests параметр proxies={'http': 'http://ip:port', 'https': 'http://ip:port'}. HTTP і SOCKS ділять один порт, тож http:// покриває обидва; для SOCKS5 у requests встановіть requests[socks] і пишіть socks5h://ip:port, щоб DNS резолвився на боці проксі.
Прочитайте список один раз, ідіть по ньому по колу і беріть наступну адресу на кожен запит. Невдалий URL повторіть через інший проксі двічі-тричі, перш ніж відкинути; скрипт вище вже так і робить.
У Scrapy покладіть адресу в request.meta['proxy'] або візьміть middleware для ротації проксі, націлений на файл, який пише збирач, і тримайте CONCURRENT_REQUESTS не вище за ліміт потоків вашого пакета. Візуальні краулери на кшталт Octoparse і ParseHub беруть той самий список ip:port у налаштуваннях проксі.
Перед довгим обходом один раз відфільтруйте пул Socks List Processor, щоб мертві адреси не доходили до парсера. Для швидкої проби коду вистачить безкоштовного списку проксі.


Обхід в обсязі дешевший на безлімітному пакеті. Сайти, які банять адреси зі списків, проходьте на Resi Core, дані за містами знімайте з Resi Prime.
Обхід в обсязіНайкращий вибір
Трафік не рахується: гігабайти HTML і картинок не змінюють ціну. Третина адрес оновлюється за добу, забанені йдуть зі списку.
$700 на місяцьабо $2.70 за годину
Захищені сайти
Нова домашня IP на кожен запит. Беріть для сайтів, де адреси пакета ловлять капчу. Країну задаєте в рядку підключення.
від $0.49 за ГБ1 ГБ за $0.85
Дані за містами
Місто, регіон, провайдер і ASN у рядку підключення. Потрібен, коли сайт віддає різним містам різні дані.
від $1.39 за ГБ1 ГБ за $2.29
Виберіть пакет, візьміть безкоштовну тестову годину і запустіть парсер на справжньому пулі.