Вставить функцию транслита

Статус
В этой теме нельзя размещать новые ответы.

dig555

Постоялец
Регистрация
22 Июн 2007
Сообщения
365
Реакции
160
Есть парсер яндекса
PHP:
<?php

$keyword="жопа";

$url="http://wordstat.yandex.ru/advq?rpt=ppc&key=&shw=1&tm=&checkboxes=&text=".urlencode($keyword)."&regions_text=%C2%F1%E5&regions=";

$done=false;


while(!$done)
{
   sleep(rand(5,15));

   $ch=curl_init($url);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
   curl_setopt($ch, CURLOPT_TIMEOUT, 15);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_REFERER, "http://yandex.ru");
   $content=curl_exec($ch);
   curl_close($ch);

   $pos=strpos($content, "Что еще");
   if ($pos !== false)
   {
      $content=substr($content,0,$pos);
   }

   $r=preg_match_all('/tm=">([а-я[:print:][:cntrl:]]*?)<\/a><\/td>/i',$content,$matches);

   # print $r;


   $buf="";

   for($i=0; $i<$r; $i++)
   {
      # print $matches[1][$i]."\n";
      $buf.=$matches[1][$i]."\n";
   }

   $fp=fopen("words.txt","a+");
   fwrite($fp,$buf,strlen($buf));
   fflush($fp);
   fclose($fp);

   if (preg_match('/] <a href="(\/advq[[:cntrl:][:print:]]*?)">следующая/',$content,$pocket))
   {
      $url="http://wordstat.yandex.ru".str_replace("&amp;","&",$pocket[1]);

   }
   else
   $done=true;

}
?>
Напарсенное по запросу $keyword он сохраняет в файл words.txt.
Есть функция транслита, открученная от одного доргена.
PHP:
function translit($cyr_str) {
	$razd="-";
	$cyr_str=strtolower($cyr_str);
	$tr =  array("А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
	"Д"=>"d","Е"=>"e","Ж"=>"zh","З"=>"z","И"=>"i",
	"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
	"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
	"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
	"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"y","Ь"=>"",
	"Э"=>"e","Ю"=>"u","Я"=>"ya","а"=>"a","б"=>"b",
	"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
	"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
	"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
	"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
	"ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"",
	"ы"=>"y","ь"=>"","э"=>"e","ю"=>"u","я"=>"ya", " " => $razd);
	$text= strtr($cyr_str, $tr);
	$text=preg_replace("/[^a-z0-9_ -]*/", "", $text);
		return $text;
}
Помогите, пожалуйста, заставить парсер сохранять итог своей работы в файл с именем "транслит слова из $keyword".txt
 
вот это
PHP:
$fp=fopen("words.txt","a+");
Замени на
PHP:
$fp=fopen(translit(urldecode($keyword))."txt","w+");
 
спасибо. всё оказалось проще чем я думал. только заменил не на
PHP:
$fp=fopen(translit(urldecode($keyword))."txt","w+");
а на
PHP:
$fp=fopen(translit(urldecode($keyword)).".txt","w+");


Добавлено через 16 минут
а вот такой вопрос. недавно поднимал тему об очистке файла с кеями. Вот её итог.
Для просмотра ссылки Войди или Зарегистрируйся

помогите пожалуйста соединить этот парсер с чистильщиком кеев. Чтобы в файл сохранялись уже очищенные кеи.
парсер:
PHP:
<?php

$keyword="разум";

$url="http://wordstat.yandex.ru/advq?rpt=ppc&key=&shw=1&tm=&checkboxes=&text=".urlencode($keyword)."&regions_text=%C2%F1%E5&regions=";

$done=false;

function translit($cyr_str) {
    $razd="-";
    $cyr_str=strtolower($cyr_str);
    $tr =  array("А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
    "Д"=>"d","Е"=>"e","Ж"=>"zh","З"=>"z","И"=>"i",
    "Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
    "О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
    "У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
    "Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"y","Ь"=>"",
    "Э"=>"e","Ю"=>"u","Я"=>"ya","а"=>"a","б"=>"b",
    "в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"zh",
    "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
    "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
    "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
    "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"",
    "ы"=>"y","ь"=>"","э"=>"e","ю"=>"u","я"=>"ya", " " => $razd);
    $text= strtr($cyr_str, $tr);
    $text=preg_replace("/[^a-z0-9_ -]*/", "", $text);
        return $text;
}



while(!$done)
{
   sleep(rand(5,15));

   $ch=curl_init($url);
   curl_setopt($ch, CURLOPT_HEADER, 0);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
   curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_REFERER, "http://yandex.ru");
   $content=curl_exec($ch);
   curl_close($ch);

   $pos=strpos($content, "Что еще");
   if ($pos !== false)
   {
      $content=substr($content,0,$pos);
   }

   $r=preg_match_all('/tm=">([а-я[:print:][:cntrl:]]*?)<\/a><\/td>/i',$content,$matches);

   # print $r;


   $buf="";

   for($i=0; $i<$r; $i++)
   {
      # print $matches[1][$i]."\n";
      $buf.=$matches[1][$i]."\n";
   }

   $fp=fopen(translit(urldecode($keyword)).".txt","w+");
   fwrite($fp,$buf,strlen($buf));
   fflush($fp);
   fclose($fp);

   if (preg_match('/] <a href="(\/advq[[:cntrl:][:print:]]*?)">следующая/',$content,$pocket))
   {
      $url="http://wordstat.yandex.ru".str_replace("&amp;","&",$pocket[1]);

   }
   else
   $done=true;

}

?>

чистильщик:
PHP:
<?php 
   $filename="file.txt";     //файл со строками 
   $lines=file($filename); 
   $bad="badwords.txt";   //плохие слова 
   $badwords=file($bad); 

   function rulat($words) { 
      //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда 
      $rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х"); 
      //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно 
      $eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x"); 
      //Замена англ. букв русскими 
      return str_replace ($eng, $rus, $words); 
   } 

   foreach ($badwords as $k => $v) { 
   $badwords[$k] = trim($v); 
   } 

   $lines = rulat($lines); 
   $badwords = array_flip($badwords); 
   foreach ($lines as $v) { 
   $s = trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$v)); 
   $s = array_flip(explode(' ',$s)); 
   $is_ok = true; 
   foreach ($s as $k => $fix) { 
   if (isset($badwords[$k])) { 
   $is_ok = false; 
   break; 
   } 
   } 
   if ($is_ok) { 
   echo $v.'<br>'; 
   } 
   } 
?>
 
В общем не совсем понял, примерно накидал:
PHP:
function rulat($words) {  
      //Массив, содержащий русские буквы, сходные по начертанию с английскими, маленькую "к" можно не включать сюда  
      $rus = array( "А", "а", "В", "Е", "е", "К", "к", "М", "Н", "О", "о", "Р", "р", "С", "с", "Т", "Х", "х");   //Массив английских букв, сходных по начертанию с русскими, маленькую "k" тоже можно и не включать, конечно  
      $eng = array("A", "a", "B", "E", "e", "K", "k", "M", "H", "O", "o", "P", "p", "C", "c", "T", "X", "x");  //Замена англ. букв русскими  
      return str_replace ($eng, $rus, $words);  
}  

function clearfunc($badwords,$lines)
{
   foreach ($badwords as $k => $v) {  
   $badwords[$k] = trim($v);  
   }  

   $lines = rulat($lines);  
   $badwords = array_flip($badwords);  
   foreach ($lines as $v) {  
   $s = trim(preg_replace('/([^a-zA-Zа-яА-Я]{1,})/',' ',$v));  
   $s = array_flip(explode(' ',$s));  
   $is_ok = true;  
   foreach ($s as $k => $fix) {  
   if (isset($badwords[$k])) {  
   $is_ok = false;  
   break;  
   }  
   }  
   if ($is_ok) {  
   echo $v.'<br>';  
   }  
   }
	return $s
}

