Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Перебор проксей из массива
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Перебор проксей из массива

Страниц (1): [1]
 

1. xsh - 15 Августа, 2011 - 16:17:14 - перейти к сообщению
Просьба помочь с проблемой подвисания скрипта, а именно как я понял не осуществляется переключение на новый прокси если не приходит ответ или приходит ответ с ошибкой.
На деле все выглядит так что скрипт выдает результаты, пока прокси не банится, после этого прокси не переключается на новый из массива проксей, и работа скрипта не продолжается. Если же остановить скрипт и почистить в листе проксей пару-тройку проксей, и перезапустить скрипт, то работа продолжается до следующего подвисания.
Цель скрипта чтобы он обработал все строки из файла url.txt, а прокси перебирались по порядку, по кругу пока весь файл url.txt не будет обработан. Спасибо.

PHP:
скопировать код в буфер обмена
  1. $urll = 'url.txt';
  2. $file = file($urll, FILE_IGNORE_NEW_LINES);
  3. $proxylist = 'proxy.txt'; // по одному прокси на строку
  4.  
  5. function get($url, $prox)
  6. {
  7.     $ch = curl_init();
  8.     curl_setopt($ch, CURLOPT_URL, $url);
  9.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  10.     curl_setopt ($ch, CURLOPT_TIMEOUT, 5);
  11.     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
  12.     curl_setopt($ch, CURLOPT_PROXY, "$prox");
  13.     $ss=curl_exec($ch);
  14.     curl_close($ch);
  15.     return $ss;
  16. }
  17.  
  18. $prox = array();
  19. if( is_file($proxylist))
  20. {
  21. $handle = fopen($proxylist, "r");
  22. while (($data = fgetcsv($handle, 40)) !== FALSE)
  23. {
  24. $prox[] = $data[0];
  25. }
  26. }
  27.  
  28. foreach( $prox as $proxy ){
  29. foreach( $file as $n ){
  30. $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $proxy);
  31.      if(preg_match('/snapshot of the page as it appeared on (.*)? GMT/',$content,$match) or preg_match('/по состоянию на (.*)? GMT/',$content,$match)){
  32.      print("$n $match[1]\n");
  33.      file_put_contents("cache_date.txt","$n $match[1]\n", FILE_APPEND);
  34.     }
  35. }
  36. }
2. Elio - 15 Августа, 2011 - 16:34:49 - перейти к сообщению
ммм... а что пишет
curl_getinfo($ch) ?
PHP:
скопировать код в буфер обмена
  1. $info = curl_getinfo($ch);
  2. $error = curl_error($ch).'('.curl_errno($ch).')'.' ['.$info['http_code'].']';


И вопрос по логике скрипта... сейчас на сколько я понял: есть 10 прокси и 100 строк поиска.
Скрипт берёт 1 прокси и прогоняет все 100 строк. Потом берёт второй прокси и прогонят ещё 100 строк. Надо на выходе получить пройденных 1000 строк или надо просто обойти 100 строк, но с подменой ip при его бане?
3. xsh - 15 Августа, 2011 - 16:53:51 - перейти к сообщению
Elio пишет:
ммм... а что пишет
curl_getinfo($ch) ?
извиняюсь за криворукость, но не понял куда вставить код, чтобы что-то толковое вышло.
Elio пишет:
И вопрос по логике скрипта... сейчас на сколько я понял: есть 10 прокси и 100 строк поиска.

если точнее примерно 500 строк прокси и 1000 строк url
Elio пишет:
Скрипт берёт 1 прокси и прогоняет все 100 строк. Потом берёт второй прокси и прогонят ещё 100 строк. Надо на выходе получить пройденных 1000 строк или надо просто обойти 100 строк, но с подменой ip при его бане?
На выходе надо пройти все строки из url.txt и без разницы сколько на это прокси потребуется, вполне может быть и так что по 1 прокси на запрос, а потом просто по кругу прокси идут из массива, если их меньше чем url. главное чтобы при неполучении нужного ответа от прокси или просто при неполучении какого либо ответа, ip менялся на следующий, а url оставался прежний пока ответ не будет получен. по окончании и прохождения всех элементов из массива формируемого из url.txt скрипт завершает работу. постарался объяснить как можно подробнее.
4. Elio - 16 Августа, 2011 - 08:47:10 - перейти к сообщению
Предыдущий код надо вставить после 13ой строки.
Быстры фикс данной программы:
Добавить условия перехода к следующему итератору прокси, при получении страницы с ошибкой.
Действия:
1) Выяснить какой текст выводит страница с ошибкой. После 14той строки вставить

