Главная


Парсер — это просто. Написание парсера с помощью сокетов.

parser     Написание этой статьи, меня сподвиг очередной таск, с написанием парсера. На сервере не был установлен CURL.Которым я пользовался благополучно до этого.По сути, что такое CURL?Это обертка над сокетами, то есть библиотека написанная для работы с сокетами.

     И так, рассмотрим написание очень простого парсера, без премудростей, который будет выполнять свою прямую обязанность. За частую парсеры(граберы) используются для получение какой либо информации с сайта или получение контента с интернет магазинов. В этой статье представлен последний вариант.

     Обычно, контент интернет магазина состоит с таких моментов: категории товаров, список товаров и характеристика товара. По этому будем парсить по этапам, в той последовательности, в которой написано выше и результаты добавлять в базу данных.


public function GetDataBySocket($server, $tag, $urn)

{

$rdata = '';

$req = 'tag='.@urlencode($tag).'&server='.@urlencode($server);

$header = "POST ".$urn." HTTP/1.0\r\n";

$header .= "Content-Type: application/x-www-form-urlencoded\r\n";

$header .= "User-Agent: Mozilla/5.0 \r\n";

$header .= "Host: ".$server."\r\n";

$header .= "Content-Length: ".strlen($req)."\r\n\r\n";


$fp = @fsockopen($server, 80);

if($fp) {

@fputs($fp, $header.$req);

while(!feof($fp)) {

$rdata .= fgets($fp, 1024);

}

@fclose($fp);

return $rdata;

}

return false;

}

     Представленная функция посылает POST запрос на указанный сервер с параметрами $tag, а также получение контента $rdata. В начале функции определена шапка запроса, которая будет передана сокету. Далее выполняется открытие сокета и, собственно, получение контента с страницы.

     Теперь, когда можем получить контент с страницы, выберем все категории товаров:

public function GetCategories($data)


{


$pattern = '/<div[^>]+class="maincategories"><ul>([\s\S]*?)<\/ul><\/div>/';


preg_match_all($pattern, $data, $category_table);


$pattern = '/<li><img[^>]+src="\/img\/empty.gif"[^>]+><a[^>]+href="([^"]+)">([\s\S]*?)<\/a><\/li>/';


preg_match_all($pattern, $category_table[1][0], $categories);



$category_info = array();


foreach($categories as $key=>$val){


foreach($val as $key2=>$val2){


if($key == 1){


$category_info[$key2]['link'] = $val2;


}elseif($key == 2){


$category_info[$key2]['name'] = $val2;


}


}


}


return $category_info;


}

     В функцию GetCategories передаются данные, полученные в предыдущем примере. С помощью шаблонов с регулярными выражениями, отсекаем все ненужное и получаем список категорий, который вставляем в базу данных:

public function InsertCategoryToDB($data)


{


$sql = 'INSERT INTO categories(category_name, category_link) VALUES';


foreach($data as $val){


$sql .=' ("'.$val['name'].'", "'.$val['link'].'"),';


}


$sql = substr($sql, 0, strlen($sql)-1).';';


if(mysql_query($sql)){


return true;


}


return false;


}

     Когда категории и линки на них добавлены в БД, можем приступать, к парсингу продуктов. Для этого выбираем линки с БД и в цикле переходим по каждой линке, получая список товаров.

$categories = $prsr->GetCategoryFromDB();


foreach($categories as $key=>$val){


//Get data for page counter


$urn = $val;


$CategoryDetailData = $prsr->GetDataBySocket($server, $tag, $urn);


//Get data for product info


$urn = ($i == 1)? $val:$val.'?p='.$i;


$ProductData = $prsr->GetDataBySocket($server, $tag, $urn);


$pattern = '/<tr[\s\S]*?><td[^>]+class="t4d"+><div[^>]+class="mgk"+><a[^>]+href="([^"]+)"[^>]+><img[^>]+src="([^"]+)"[^>]+><\/a><\/div><\/td><td[^>]+><h3><a[^>]+href="([^"]+)"[^>]+>(.+)<\/a><\/h3><p>[\s\S]*?<\/p><div[^>]+><div[^>]+>[\s\S]*?<\/div><div[^>]+>[\s\S]*?<\/div><\/div><\/td><td[^>]+><div[^>]+><span[^>]+>[\s\S]*?<\/span><span[^>]+>(.+)<\/span>/';


preg_match_all($pattern, $ProductData, $data_info);


$oPD = $prsr->OrderProductsData($data_info);


//Insert product info to DB


if($prsr->InsertProductToDB($oPD, $key)){


}


}


}

     На этом этапе получаем данные с страницы $prsr->GetDataBySocket($server, $tag, $urn). С помощью шаблона, получаем необходимые данные, название продукта, линк на продукт, цену и тд. И в конце выполняется в ставка данных в таблицу. Парсинг атрибутов выполняется аналогично, выбирая линки с таблицы категорий.

     P.S.: Если, Вам, интересна тема парсинга и сокеты в целом, пишите в комментах. Позже будут представлены более подробные примеры использования сокетов.


Комментарии