Смысл приблизительно такой, преобразовать этот код в функцию, затем когда тебе нужно очистить, вызываешь ее и передаешь два массива, список плохих слов $badwords и $lines это массив с key`ями так? Эти функции в конец парсера дописать
 
Спасибо большое, разобрался. Извиняюсь за наглость:ah: Предпоследний вопрос. В этом кусочке кода массив $buf записывается в файл.
PHP:
   $n="500";

   $buf="";
   for($i=0; $i<$r; $i++)
   {
      # print $matches[1][$i]."\n";
      $buf.=$matches[1][$i]."\n";
   }
   print_r($buf);
   $fp=fopen(translit(urldecode($keyword)).".txt","w+");
   fwrite($fp,$buf,strlen($buf));
   fflush($fp);
   fclose($fp);

Как по записи в файл количества кеев указанных в $n, закрыть файл. Следующие $n кеев записать во второй файл, с именем "такое-же-как-и-у-первого2". Очередные $n в файл "такое-же-как-и-у-первого3". И так пока кеи не кончаться.
 

Вложения

  • last.php.txt
    4,7 KB · Просмотры: 2
PHP:
function Write($your_array,$key_word,$n)
{
$var=0;$count=0;$size=count($your_array);

while($var < $size)
{

for($j=0;$j<$n;$j++)
{
	$new_array[$j]=$your_array[$count++];
}

$fp=fopen($key_word."".($t++).".txt","w+");
$str=implode("\n",$new_array);
fwrite($fp,$str,strlen($str));
fflush($fp);
fclose($fp);
$str="";

if(($size-$var) <= 9)
{
$n=$size-$var;

for($j=0;$j<$n;$j++)
{
	$new_array[$j]=$your_array[$count++];
}

$fp=fopen($key_word."".($t++).".txt","w+");	
$str=implode("\n",$new_array);
fwrite($fp,$str,strlen($str));
fflush($fp);
fclose($fp);
break;
}
	$var+=$n;
}
}

Вот функция, передаешь ей что записывать, название файла и по сколько записывать.
 
Выставил $n="100"; Почему-то у меня создаётся только 2 файла, даже при очень популярных запросах. И самое ужасное - в этих файлах с новой строки идёт каждая буква кея. Посмотрите, пожалуйста, в чём может быть проблема.
Вот что имеется на текущий момент:
 

Вложения

  • parser.txt
    4,7 KB · Просмотры: 6
146, 151 и 156 строка:
PHP:
$buf="";
..........
$buf.=$matches[1][$i]."\n";
..........
write($buf,$key_word,$n);

и определение функции вывода в файл (80 строка:(
PHP:
function write($your_array,$key_word,$n)

Обрати внимание, что функции надо передавать массив, а ты передаешь строку. Отсюда, после каждого символа в файле перенос строки. Замени 146 и 151 строки на соответственно:
PHP:
$buf=array();
..........
$buf[]=$matches[1][$i];

Далее.
Ты парсишь первые писят кеев, передаешь функции, она пишет в файл. Парсишь следующие, передаешь, она пишет снова в ТОТ ЖЕ файл. Функция между вызовами не помнит скока кеев она уже записала в какой файл. Поэтому надо сначала все кеи запихнуть в массив, а уж потом по выходу из цикла прохода по страницам отдать этот массив функции. То есть, сносишь нахрен 146 строку:
PHP:
//$buf=array();
А строку 156:
PHP:
write($buf,$key_word,$n);
выносишь за цикл:
PHP:
...........
   }
   else
   $done=true;

}
write($buf,$key_word,$n);

Еще нашел баг. 99 строка:
PHP:
if(($size-$var) <= 9)
наверно подразумевалось:
PHP:
if(($size-$var) < $n)

И еще tips'n'tricks:
задержку со 122 строки:
PHP:
sleep(rand(5,15));
лучше отнести в конец цикла, а точнее вовнутрь проверки в конце цикла, где определяется следующая страница и есть ли она вапще. Зачем же лишние 5-15 секунд ждать? ;)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху