Парсер сайта на PHP

$response[‘code’] = $ci[‘http_code’];
$response[‘errors’] = $errors;

curl_close($ch);

return $response;
}

/**
* Получить случайный заголовок браузера
*
* @return mixed
*/
function getRandomUserAgent()
{
$userAgents = [
‘Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36’,
‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1’,
‘Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A’,
‘Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)’,
‘Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)’,
‘Mozilla/5.0 (Windows; U; Win 9x 4.90; SG; rv:1.9.2.4) Gecko/20101104 Netscape/9.1.0285’,
‘Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1’,
‘Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko’,
];

$random = mt_rand(0, count($userAgents)-1);

return $userAgents[$random];
}

/**
* Номер последней страницы
*
* @param DOMXpath $xPath
* @return mixed
*/
function parseNumberLastPage(DOMXpath $xPath){
$q = $xPath->query(«//div[@id=’dle-content’]/div/table/*/td[@class=’block_4′]/a[last()]»);
return $q->item(0)->textContent;
}

/**
* Получить режиссера
*
* @param DOMXpath $xPath
* @return array
*/
function parseGetProducer(DOMXpath $xPath){
$q00 = $xPath->query(«//div[@id=’dle-content’]/div[@class=’shortstory’]/div[@class=’shortstoryContent’]/table/tr/td/p[5]/strong»);
foreach ($q00 as $item) {
$q11[] = ($item->textContent == ‘Режиссёр: ‘);
}

$q1 = $xPath->query(«//div[@id=’dle-content’]/div[@class=’shortstory’]/div[@class=’shortstoryContent’]/table/tr/td/p[5]»);
foreach ($q1 as $item) {
$q2[] = mb_substr($item->textContent, 10);
}

foreach ($q11 as $k => $item) {
$result[] = empty($item) ? » : $q2[$k];
}
return $result;
}

/**
* Получить контент
*
* @param DOMXpath $xPath
* @param string $query Запрос xPath
* @param string $compare Строка для поиска
* @param int $lenCut Длина обрезаемого слова
* @return array
*/
function parseContent(DOMXpath $xPath, $query = ‘//’, $compare = », $lenCut = 0)
{
$result = [];
$i = 0;

$q = $xPath->query($query);
if (empty($compare)){
foreach ($q as $k => $item) {
$result[] = mb_substr($item->textContent, $lenCut);
}

} else {
foreach ($q as $k => $item) {
if (strpos($item->textContent, $compare) !== false){
$result[$i++] = mb_substr(str_replace(«\n», ‘ ‘, $item->textContent), $lenCut);
}
}
}
return $result;
}

/**
* Отображение данных для отладки
*
* @param $data
*/
function varDump($data)
{
echo ‘<pre>’;
print_r($data);
echo ‘</pre>’;
}

Данный файл располагаем в корне сайта. Здесь же создаем директорию с именем data. В этот каталог будут сохраняться все данные, собранные парсером.

Для информативности я добавил замер скорости работы скрипта и его отображение по окончанию работы.

Итак, при помощи встроенной в PHP функции libxml_use_internal_errors(true) мы включаем обработку ошибок пользователем.

Для удобства работы объявлено несколько важных переменных:

  • $url — содержит ссылку для парсера, т.е. откуда начинаем собирать данные. В нашем случае — это ссылка на страницу http://animevost.org/zhanr/.
  • $refererUrl — ссылка для содержимого заголовка «Referer», который будет использован в HTTP-запросе.
  • $nPagePause — количество страниц, через которое будет сделана пауза. Имитация человека, якобы он вручную переходит по ссылкам.

Функция function curlGetContents($pageUrl, $baseUrl, $pauseTime = 4, $retry = true) читает содержимое удаленной страницы в строку. В ней нет ничего особенного. Используется встроенная функция curl_setopt(). Более детально можно прочитать здесь.

Кстати, если происходит ошибка, то предпринимается еще одна попытка получения данных с сайта. Если же все-таки не получается получить данные по определенной ссылке, то создается файл с ошибками errors.txt.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: