а можно чуть детальнее про архитектуру
Берется сайт с публичными прокси, из них выдергивается их список. Создается некоторая пачка UA. Потом список проверяется на валидность - если запросы через прокси не проходят N раз подряд, принимаем прокси за невалид и убираем из списка. Когда все прокси в списке остаются валидными запускаем основной цикл, в котором (или многопоточно, или поочередно) берем из списка прокси, в запрос подставляем UA из заготовленного списка. То есть каждый запрос - это новый прокси+UA. Когда список UA/прокси кончится, просто начинаем сначала - к этому моменту обычно уже можно использовать первую пару