Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Иванова_Магистерская работа.doc
Скачиваний:
20
Добавлен:
06.02.2016
Размер:
1.02 Mб
Скачать

Додаток а Лістинг програми

Головна сторінка (пошук, аналіз, аналітика запиту)

<?php header('Content-Type: text/html; charset=windows-1251'); ?>

<?php require_once 'lib/functions.php'; ?>

<html>

<head>

<title>Система інформаційного моніторингу</title>

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<link rel="stylesheet" type="text/css" href="style.css" />

</head>

<body>

<table align="center" width="35%">

<tr>

<td width="15%"><?php if(!$_REQUEST['act'] or $_REQUEST['act'] == 'work'){echo "<a href=\"index.php\"><b>Пошук</b></a>";}else echo "<a href=\"index.php\">Пошук</a>"; ?></td>

<td width="15%"><?php if($_REQUEST['act'] == 'analytics'){echo "<b><a href=\"analytics.php?act=show\">Аналітика</a></b>";}else echo "<a href=\"analytics.php?act=show\">Аналітика</a>"; ?></td>

<td></td>

</tr>

</table>

<table align="center" width="35%" class="main">

<form>

<input type="hidden" name="act" value="work" />

<tr><td width="85%">

<input type="text" name="keyword" style="font-family: Tahoma; font-size: 10px; width: 100%;" />

</td>

<td>

<input type="submit" name="ok" value="Знайти" />

</td>

</tr>

</form>

</table>

<?php

// Парсинг, запись в базу и выведение результатов поиска

if ($_REQUEST['act'] == 'work')

{

$keyword = $_REQUEST['keyword'];

$jobsua = GetUrl("http://www.jobs.ua/vacancy/search/?todo=search&keywords={$_REQUEST['keyword']}&city=0"); // отправка запроса на сайт

$handle=@fopen("jobsua.txt","a"); // запись страницы результатов в файл

fwrite($handle,$jobsua);

fclose($handle);

$jobukrnet = GetUrl("http://job.ukr.net/vacancy/?ShowSearchResults=1&CityId=0&RegionId=9&Keywords={$_REQUEST['keyword']}");

$handle=@fopen("jobsukr.net.txt","a");

fwrite($handle,$jobukrnet);

fclose($handle);

//$workua = GetUrl("http://www.work.ua/jobs/?search={$_REQUEST['keyword']}&ss=1&region=39");

$links = GetVacancyArray($jobsua); // парсинг ссылок на вакансии

mysql_connect('localhost','chatlanin_umnik','5447221'); // подключение к базе

mysql_select_db('chatlanin_spy');

foreach($links as $url) // цикл перебора каждого файла с вакансией

{

$url = "http://www.jobs.ua".$url;

$vac_html = GetUrl($url);

file_put_contents("cache/".md5($url).".htm", $vac_html);

$file_name = "cache/".md5($url).".htm";

$file = file_get_contents($file_name);

$jobsua_company = GetCompany($file); // ок

$jobsua_city = GetCity($file); // ок

$jobsua_salary = GetSalary($file); // ок

$jobsua_sex = GetSex($file); // ок

$jobsua_post = GetPost($file); // ок

$jobsua_age = GetAge($file); // ок

$jobsua_education = GetEducation($file); // ок

$jobsua_experience = GetExperience($file); // ок

// ________Запрос в базу на запись _________

$query = "INSERT into report(company, city, salary, sex, post, age, education, experience, search_engine, search_query) values('".mysql_escape_string($jobsua_company)."','"

.$jobsua_city."','"

.$jobsua_salary."','"

.$jobsua_sex."','"

.$jobsua_post."','"

.$jobsua_age."','"

.$jobsua_education."','"

.$jobsua_experience."','jobs.ua','"

.$keyword."');";

mysql_query($query);

$query_select = "SELECT * from report where search_query = '".$keyword."';";

$result = mysql_query($query_select);

// проверка на существование результатов поиска

$fail = count($links);

}

if(!$links)

{

echo "<center>Не знайдено вакансій!</center>";

} else {

?>

<!--Вывод таблички с результатом-->

<table align="center" width="75%" class="main">

<tr>

<td>

Пошуковий запит: <b><?php $row1 = mysql_fetch_array($result); echo $row1['search_query']; ?></b>

</td>

<tr>

</tr>

<td>

Результати з сайту: <b><?php echo $row1['search_engine']; ?></b>

</td>

<td colspan="6" align="right">

<a href="index.php?act=analytics&keyword=<?php echo $_REQUEST['keyword'];?>"><img src="graf.png" /> Аналітика запиту</a>

<a href="stats.php?act=download&keyword=<?php echo $_REQUEST['keyword'];?>" target=_blank><img src="Excel.gif" /> Завантажити звіт</a>

</td>

</tr>

</table>

<table id="box-table-a" align="center" width="75%">

<thead>

<tr>

<th scope="col">Компанія</th>

<th scope="col">Місто</th>

<th scope="col">Зарплата</th>

<th scope="col">Стать</th>

<th scope="col">Посада</th>

<th scope="col">Вік</th>

<th scope="col">Освіта</th>

<th scope="col">Досвід роботи</th>

</tr>

</thead>

<tbody>

<?php

while($row = mysql_fetch_array($result))

{

echo "<tr><td>{$row['company']}</td><td>{$row['city']}</td><td>{$row['salary']}</td><td>{$row['sex']}</td><td>{$row['post']}</td><td>{$row['age']}</td><td>{$row['education']}</td><td>{$row['experience']}</td></tr>";

}

?>

</tbody>

</table>

<?php

}

} // Блок создания и вывода аналитики по поисковому запросу

