- Хост
- gw.prokso.com
- Порт
- 823 HTTP · 824 SOCKS5 — новий IP на кожен запит · 10000–20000 фіксований IP (sticky-сесія), HTTP(S) і SOCKS5
- Логін і пароль
- у кабінеті, на сторінці плану
Готові рядки у потрібному форматі генерує кабінет: оберіть країну, тип IP і протокол.
- Хост — gw.prokso.com, порти 823 (HTTP), 824 (SOCKS5), 10000–20000 (фіксований IP, HTTP або SOCKS5)
- Логін і пароль — у кабінеті на сторінці плану
- Перевіряйте IP у відповіді самого запиту через проксі: сторінка «Мій IP» у браузері ваш скрипт не перевіряє
Покрокова інструкція, як підключити проксі Prokso в LangChain. Займе кілька хвилин.
Крок 1. Візьміть дані проксі в особистому кабінеті
Відкрийте план і скопіюйте хост gw.prokso.com, порт, логін і пароль. Порт 823 — HTTP, 824 — SOCKS5 (обидва дають новий IP на кожен запит); порти 10000–20000 — фіксований IP (sticky-сесія) до 120 хвилин, працюють і як HTTP, і як SOCKS5 (кожен порт — окрема адреса). Країну задають у логіні: логін__cr.ua.
Крок 2. Встановіть пакети
pip install -U langchain-community beautifulsoup4. Завантажувач сторінок WebBaseLoader лежить у пакеті langchain-community, а beautifulsoup4 потрібен йому, щоб розібрати HTML. Звичайне завантаження йде через бібліотеку requests, асинхронне — через aiohttp, і проксі для них задається по-різному.
Крок 3. Передайте проксі завантажувачу
Для методів load() і lazy_load() передайте параметр proxies — словник з адресою проксі для http і https. Логін і пароль впишіть просто в адресу. Параметр requests_kwargs передає додаткові налаштування в кожен запит, наприклад timeout, щоб скрипт не висів на повільній сторінці.
from langchain_community.document_loaders import WebBaseLoader
PROXY = "http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823"
loader = WebBaseLoader(
"https://api.ipify.org?format=json",
proxies={"http": PROXY, "https": PROXY},
requests_kwargs={"timeout": 30},
)
docs = loader.load()
print(docs[0].page_content)Крок 4. Асинхронне завантаження — через змінні середовища
Методи alazy_load() і fetch_all() (а також застарілий aload()) працюють через aiohttp і параметр proxies не враховують. Для них задайте змінні HTTP_PROXY і HTTPS_PROXY і створіть завантажувач з trust_env=True: без цього aiohttp змінні ігнорує. Так само налаштовується AsyncHtmlLoader.
import asyncio
import os
os.environ["HTTP_PROXY"] = "http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823"
os.environ["HTTPS_PROXY"] = "http://ЛОГІН:ПАРОЛЬ@gw.prokso.com:823"
from langchain_community.document_loaders import WebBaseLoader
async def main():
loader = WebBaseLoader(
web_paths=["https://api.ipify.org?format=json"] * 3,
trust_env=True,
requests_per_second=2,
)
async for doc in loader.alazy_load():
print(doc.page_content)
asyncio.run(main())Крок 5. Змінні середовища для інших завантажувачів
Бібліотека requests за замовчуванням читає HTTP_PROXY і HTTPS_PROXY, тому змінні, задані до запуску скрипту, діють і для завантажувачів на requests без власного параметра проксі. Але врахуйте: за документацією requests змінні середовища перекривають проксі, заданий на рівні сесії, тобто параметр proxies у WebBaseLoader. Обирайте один спосіб на скрипт.
Крок 6. Оберіть порт і темп
Порт 823 дає новий IP на кожну сторінку — зручно для збору багатьох сторінок. Щоб серія сторінок завантажувалася з одного IP, візьміть фіксований порт 10000–20000. В асинхронному режимі параметр requests_per_second обмежує, скільки сторінок завантажується одночасно; за замовчуванням — 2.
Крок 7. Перевірте вивід
Запустіть приклад: завантажувач відкриває https://api.ipify.org і друкує вміст сторінки — IP, який бачить сайт. Це має бути адреса проксі, а не ваша; в асинхронному прикладі на порту 823 три рядки покажуть різні адреси. Помилка 407 означає неправильний логін або пароль чи вичерпаний трафік на плані. Сторінка «Мій IP» у браузері тут не допоможе: браузер іде напряму.
Окремий завантажувач для кожної країни і сесія на джерело
Коли базі знань потрібні локальні версії сторінок (ціни, наявність, місцеві новини), створіть окремий WebBaseLoader для кожної країни. Країна йде в логін, пароль береться зі змінної середовища, а обидва проходять через urllib.parse.quote(..., safe=""), щоб символ ; і спецсимволи не зламали адресу проксі. Перед відправкою requests сам декодує їх назад.
import os
from urllib.parse import quote
from langchain_community.document_loaders import WebBaseLoader
USER = "ЛОГІН"
PASSWORD = os.environ["PROKSO_PASSWORD"] # пароль не зберігаємо в коді
def proxy_url(country, session=None, port=823):
login = f"{USER}__cr.{country}"
if session:
login += f";sessid.{session}" # один IP приблизно на 30 хвилин
return f"http://{quote(login, safe='')}:{quote(PASSWORD, safe='')}@gw.prokso.com:{port}"
SOURCES = {
"de": ["https://example.de/catalog?page=1", "https://example.de/catalog?page=2"],
"pl": ["https://example.pl/catalog?page=1", "https://example.pl/catalog?page=2"],
}
docs = []
for country, urls in SOURCES.items():
proxy = proxy_url(country, session=f"src{country}")
loader = WebBaseLoader(
web_paths=urls,
proxies={"http": proxy, "https": proxy},
requests_kwargs={"timeout": 30},
raise_for_status=True,
)
for doc in loader.lazy_load(): # по одній сторінці, без усього списку в пам'яті
doc.metadata["country"] = country
docs.append(doc)
print(len(docs))Номер сесії в логіні (;sessid.srcde) тримає один IP приблизно 30 хвилин на порту 823, тож усі сторінки одного джерела, наприклад пагінація каталогу, ідуть з тієї самої адреси. Кожна країна отримує свою сесію. lazy_load() повертає документи по одному: з довгим списком кожен можна одразу записувати у векторне сховище, а поле country в метаданих допоможе потім фільтрувати відповіді.
Помилки завантажувачів LangChain через проксі і як їх виправити
- Сторінка 403 чи 429 потрапляє в базу знань. За замовчуванням
WebBaseLoaderне перевіряє код відповіді, тому сторінка «Access denied» розбирається як звичайний документ. Задайтеraise_for_status=True: тодіload()іlazy_load()кидаютьrequests.HTTPError, і сторінку можна пропустити, а не індексувати. - InvalidProxyURL:
Please check proxy URL. It is malformed and could be missing the host.requests не знайшла хост в адресі проксі. Зазвичай незакодований@чи/у паролі зсунув межу між частинами адреси. Збирайте адресу черезquote(), як у прикладі вище. - aiohttp.ClientHttpProxyError зі статусом 407 в
alazy_load()чиfetch_all(). Проксі не прийняв логін або пароль ізHTTPS_PROXY. Асинхронний завантажувач цю помилку не повторює, а падає одразу. Закодовані символи тут теж працюють: aiohttp декодує їх сам. - aiohttp.ClientProxyConnectionError. aiohttp взагалі не дістався до
gw.prokso.com: перевірте порт і те, що вихідні з'єднання на нього дозволені на вашому сервері. Завантажувач робить 3 спроби зі зростаючою паузою, а потім здається. - Одна невдала сторінка зупиняє все асинхронне завантаження. За замовчуванням помилка на одній адресі перериває роботу. З
continue_on_failure=Trueзавантажувач пише попередження і повертає для цієї сторінки порожній документ: відфільтруйте порожні документи перед індексацією.
Темп і трафік у пайплайні LangChain
В асинхронному режимі requests_per_second — не швидкість за секунду: у коді бібліотеки це розмір семафора, тобто скільки сторінок вантажиться одночасно. На порту 823 кожна з них іде зі свого IP, але власні обмеження сайту ніхто не скасовував. Для одного сайту тримайте значення низьким і піднімайте його лише для списків різних сайтів.
Трафік рахується в обидва боки. WebBaseLoader завантажує тільки HTML сторінки, без картинок і скриптів, тож коштує менше за завантажувач на браузері, якщо сторінці не потрібен JavaScript. Приберіть дублікати адрес перед завантаженням і зберігайте вже завантажені URL, щоб наступний запуск їх пропускав. Куплені гігабайти не згорають, тож пауза між запусками нічого не коштує. Збирайте лише те, що дозволяють правила сайту, і в межах наших правил використання.
Якщо проксі не працює
Питання й відповіді
Чи можна підключити SOCKS5?
Для load() — так: встановіть pip install "requests[socks]" і вкажіть у proxies адресу socks5h://ЛОГІН:ПАРОЛЬ@gw.prokso.com:824, тоді й DNS-запити йдуть через проксі. Асинхронні методи працюють через aiohttp, а він підтримує лише HTTP-проксі.
Проксі вказано, а сайт бачить мій IP. Чому?
Найчастіше одна з двох причин. Або ви викликаєте асинхронний метод, який не бачить параметра proxies, — задайте змінні середовища й trust_env=True. Або в системі задано HTTP_PROXY чи HTTPS_PROXY з іншою адресою, і вони перекрили параметр.
Що означає помилка ProxyError: 407?
Проксі не прийняв логін або пароль. Скопіюйте рядок із генератора в кабінеті ще раз і перевірте, чи на плані лишився трафік.
Чому асинхронний завантажувач не повторює 403 чи 429?
Він повторює лише помилки з'єднання aiohttp. Коди від сайту повертаються як текст сторінки або одразу як помилка, якщо задано raise_for_status=True. Миттєвий повтор 429 і так не допоможе: зменште requests_per_second і поверніться пізніше.
Чи можна тримати один IP для багатосторінкового джерела без фіксованого порту?
Так. Додайте ;sessid.<назва> до логіна на порту 823, і адреса триматиметься приблизно 30 хвилин. Для довших завдань візьміть фіксований порт 10000–20000: там час утримання задається в кабінеті, до 120 хвилин.
Чи коштує вибір країни в логіні додатково?
Ні, країна безкоштовна. Подвійно рахується лише трафік із точним гео: регіон, місто, ZIP чи оператор. Ціни за ГБ — на сторінці <a href="/pricing">тарифів</a>.