записываем последнюю скачанную страницу в файл put.html, что-бы потом посмотреть как выглядит страницу на которой виснет скрипт.
2) заменить ненужный цикл прокси с 28й строки по 35 на:
PHP:
скопировать код в буфер обмена
  1. foreach( $file as $n ){
  2.     $content="";
  3.     while(strlen($content)<1){
  4.                 $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);
  5.             if(preg_match('/snapshot of the page as it appeared on (.*)? GMT/',$content,$match) or preg_match('/по состоянию на (.*)? GMT/',$content,$match)){
  6.                         print("$n $match[1]\n");
  7.                         file_put_contents("cache_date.txt","$n $match[1]\n", FILE_APPEND);
  8.                 }
  9.                 elseif($content=='') array_shift ($prox);
  10.         }
  11. }

если мы не нашли на странице того что искали. Проверяем получена ли вообще страница. если нет то удаляем одну строку прокси и следующий запрос уже отправляем с другим прокси. (когда узнаешь, что ты получаешь на плохой странице, то в условие elseif нужно будет добавить поиск уникального текста который есть только на "плохой" странице и при ее нахождении менять прокси.)
3) Добавить после 12ой строки:
PHP:
скопировать код в буфер обмена
  1. curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, WAITING_TIME);
  2.         curl_setopt($curl, CURLOPT_TIMEOUT, WAITING_TIME);

где вместо WAITING_TIME указать время в секундах, которое скрипту нужно ожидать до получения ответа от сервера. (защита от долгой загрузки страницы.) время варьируется от качества прокси у меня стоит 25.
4) while(strlen($content)<1) добавлен для того, чтобы не получить ответ на каждую строку запроса. (опять же надо смотреть какой возвращается ошибочная страница и заменит здесь условие) в моём примере предполагается, что страница возвращается пустой.
5. xsh - 16 Августа, 2011 - 10:11:55 - перейти к сообщению
Elio спасибо большое, сейчас попробую.
(Добавление)
Elio пишет:
if(file_exists('put.html')unlink('put.html');
file_put_contents('put.html', $text);

тут вроде скобки не хватает, но все равно ошибку выдает PHP Parse error: syntax error, unexpected T_STRING
6. Elio - 16 Августа, 2011 - 11:11:41 - перейти к сообщению
прошу прощения... тут это должно выглядеть так:

а в какой строке он выдаёт ошибку?
7. xsh - 16 Августа, 2011 - 11:13:13 - перейти к сообщению
Elio пишет:
прошу прощения... тут это должно выглядеть так:

а в какой строке он выдаёт ошибку?

в этой
PHP:
скопировать код в буфер обмена
  1. if(file_exists('put.html'))unlink('put.html');

(Добавление)
уже работает, файл put.html пишется.
(Добавление)
PHP:
скопировать код в буфер обмена
  1.     $urll = 'url.txt';
  2.     $file = file($urll, FILE_IGNORE_NEW_LINES);
  3.     $proxylist = 'proxy.txt'; // по одному прокси на строку
  4.      
  5.     function get($url, $prox)
  6.     {
  7.         $ch = curl_init();
  8.         curl_setopt($ch, CURLOPT_URL, $url);
  9.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  10.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
  11.         curl_setopt($ch, CURLOPT_PROXY, "$prox");
  12.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
  13.         curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  14.         $ss=curl_exec($ch);
  15.         $info = curl_getinfo($ch);
  16.         $error = curl_error($ch).'('.curl_errno($ch).')'.' ['.$info['http_code'].']';
  17.         curl_close($ch);
  18.         if(file_exists('put.html'))unlink('put.html');
  19.         file_put_contents('put.html', $ss);
  20.         return $ss;
  21.     }
  22.      
  23.     $prox = array();
  24.     if( is_file($proxylist))
  25.     {
  26.     $handle = fopen($proxylist, "r");
  27.     while (($data = fgetcsv($handle, 40)) !== FALSE)
  28.     {
  29.     $prox[] = $data[0];
  30.     }
  31.     }
  32.      
  33.     foreach( $file as $n ){
  34.         $content="";
  35.         while(strlen($content)<1){
  36.                     $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);
  37.                 if(preg_match('/snapshot of the page as it appeared on (.*)? GMT/',$content,$match) or preg_match('/по состоянию на (.*)? GMT/',$content,$match)){
  38.                             print("$n $match[1]\n");
  39.                             file_put_contents("cache_date.txt","$n $match[1]\n", FILE_APPEND);
  40.                     }
  41.                     elseif($content=='') array_shift ($prox);
  42.             }
  43.     }