if($_REQUEST['act'] == 'analytics')

{

echo "<p class=\"title_in_analytics\">Аналітика запиту <b>".$_REQUEST['keyword']."</b></p>";

mysql_connect('localhost', 'chatlanin_umnik', '5447221');

mysql_select_db('chatlanin_spy');

// Блок запросов к базе

$query = "SELECT education, count(*) FROM report WHERE search_query = '" .$_REQUEST['keyword']. "'GROUP BY education ORDER BY education DESC"; // Круговая диаграмма по образованию

$query_vacancy = "SELECT date, search_query, count(*) FROM report WHERE search_query = '" .$_REQUEST['keyword']. "' GROUP BY date ORDER BY date ASC"; // Столбики по вакансиям

$query_sex = "SELECT sex, count(*) FROM report WHERE search_query = '" .$_REQUEST['keyword']. "' GROUP BY sex ORDER BY sex DESC"; // Круговая диаграмма по половому признаку

$query_age = "SELECT age, count(*) FROM report WHERE search_query = '" .$_REQUEST['keyword']. "' GROUP BY age ORDER BY age DESC";

$query_city_salary = "SELECT city, AVG(salary) as 'avg' FROM report WHERE search_query = '" .$_REQUEST['keyword']. "' GROUP BY city";

$result = mysql_query($query);

$result_vacancy = mysql_query($query_vacancy);

$result_sex = mysql_query($query_sex);

$result_age = mysql_query($query_age);

$result_city_salary = mysql_query($query_city_salary);

// Блок формирования структурных массивов с данными для построения графиков

$rs[] = array(iconv('cp1251', 'utf-8', 'Освіта'), iconv('cp1251', 'utf-8', 'Кількість'));

while($row = mysql_fetch_assoc($result))

{

$row['education'] = iconv('cp1251', 'utf-8', $row['education']);

$rs[] = array($row['education'], intval($row['count(*)']));

}

echo "<script type=\"text/javascript\">var x = ".json_encode($rs).";</script>";

$rs_vacancy[] = array(iconv('cp1251', 'utf-8', 'Вакансія'), iconv('cp1251', 'utf-8', $_REQUEST['keyword']));

while($row_vacancy = mysql_fetch_assoc($result_vacancy))

{

$row_vacancy['search_query'] = iconv('cp1251', 'utf-8', $row_vacancy['search_query']);

$rs_vacancy[] = array(date("d.m.y", strtotime($row_vacancy['date'])), intval($row_vacancy['count(*)']));

}

echo "<script type=\"text/javascript\">var y = ".json_encode($rs_vacancy).";</script>";

$rs_sex[] = array(iconv('cp1251', 'utf-8', 'Стать'), iconv('cp1251', 'utf-8', 'Кількість'));

while($row_sex = mysql_fetch_assoc($result_sex))

{

$row_sex['sex'] = iconv('cp1251', 'utf-8', $row_sex['sex']);

$rs_sex[] = array($row_sex['sex'], intval($row_sex['count(*)']));

}

echo "<script type=\"text/javascript\">var z = ".json_encode($rs_sex).";</script>";

$rs_age[] = array(iconv('cp1251', 'utf-8', 'Вік'), iconv('cp1251', 'utf-8', 'Кількість'));

while($row_age = mysql_fetch_assoc($result_age))

{

$row_age['age'] = iconv('cp1251', 'utf-8', $row_age['age']);

$rs_age[] = array($row_age['age'], intval($row_age['count(*)']));

}

echo "<script type=\"text/javascript\">var a = ".json_encode($rs_age).";</script>";

$rs_city_salary[] = array(iconv('cp1251', 'utf-8', 'Місто'), iconv('cp1251', 'utf-8', 'Зарплата'));

while($row_city_salary = mysql_fetch_assoc($result_city_salary))

{

$row_city_salary['city'] = iconv('cp1251', 'utf-8', $row_city_salary['city']);

$rs_city_salary[] = array($row_city_salary['city'], intval($row_city_salary['avg']));

}

echo "<script type=\"text/javascript\">var b = ".json_encode($rs_city_salary).";</script>";

?>

<!--Формированиие и вывод графиков-->

<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});

