Смена прокси
-
Посоветуйте плиз, как лучше реализовать смену прокси. Ситуация такая: беру
- лист.тхт с проксями.
- Ставлю в начале цикла брать прокси - вывожу когда взяли.
- в Лог выводится такая картина:
Но прокси почему-то не применяется (видимо не пашет или какая может быть причина ?!)
Вопрос, если не применяется (как на картинке) - как сделать так, чтобы он автоматом брал следующий - и пока не будет рабочего прокси, дальше цикл идти не будет?
(До этого прокси лист тестил на чекерах, вроде все валидные)
-
@ogurchiki
Делаю такое через создание и вызов рекурсивной функции такого вида.
Иногда сайт блочит IP, но всё равно отдает 200. В этом случае, добавляю проверку содержимого тега title через XPATHМожно через цикл делать, хоть это и менее изящно. Примерно так:
Сайт, к которому отправляем запрос, разумеется, подставляем свой =)
-
@xclsv попытался сделать через вызов функции, выдает такую ошибку (в логе):
//[14:22:19] Поток №1 : ReferenceError: Can't find variable: change_proxy Номер строки:3 Во время выполнения скрипта { _call(change_proxy,null,function(){ _next_or_section(1,function(){ })})}
Я все правильно делаю? Эту функцию надо в начале скрипта писать? или как-то вызывать?
1.Создал новую функцию (OnApplicationStart)Функция change_proxy это уже готовая функция? или её нужно самому создать?
Какая структура получается?Http клиент берет прокси;
Отправляет get-Запрос на яндекс;
Сохраняет статус ответа;
Потом если статус ответа 200, то сохраняет в переменную WAS_EROR ( это что за переменная**?**) (непонятно)
И вызывает функцию change_proxy ? (непонятно)
А если нормально все(статус ответа не 200) - то он должен продолжать дальше цикл?Сорри за глупые вопросы)
-
@ogurchiki В BAS'e нет готовых функций, все функции создаёшь, называешь и вызываешь сам.
В мануале всё есть:Вы можете прочитать переменную WAS_ERROR чтобы проверить, были ли ошибки во время последнего блока «Игнорировать Ошибки».
В переменной LAST_ERROR содержится текст ошибки.
-
@ogurchiki said in Смена прокси:
@xclsv попытался сделать через вызов функции, выдает такую ошибку (в логе):
//[14:22:19] Поток №1 : ReferenceError: Can't find variable: change_proxy Номер строки:3 Во время выполнения скрипта { _call(change_proxy,null,function(){ _next_or_section(1,function(){ })})}
Я все правильно делаю? Эту функцию надо в начале скрипта писать? или как-то вызывать?
Как верно написал выше Fox, все функции, кроме OnApplicationStart пишутся вручную. Ошибка в логе как раз и говорит о том, что функцию change_proxy в программе никто не объявлял и не описывал. Чтобы все заработало, необходимо создать функцию с таким названием, вставить в нее блоки вроде тех, что в моем первом ответе в топике и вызвать в том месте программы, где необходимо определить или сменить прокси. Крайне рекомендую почитать о том, что такое рекурсия. Это решит ещё 100500 проблем в будущем.
1.Создал новую функцию (OnApplicationStart)
Функция change_proxy это уже готовая функция? или её нужно самому создать?
Да, в каких-то случаях такое можно использовать в OnApplicationStart. Но что тогда делать, если прокси слетит во время работы скрипта или нужно будет использовать прокси в многопотоке? В общем, от использования OnApplicationStart рекомендую отказаться и сделать как я описал Выше.
Ошибка на твоем скриншоте также в том, что ты дважды на одной итерации запрещаешь повторно использовать строку ресурса. Тоесть у тебя программа использует первый прокси, выведет в лог уже второй. А если прокси окажется плохим, то использует третий, а второй просто выведет в лог и пропустит. Не следует запрещать использовать строку ресурса повторно в блоке Http клиент проксиКакая структура получается?
Http клиент берет прокси;
Отправляет get-Запрос на яндекс;
Сохраняет статус ответа;
Потом если статус ответа 200, то сохраняет в переменную WAS_EROR ( это что за переменная**?**) (непонятно)
И вызывает функцию change_proxy ? (непонятно)
А если нормально все(статус ответа не 200) - то он должен продолжать дальше цикл?Сорри за глупые вопросы)
WAS_ERROR - это переменная, которая автоматически объявляется при использовании в скрипте блока Игнорировать ошибки. Если этот блок не использовать, то в твоем случае, если прокси окажется мертвым, программа вылетит с ошибкой. А при его использовании работа будет продолжаться. Сразу после отработки этого блока в переменную WAS_ERROR запишется 1, если ошибка была или 0, если ошибки не было.
Структура примерно такая:
- В нужном месте программы вызывается вышеописанная функция смены прокси.
- Из ресурса берется и устанавливается прокси.
- Отправляется get-Запрос. Лучше не на Яндекс, а сразу на Ваш сайт. Ведь в Яндексе прокси может быть заблочен, а на Вашем сайте нет.
- Сохраняем статус ответа сервера (или, лучше, сохраняем сам ответ сервера и читаем содержимое тега title на нужном нам сайте).
- Если ответ сервера не 200 или была ошибка во время использования блока Игнорировать ошибки, то эта функция снова вызывается (да, функция вызывает сама себя. Так можно =)) и все вышеописанное повторяется снова, но уже со следующим прокси. Так будет до тех пор, пока ответ сервера будет 200 и не будет ошибок во время запросов к нужному сайту.
-
Пара моментов, прокси из ресурса лучше брать в переменную, чтобы её потом выводить в лог или применять. В WAS_ERROR содержится булево, то есть "true" (да, была ошибка) или "false" (ошибки не было).
-
-
Работало, работало.. а потом бац - ошибка:
[19:49:34] Поток №1 : ReferenceError: Can't find variable: VAR_SAVED_STATUS Номер строки:2 Во время выполнения скрипта { _if((VAR_SAVED_STATUS!=200)||(VAR_WAS_ERROR),function(){ section_insert() section_start("test", 911045989,function(){ })},function(){ section_start("test", 33363679,function(){ })})}
=\
-
@ogurchiki said in Смена прокси:
Работало, работало.. а потом бац - ошибка:
[19:49:34] Поток №1 : ReferenceError: Can't find variable: VAR_SAVED_STATUS Номер строки:2 Во время выполнения скрипта { _if((VAR_SAVED_STATUS!=200)||(VAR_WAS_ERROR),function(){ section_insert() section_start("test", 911045989,function(){ })},function(){ section_start("test", 33363679,function(){ })})}
=\
Ошибка указывает на то, что переменная SAVED_STATUS не объявлена на момент ее использования.
Кинь скрин кода.
-
@xclsv Не могу воспроизвести, сейчас снова все работает без ошибок. Как только повторится, я напишу в этом топике. По моим наблюдениям была, когда статус запроса был не 200.
-
@xclsv Протестил, если код ответа не 200, то ошибка:
Code: //{ CYCLE_INDEX: 0, LAST_ERROR: "Could not resolve host: sdffsdfsdfs.fdsfsd.ru", NEW_VARIABLE: "85.15.69.131:8081", SAVED_STATUS: "undefined", SAVED_TEXT: "undefined", WAS_ERROR: true }
Скрин:
-
@ogurchiki смотри, у тебя ошибка возникает при гет запросе, и метка выполнения выходит из блока игнорирования ошибок минуя получение статуса. В логе же ты выводишь переменную статуса ответа, которой нету. Нужно менять логику так, что бы либо не использовать статус ответа, либо прлучать его только если запрос был без ошибок
-
@ogurchiki said in Смена прокси:
@xclsv Протестил, если код ответа не 200, то ошибка:
Code: //{ CYCLE_INDEX: 0, LAST_ERROR: "Could not resolve host: sdffsdfsdfs.fdsfsd.ru", NEW_VARIABLE: "85.15.69.131:8081", SAVED_STATUS: "undefined", SAVED_TEXT: "undefined", WAS_ERROR: true }
Скрин:
Да, @DrPrime правильно пишет.
- Ситуация может сложиться так, что get-запрос не отправится, т.к. прокси окажется мертвым. А значит и ответ сервера ты никак не получишь. По мне так это всё равно должно удовлетворять условию SAVED_STATUS!=200, но, видимо, в программировании это не так. Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль. Ну или просто попробуй убрать логгирование ответа сервера. Тебе ведь нужно знать не код ответа, а рабочий прокси или нет. То, что bas справится с проверкой 200 или не 200, можешь не сомневаться =)
- Во-вторых, сам get-запрос нужно делать под прокси. У тебя же прокси перед get-запросом не устанавливается и запрос происходит под ip твоей компьютерной сети.
-
@xclsv Вроде все сделал, все-равно ошибка...
Если не сложно, покажите (скрином) как в итоге должно получиться, например с костылем
"Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль."
Никак не получается
-
@ogurchiki said in Смена прокси:
@xclsv Вроде все сделал, все-равно ошибка...
Если не сложно, покажите (скрином) как в итоге должно получиться, например с костылем
"Можно вставить костыль и в самом начале записать в переменную SAVED_STATUS ноль."
Никак не получаетсяПеред http-клиент прокси вставляем блок Установить переменную. Параметры блока такие:
-
@xclsv спасибо!
-
-
@xclsv да, теперь все пашет (меняются прокси без ошибок), даже когда сайт не але и прокси не але (тьфу тьфу). Утром попробовал добавить переменную 0 в SAVED_STATUS - не получалось, видимо из-за типа значения. по дефолту тип значения не int. В этих вещях начинающий, разницы не увидел. Еще раз биг сенк)
-
@ogurchiki said in Смена прокси:
@xclsv да, теперь все пашет (меняются прокси без ошибок), даже когда сайт не але и прокси не але (тьфу тьфу). Утром попробовал добавить переменную 0 в SAVED_STATUS - не получалось, видимо из-за типа значения. по дефолту тип значения не int. В этих вещях начинающий, разницы не увидел. Еще раз биг сенк)
Да, именно из-за этого =)
-
Тоже возникла проблемка при смене прокси. Сделал так, как здесь описано, правда я работаю через браузер, но думаю это не особо важно - принцип такой же.
Создал ресурс, где прокси берутся по ссылке, нужно проверять что это РУ прокси, если нет - ошибка и снова вызов функции. Так вот, если указываю для прокси параметр notreuse, то скрипт отрабатывает ошибку (если прокси не подходит), переходит к установке прокси и все, зависает.
Если же notreuse не указан, то скрипт берет все время один и тот же прокси.
Где косяк? Помогите )
-
@Inwnew всмысле зависает на стадии когда взяли прокси и применили ?