все верно?
(Добавление)
итак один из вариантов ошибки из put.html. думаю не единственный.
CODE (html):
скопировать код в буфер обмена
  1. <TITLE>302 Moved</TITLE></HEAD><BODY>
  2. <H1>302 Moved</H1>
  3. The document has moved

(Добавление)
если прописать:
PHP:
скопировать код в буфер обмена
  1.            elseif($content=='<TITLE>302 Moved</TITLE>') array_shift ($prox);

то что вписать в
PHP:
скопировать код в буфер обмена
  1. while(strlen($content)<1){

?
(Добавление)
и что делать если обнаружится не одна а несколько ошибок? сейчас пытаюсь другие выявить.
(Добавление)
а 302 ошибку отдает гугл когда банит прокси, он переадресует на страницу вида http://www[dot]google[dot]com/sorry/?con[dot][dot][dot]arch?q=cache:URL ну и "Мы зарегистрировали подозрительный трафик, исходящий из вашей сети. Повторите запрос позднее."
прокси при этом не переключается на новый, и скрипт виснет. сейчас тоже не переключается. наверное потому что elseif не прописал
8. Elio - 16 Августа, 2011 - 12:42:19 - перейти к сообщению
$content=='<TITLE>302 Moved</TITLE>' - не подействует... тк html страница отличается от это записи. но смысл правильный.
elseif($content=='' OR strpos($content, '302 Moved') !== false) http://www.php.su/array_shift " target="_blank">array_shift ($prox);
и также ещё кучу условий можно впихнуть через "OR" или "||".
ещё не плохо бы было поставить условие, что у нас могут закончится прокси.
if(count($prox)==0) $prox=get_proxy(); ссылку на функцию присвоения прокси.

PHP:
скопировать код в буфер обмена
  1. function get_proxy(){
  2.         $proxylist = 'proxy.txt';
  3.         $prox = array();
  4.     if(is_file($proxylist)){
  5.                 $handle = fopen($proxylist, "r");
  6.         while (($data = fgetcsv($handle, 40)) !== FALSE) $prox[] = $data[0];
  7.                 fclose($handle);
  8.                 return $prox;
  9.     }
  10.         else return false;
  11. }

изначально в коде не было fclose($handle).
while я думаю в данном скрипте можно не трогать. но можно подменить его проверку. те когда мы получаем ошибку 303. то $content будет по strlen больше 1, а нам надо чтобы скрипт прошёл строку ещё раз, но с другим прокси. поэтому пишем:
PHP:
скопировать код в буфер обмена
  1. elseif($content=='' OR strpos($content, '302 Moved') !== false) {
  2.      array_shift ($prox);
  3.      $content='';
  4. }
9. xsh - 16 Августа, 2011 - 13:49:29 - перейти к сообщению
Elio проверь пожалуйста, вот такой код вышел:
PHP:
скопировать код в буфер обмена
  1.  $urll = 'url.txt';
  2.     $file = file($urll, FILE_IGNORE_NEW_LINES);
  3.      
  4.     function get($url, $prox)
  5.     {
  6.         $ch = curl_init();
  7.         curl_setopt($ch, CURLOPT_URL, $url);
  8.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
  10.         curl_setopt($ch, CURLOPT_PROXY, "$prox");
  11.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  12.         curl_setopt($ch, CURLOPT_TIMEOUT, 15);
  13.         $ss=curl_exec($ch);
  14.         $info = curl_getinfo($ch);
  15.         $error = curl_error($ch).'('.curl_errno($ch).')'.' ['.$info['http_code'].']';
  16.         curl_close($ch);
  17.         if(file_exists('put.html'))unlink('put.html');
  18.         file_put_contents('put.html', $ss);
  19.         return $ss;
  20.     }
  21.      
  22.     function get_proxy(){
  23.             $proxylist = 'proxy.txt';
  24.             $prox = array();
  25.         if(is_file($proxylist)){
  26.                     $handle = fopen($proxylist, "r");
  27.             while (($data = fgetcsv($handle, 40)) !== FALSE) $prox[] = $data[0];
  28.                     fclose($handle);
  29.                     return $prox;
  30.         }
  31.             else return false;
  32.     }
  33.      
  34.     foreach( $file as $n ){
  35.         $content="";
  36.         while(strlen($content)<1){
  37.                     $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);
  38.                 if(preg_match('/snapshot of the page as it appeared on (.*)? GMT/',$content,$match) or preg_match('/по состоянию на (.*)? GMT/',$content,$match)){
  39.                             print("$n $match[1]\n");
  40.                             file_put_contents("cache_date.txt","$n $match[1]\n", FILE_APPEND);
  41.                     }
  42.                         elseif($content=='' OR strpos($content, '302 Moved') !== false) {
  43.                         array_shift ($prox);
  44.                         $content='';
  45.                         }
  46.             }
  47.     }

не понял куда лучше вставить if(count($prox)==0) $prox=get_proxy();
(Добавление)
сейчас еще нотисы пишет PHP Notice: Undefined variable: prox in /var/www/1.php on line 38
по этой строке $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);
(Добавление)
это if(count($prox)==0) $prox=get_proxy(); условие как я понимаю заново забирает список проксей из файла и формирует массив, т.е. если например исходный файл с проксями в реальном времени будет обновляться, то при окончании проксей он возьмет новую партию?
(Добавление)
вот такая ошибка еще вышла в процессе работы скрипта: PHP Warning: array_shift() expects parameter 1 to be array, null given in /var/www/1.php on line 44
это строка array_shift ($prox);
я так понимаю прокси закончились рабочие как раз? потому что я условие еще не ставил.
10. Elio - 16 Августа, 2011 - 14:26:10 - перейти к сообщению
смотри... мы убрали из скрипта прямое объявление $prox и запихнули его в функцию, тк планируем использовать его несколько раз.
Следовательно до foreach( $file as $n ) (35 стр.)
надо поставить $prox=get_proxy. для первого занесения массива в переменную.
проверку надо ставить с самого начала. while, те. сразу после объявления переменной $content
ошибки должны будут исчезнуть.

Цитата:
сейчас еще нотисы пишет PHP Notice: Undefined variable: prox in /var/www/1.php on line 38
по этой строке $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);

тк небыло изначально объявлен $prox.

Цитата:
если например исходный файл с проксями в реальном времени будет обновляться, то при окончании проксей он возьмет новую партию?

именно.

Цитата:
PHP Warning: array_shift() expects parameter 1 to be array, null given in /var/www/1.php on line 44
это строка array_shift ($prox);
я так понимаю прокси закончились рабочие как раз? потому что я условие еще не ставил.

скорее они не начинались тк. $prox был равен нулю. он не объявлялся.
11. xsh - 16 Августа, 2011 - 14:44:27 - перейти к сообщению
посмотри, теперь верно?
PHP:
скопировать код в буфер обмена
  1.     $urll = 'url.txt';
  2.     $file = file($urll, FILE_IGNORE_NEW_LINES);
  3.      
  4.     function get($url, $prox)
  5.     {
  6.         $ch = curl_init();
  7.         curl_setopt($ch, CURLOPT_URL, $url);
  8.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  9.         curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208');
  10.         curl_setopt($ch, CURLOPT_PROXY, "$prox");
  11.         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
  12.         curl_setopt($ch, CURLOPT_TIMEOUT, 15);
  13.         $ss=curl_exec($ch);
  14.         $info = curl_getinfo($ch);
  15.         $error = curl_error($ch).'('.curl_errno($ch).')'.' ['.$info['http_code'].']';
  16.         curl_close($ch);
  17.         if(file_exists('put.html'))unlink('put.html');
  18.         file_put_contents('put.html', $ss);
  19.         return $ss;
  20.     }
  21.      
  22.     function get_proxy(){
  23.             $proxylist = 'proxy2.txt';
  24.             $prox = array();
  25.         if(is_file($proxylist)){
  26.                     $handle = fopen($proxylist, "r");
  27.             while (($data = fgetcsv($handle, 40)) !== FALSE) $prox[] = $data[0];
  28.                     fclose($handle);
  29.                     return $prox;
  30.         }
  31.             else return false;
  32.     }
  33.      
  34.     $prox=get_proxy();
  35.  
  36.     foreach( $file as $n ){
  37.         $content="";
  38.         if(count($prox)==0) $prox=get_proxy();
  39.         while(strlen($content)<1){
  40.                     $content = get("http://webcache.googleusercontent.com/search?q=cache:$n", $prox[0]);
  41.                 if(preg_match('/snapshot of the page as it appeared on (.*)? GMT/',$content,$match) or preg_match('/по состоянию на (.*)? GMT/',$content,$match)){
  42.                             print("$n $match[1]\n");
  43.                             file_put_contents("cache_date.txt","$n $match[1]\n", FILE_APPEND);
  44.                     }
  45.                         elseif($content=='' OR strpos($content, '302 Moved') !== false) {
  46.                         array_shift ($prox);
  47.                         $content='';
  48.                         }
  49.             }
  50.     }

(Добавление)
вот еще содержимое файла put.html, походу это уже прокси, при получении такого ответа работа скрипта прерывается:

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2.     <head>
  3.     <title>Information passed to this script</title>
  4.     </head>
  5.     <body>
  6.     <h1>Information passed to this script</h1>[
  7.     1313498016]<h2>Environment</h2>
  8. <PRE>
  9. SCRIPT_NAME=/env
  10. SERVER_NAME=www.linkweava.net
  11. SERVER_ADMIN=info@linkweava.net
  12. HTTP_CONNECTION=Keep-Alive
  13. REQUEST_METHOD=GET
  14. HTTP_ACCEPT=*/*
  15. SCRIPT_FILENAME=/home/linkw/cgi/env
  16. SERVER_SOFTWARE=Apache/2.2
  17. QUERY_STRING=q=cache:yamazaki-maso.net&f=proxy:http://webcache.googleusercontent.com/search?q=cache:yamazaki-maso.net
  18. REMOTE_PORT=40518
  19. HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.1) Gecko/2008070208
  20. SERVER_SIGNATURE=
  21. SERVER_PORT=80
  22. REMOTE_ADDR=195.74.53.190
  23. SERVER_PROTOCOL=HTTP/1.1
  24. PATH=/usr/local/bin:/usr/bin:/bin
  25. REQUEST_URI=/env?q=cache:yamazaki-maso.net&f=proxy:http://webcache.googleusercontent.com/search?q=cache:yamazaki-maso.net
  26. GATEWAY_INTERFACE=CGI/1.1
  27. SERVER_ADDR=195.74.53.190
  28. DOCUMENT_ROOT=/home/linkw/html/
  29. HTTP_HOST=www.linkweava.net
  30. </PRE>
  31.  
  32. <H2>These Form-variables exists</H2>
  33. <PRE>
  34. q=cache:yamazaki-maso.net
  35. f=proxy:http://webcache.googleusercontent.com/search?q
  36. </PRE>
  37.  
  38. <hr><address>This page is automatically generated</address>
  39. </body></html>
12. Elio - 16 Августа, 2011 - 15:59:08 - перейти к сообщению
скорее всего... поэтому можно добавть
PHP:
скопировать код в буфер обмена
  1. elseif($content=='' OR strpos($content, '302 Moved') !== false OR strpos($content, 'info@linkweava.net') !== false)
если это фирма предоставляющая прокси. или другую фразу которая будет одинакова на таких "страницах ошибки".
13. xsh - 16 Августа, 2011 - 22:24:09 - перейти к сообщению
Elio пишет:
скорее всего... поэтому можно добавть
PHP:
скопировать код в буфер обмена
  1. elseif($content=='' OR strpos($content, '302 Moved') !== false OR strpos($content, 'info@linkweava.net') !== false)
если это фирма предоставляющая прокси. или другую фразу которая будет одинакова на таких "страницах ошибки".

спасибо за совет, я добавил еще пару условий туда, теперь вроде все работает довольно стабильно.
есть вопрос: я правильно вставил строки $prox=get_proxy(); и if(count($prox)==0) $prox=get_proxy(); ?
очень благодарю за помощь.
14. OrmaJever - 17 Августа, 2011 - 01:07:21 - перейти к сообщению
xsh пишет:
а именно как я понял не осуществляется переключение на новый прокси если не приходит ответ или приходит ответ с ошибкой.

я не читал всю тему, но мне кажется ответ очевиден, он в строке

в течении этих 5 секунд курл будет ждать ответа и дальше не пойдёт, можно ставить 1 или 2, хорошие прокси за это время отвечают.
(Добавление)
а ну кстате ещё multicurl тоже нужен для таких ситуаций
15. xsh - 17 Августа, 2011 - 09:07:29 - перейти к сообщению
OrmaJever я подумаю над multicurl, спасибо

 

Powered by ExBB FM 1.0 RC1