google.setOnLoadCallback(drawChart);

function drawChart() {

var data = google.visualization.arrayToDataTable(x);

var options = {

title: 'Освіта',

is3D: 'true'

};

var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

chart.draw(data, options);

}

</script>

<script type="text/javascript">

google.setOnLoadCallback(drawChart);

function drawChart() {

var data_post = google.visualization.arrayToDataTable(y);

var options_post = {

title: 'Результати пошукових запитів',

hAxis: {title: 'Вакансії', titleTextStyle: {fontName: 'Tahoma', fontSize: 11}},

fontName: 'Tahoma',

fontSize: 12

};

var chart_post = new google.visualization.ColumnChart(document.getElementById('chart_post'));

chart_post.draw(data_post, options_post);

}

</script>

<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});

google.setOnLoadCallback(drawChart);

function drawChart() {

var data_sex = google.visualization.arrayToDataTable(z);

var options_sex = {

title: 'Стать',

is3D: 'true'

};

var chart_sex = new google.visualization.PieChart(document.getElementById('chart_sex'));

chart_sex.draw(data_sex, options_sex);

}

</script>

<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});

google.setOnLoadCallback(drawChart);

function drawChart() {

var data = google.visualization.arrayToDataTable(a);

var options = {

title: 'Вік',

is3D: 'true'

};

var chart = new google.visualization.PieChart(document.getElementById('chart_age'));

chart.draw(data, options);

}

</script>

<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});

google.setOnLoadCallback(drawChart);

function drawChart() {

var data = google.visualization.arrayToDataTable(b);

var options = {

title: 'Зарплата по містам',

is3D: 'true'

};

var chart = new google.visualization.LineChart(document.getElementById('city_salary'));

chart.draw(data, options);

}

</script>

<table>

<tr>

<td><div id="chart_div"></div></td>

<td><div id="chart_sex"></div><td>

<td><div id="chart_age"></div><td>

</tr>

<tr>

<td><div id="chart_post" style="width: auto; height: 500px;"></div></td>

<td><div id="city_salary" style="width: auto; height: 500px;"></div></td>

</tr>

</table>

<?php

}

?>

</body>

</html>

Генерація звіту

<?php

// Формирование Excel файла со статистикой

$link = mysql_connect('localhost', 'chatlanin_umnik', '5447221');

//mysql_query("SET NAMES 'cp1251'");

//mysql_query("SET CHARACTER SET 'cp1251'");

mysql_select_db('chatlanin_spy');

$select = "SELECT company as 'Фірма',

city as 'Місто',

salary as 'Зарплата',

sex as 'Стать',

post as 'Посада',

age as 'Вік',

education as 'Освіта',

experience as 'Досвід роботи',

search_query as 'Пошукове слово',

date as 'Дата',

search_engine as 'Пошукова система' FROM report WHERE search_query = '".$_REQUEST['keyword']."'";

