Парсер цитат bash.im ( bash.org.ru)

Парсер цитат bash.im ( bash.org.ru)

Добрый день, сегодня я хотел бы рассказать как парсить сайты. Самым простым сайтом для этого дела является Баш орг.  Итак начнем ..
Для начала создаем базу данных для хранения всех цитат.
CREATE TABLE IF NOT EXISTS `bash` ( 
	`id` int(11) NOT NULL AUTO_INCREMENT, 
	`quote_id` int(11) NOT NULL,  
	`quote_text` mediumtext NOT NULL,  
	PRIMARY KEY (`id`) 
	) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
  В базе данных создаем поля: id с авто инкрементом и не нулевое и Primary key quote_id - id цитаты на сайте(баше) quote_text - текст самой цитаты На этом с базой данных все. Далее переходим непосредсвенно к самому скрипту
define ("HOST", "localhost");
define ("DATABASE", "ваша база данных");
define ("MYSQL_USER", "ваш юзер");
define ("MYSQL_PASS", "ваш пароль");
mysql_connect(HOST, MYSQL_USER, MYSQL_PASS);mysql_query("set names utf8");mysql_select_db(DATABASE);
  Создаем константы с хоста, имени базы данных, логина и пароля от нее. И подключаемся к базе.
$content=file_get_contents('http://bash.im/');
preg_match('|max="(.*?)"|is',$content,$num_pages);
  В этих строчках мы через file_get_contents открываем сайт баш. Далее через регулярное выражение находим количество страниц на сайте и сохраняем в переменную.
for ($i=1; $i <= $num_pages[1]; $i++){$i2=false;
  В этой строчке мы начинам цикл в котором обрабатываем каждую страницу сайта начиная с самой первой(последнеей)
$content=file_get_contents('http://bash.im/index/'.$i);
	$quotes=explode('<span class="date">',$content);
	foreach($quotes as $quote){
		if($i2==false){$i2=true;continue;}
		//Номер цитаты
		preg_match('|class="id">#(.*?)</a>|is',$quote,$quote_id);
		//Текст цитаты
		preg_match('|<div class="text">(.*?)</div>|is',$quote,$quote_text);
  В этом скрипте открывается каждая страница сайта, в ней через explode разделяем все цитаты. Разделение идет через поиск на странице <span class="date">. Полученный массив мы прогоняем через цикл в через регулярные выражения находим id цитаты, и текст цитаты. Осталось все это сохранить в базу данных
$quote_text=strip_tags(addslashes(htmlspecialchars(trim(iconv("windows-1251","UTF-8",$quote_text[1])))));
		//Вписываем в базу
		if($quote_text!=NULL){mysql_query("INSERT INTO `bash`(`id`,`quote_id`,`quote_text`) VALUES (NULL,'{$quote_id[1]}','{$quote_text}')");}
			}
	//От перенагрузки
	sleep(2);
	}
  Перед этим обрабатываем все теги иконки кодировку и прочие, и сохраняем в базу данных. Ну и после каждой страницы даем скрипту отдохнуть 2 секунды. Собрав этот скрипт вы наверняка увидите что скрипт отрабатывает не полностью сайт.  Дело в том что время работы скрипта сервером ограниченно, и дабы спарсить сайт полностью надо переписать немного скрипт чтобы он начинал с того места где он остановился. Как это сделать сейчас покажу. В последней строчке где мы сохраняем в базу данных надо сделать следующие изменения. Удаляем ее и вставляем следующий код
$st=mysql_result(mysql_query("SELECT COUNT(`id`) FROM `bash` WHERE `quote_id`='{$quote_id[1]}' LIMIT 1"),0);
if($quote_text!=NULL AND $st==0){mysql_query("INSERT INTO `bash`(`id`,`quote_id`,`quote_text`) VALUES (NULL,'{$quote_id[1]}','{$quote_text}')");}
  Получается что вначале идет проверка на существование цитаты( а точнее id) в базе а потом только сохранение если ее нету. НУ и наконец, цитаты на сайте появляются ежедневно и чтобы заново каждый раз сайт не проверять сделаем только последние 5 страниц(вы можете сделать и больше) Для этого меняем цикл 
for ($i=1; $i <= $num_pages[1]; $i++){
  На этот
for ($i=$num_pages[1]-5; $i <= $num_pages[1]; $i++){
 

Возврат к списку