$export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );

$fields = mysql_num_fields ( $export );

for ( $i = 0; $i < $fields; $i++ )

{

$header .= mysql_field_name( $export , $i ) . "\t";

}

while( $row = mysql_fetch_row( $export ) )

{

$line = '';

foreach( $row as $value )

{ //$value = iconv('utf-8', 'windows-1251', $value);

if ( ( !isset( $value ) ) || ( $value == "" ) )

{

$value = "\t";

}

else

{

$value = str_replace( '"' , '""' , $value );

$value = '"' . $value . '"' . "\t";

}

$line .= $value;

}

$data .= trim( $line ) . "\n";

}

$data = str_replace( "\r" , "" , $data );

if ( $data == "" )

{

$data = "\n(0) Records Found!\n";

}

header("Content-type: application/octet-stream;");

header("Content-Disposition: attachment; filename=report.xls");

header("Pragma: no-cache");

header("Expires: 0");

print "$header\n$data";

Сторінка загальної аналітики

<?php header('Content-Type: text/html; charset=windows-1251'); ?>

<html>

<head>

<title>Система інформаційного моніторингу</title>

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

<link rel="stylesheet" type="text/css" href="style.css" />

</head>

<body>

<table align="center" width="35%">

<tr>

<td width="15%"><?php if(!$_REQUEST['act'] or $_REQUEST['act'] == 'work'){echo "<a href=\"index.php\"><b>Пошук</b></a>";}else echo "<a href=\"index.php\">Пошук</a>"; ?></td>

<td width="15%"><?php if($_REQUEST['act'] == 'show'){echo "<b><a href=\"index.php?act=analytics\">Аналітика</a></b>";}else echo "<a href=\"index.php?act=analytics\">Аналітика</a>"; ?></td>

<td></td>

</tr>

</table>

<table align="center" width="35%">

<form>

<input type="hidden" name="act" value="work" />

<tr><td width="85%">

<input type="text" name="keyword" style="font-family: Tahoma; font-size: 10px; width: 100%;" />

</td>

<td>

<input type="submit" name="ok" value="Знайти" />

</td>

</tr>

</form>

</table>

<?php

// Блок формирования общей аналитики

if($_REQUEST['act'] == 'show')

{

echo "<center><h3>Загальна аналітика системи</h3></center>";

mysql_connect('localhost', 'chatlanin_umnik', '5447221');

mysql_select_db('chatlanin_spy');

// Блок запросов к базе

$query = "SELECT education, count(*) FROM report GROUP BY education ORDER BY education DESC"; // Круговая диаграмма по образованию

$query_vacancy = "SELECT search_query, count(*) FROM report GROUP BY search_query ORDER BY search_query DESC"; // Столбики по вакансиям

$result = mysql_query($query);

$result_vacancy = mysql_query($query_vacancy);

// Блок формирования структурных массивов с данными для построения графиков

$rs[] = array(iconv('cp1251', 'utf-8', 'Освіта'), iconv('cp1251', 'utf-8', 'Кількість'));

while($row = mysql_fetch_assoc($result))

{

$row['education'] = iconv('cp1251', 'utf-8', $row['education']);

$rs[] = array($row['education'], intval($row['count(*)']));

}

echo "<script type=\"text/javascript\">var x = ".json_encode($rs).";</script>";

$rs_vacancy[] = array(iconv('cp1251', 'utf-8', 'Вакансія'), iconv('cp1251', 'utf-8', 'Кількість'));

while($row_vacancy = mysql_fetch_assoc($result_vacancy))

{

$row_vacancy['search_query'] = iconv('cp1251', 'utf-8', $row_vacancy['search_query']);

$rs_vacancy[] = array($row_vacancy['search_query'], intval($row_vacancy['count(*)']));

}

echo "<script type=\"text/javascript\">var y = ".json_encode($rs_vacancy).";</script>";

?>

<!--Формированиие и вывод графиков-->

<script type="text/javascript">

google.load("visualization", "1", {packages:["corechart"]});

google.setOnLoadCallback(drawChart);

function drawChart() {

var data = google.visualization.arrayToDataTable(x);

var options = {

title: 'Освіта',

is3D: 'true'

};

var chart = new google.visualization.PieChart(document.getElementById('chart_div'));

chart.draw(data, options);

}

</script>

<script type="text/javascript">

google.setOnLoadCallback(drawChart);

function drawChart() {

var data_post = google.visualization.arrayToDataTable(y);

var options_post = {

title: 'Пошукові запити',

hAxis: {title: 'Вакансії', titleTextStyle: {fontName: 'Tahoma', fontSize: 11}},

fontName: 'Tahoma',

fontSize: 12

};

var chart_post = new google.visualization.BarChart(document.getElementById('chart_post'));

chart_post.draw(data_post, options_post);

}

</script>

<table width="70%">

<tr>

<td><div id="chart_div" style="width: 500px; height: 300px;"></div></td>

<td></td>

</tr>

<tr>

<td colspan="2"><center><div id="chart_post" style="width: auto; height: 500px;"></div></center></td>

</tr>

</table>

<?php

}

?>

</body>

</html>

Бібліотека регулярних виразів

<?php

function GetUrl($url) // отправка запроса на поисковый сайт и сохранение страницы результатов

{

$curl = curl_init($url);

curl_setopt($curl, CURLOPT_HEADER, 0); // потому что HTTP-header в ответе тебе не нужен

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // потому что надо результат в переменную, а не на вывод

curl_setopt($curl, CURLOPT_TIMEOUT, 10);

$result_page = curl_exec($curl);

curl_close($curl);

return $result_page;

}

function get_matches($text, $regex, $index = null) // поиск совпадений

{

$matches = array();

$cnt = preg_match_all($regex, $text, $matches);

if(is_null($index))

return $matches;

else

return $matches[$index];

}

function GetVacancyArray($html) // поиск ссылок на вакансии

{

return get_matches($html, '/<a\s*?href="([0-9a-z\/]*?)"\s*?class="def_bl_vac".*?>([^<>]*?)<\/a>/ims', 1);

}

function GetCompany($text) // поиск компании-работодателя

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = strip_tags($matches[1]);

return $matches[1];

}

function GetCity($text) // поиск города

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>.*?<\/li>.*?<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = strip_tags($matches[1]);

return $matches[1];

}

function GetSalary($text) // поиск зарплаты, приведение зарплат и валют к общему формату

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>.*?<\/li>.*?<li>.*?<\/li>.*?<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = strip_tags($matches[1]);

$pattern_currency = '/(\D*?)(\d*?)(\D+)/';

$result = preg_match($pattern_currency, $matches[1],$matches_currency);

$matches_currency[3] = trim($matches_currency[3]);

switch($matches_currency[3]){

case 'грн': return $matches_currency[2] * 1;

case '$': return $matches_currency[2] * 8;

case '€': return $matches_currency[2] * 11;

default: return $matches_currency[3];

}

return $matches_currency[1].'; '.$matches_currency[2].';lolol '.$matches_currency[3];

}

function GetExperience($text) // поиск опыта работы

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$res = $matches[1];

//$res = preg_replace('/[^0-9,;\+]/i', '', $res);

$res = trim($res);

return $res;

}

function GetSex($text) // поиск пола

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

//$pattern = '/viewcontcenter.*?<li>.*?</li><li>.*?</li><li><a.*?</a></li><li>(.*?)</li><li>опыт работы 1-2 года</li><li>полная занятость</li><li>2900 грн</li><li>Аналітик продаж,економіст</li></ul><div class="viewcontright">/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = strip_tags($matches[1]);

$matches[1] = trim($matches[1]);

return $matches[1];

}

function GetAge($text) // поиск возраста

{

$matches = array();

//$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>\D*?(\d+)?\D*?(\d+)?\D+<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

return $matches[1];

}

function GetEducation($text) // поиск образования

{

$matches = array();

//$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = trim($matches[1]);

return $matches[1];

}

function GetPost($text) // поиск должности

{

$matches = array();

$pattern = '/viewcontcenter.*?<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>.*?<\/li>\s*<li>(.*?)<\/li>/ims';

$result = preg_match($pattern, $text, $matches);

$matches[1] = strip_tags($matches[1]);

return $matches[1];

}

function ScreenSQL($sql) // экранирование кавычек (защита от атак)

{

return str_replace("'", "''", $sql);

}

?>

108