Задать вопрос
doublench21
@doublench21

Есть ли какие ошибки критические?

Пишу парсер. Работает медленно, но это не беда.
Вопрос: Почему не выводит сообщение об успехе в случаи 1-го успеха ? Именно 1-го
Вопрос: Почему он парой просто останавливается ?
Если это вам как-либо видно по коду, укажите на ошибки пожалуйста.
P.S. Не пинайте строго, учусь. И использую старые функции.

<?php
require_once 'libs/simple_html_dom.php';

$server = ini_get("mysql.default_host");
@mysql_connect($server, "u360508016_root", "********") or die();
mysql_select_db("u360508016_base");
mysql_set_charset("utf8");

$url = "http://minecraft.gamepedia.com/Minecraft_Wiki";
$i = 1;
do {
    parser($url);
    if ($i >= 2) {
        $q = mysql_query("SELECT * FROM `indexing_link` WHERE `id`='" . $i . "'") or die();
        $url = mysql_result($q, 0, 1);
    }
    $i++;
    $q = mysql_query("SELECT * FROM `indexing_link` WHERE `id`='" . $i . "'") or die();
    echo "SUCCESS! " . $i . "\n";
} while (@mysql_num_rows($q));

function parser($url)
{
    $html = file_get_html($url);

    /**
     * Получаем все внутренние ссылки
     */
    /*if ($html->innertext != '' and count($html->find('a'))) {
        foreach ($html->find('a[href^=/] ') as $a) {
            echo "<a href='http://minecraft.gamepedia.com" . $a->href . "'>" . $a->plaintext . "</a></br>";
        }
    }*/

    /**
     * Получаем пару title-описание основной ссылки
     */
    $title = "sdasd";
    /* $title = $title->plaintext;*/
    $short = "zxcxzc";/*$html->find('#mw-content-text');
    $short = $short->find('p', 0);
    $short = $short->plaintext;*/

    /**
     * Пишем все внутренние ссылки в бд
     */
    $link_id = mysql_query("SELECT * FROM `indexing_link` WHERE `url`='" . $url . "'") or die();
    if (mysql_num_rows($link_id) == 0) {
        mysql_query("INSERT INTO `indexing_link` (`url`, `title`, `short`) VALUES ('" . $url . "', '" . $title . "', '" . $short . "')") or die();
        $link_id = mysql_query("SELECT * FROM `indexing_link` WHERE `url`='" . $url . "'") or die();
    }

    if ($html->innertext != '' and count($html->find('a'))) {
        foreach ($html->find('a[href^=/] ') as $a) {
            $q = mysql_query("SELECT * FROM `indexing_link` WHERE `url`='http://minecraft.gamepedia.com" . $a->href . "'") or die();
            if (mysql_num_rows($q) == 0) {
                mysql_query("INSERT INTO `indexing_link` (`url`) VALUES ('http://minecraft.gamepedia.com" . $a->href . "')") or die();
                $link_id1 = mysql_query("SELECT * FROM `indexing_link` WHERE `url`='http://minecraft.gamepedia.com" . $a->href . "'") or die();
            }
            /**
             * Пишем пару откуда-куда в бд
             */
            if (@mysql_result($link_id1, 0, 0)) {
                mysql_query("INSERT INTO `indexing_how_where` (`how`, `where`) VALUES  ('" . mysql_result($link_id,
                        0, 0) . "', '" . mysql_result($link_id1, 0, 0) . "')") or die();
            }
        }
    }

    /**
     * Получаем все текстовые блоки в html
     */
    $plaintext = $html->plaintext;
    /*echo $plaintext, "<br><br>";*/

    /**
     * Оставляем буквы латинского алфавита и пробелы
     */
    $pattern = '/[A-Za-z]|[ \t]/';
    preg_match_all($pattern, $plaintext, $matches);
    foreach ($matches[0] as $key => $value) {
        if ($value == " ") {
            $matches[0][$key] = "\t";
        }
    }

    $arr = array();
    $flag = 0;

    foreach ($matches[0] as $value) {

        if ($value != "\t") {
            $arr[] = $value;
            $flag = 0;
        } elseif ($flag == 0) {
            $arr[] = " ";
            $flag = 1;
        }
    }
    $str = implode($arr);
    $word = explode(" ", $str);

    /**
     * Пишем слова в бд и указываем ссылку
     */
    foreach ($word as $value) {
        $q = mysql_query("SELECT * FROM `indexing_word` WHERE `word`='" . $value . "'") or die();
        if (mysql_num_rows($q) == 0) {
            mysql_query("INSERT INTO `indexing_word` (`word`) VALUES ('" . $value . "')") or die();
            $word_id = mysql_query("SELECT * FROM `indexing_word` WHERE `word`='" . $value . "'") or die();
        }
        /**
         * Пишем пару слово-ссылка в бд
         */
        if (@mysql_result($word_id, 0, 0)) {
            mysql_query("INSERT INTO `indexing_link_word` (`word_id`, `link_id`) VALUES  ('" . mysql_result($word_id,
                    0, 0) . "', '" . mysql_result($link_id, 0, 0) . "')") or die();
        }
    }


    $html->clear();
    unset($html);
}
  • Вопрос задан
  • 2209 просмотров
Подписаться 2 Оценить 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Roquie
@Roquie
1. не стоит использовать mysql_* функции. Вообще. Ни-ко-гда!
совет: используйте PDO или mysqli_* функции.
2. нельзя делать запросы в цикле. Сформируйте массив и преобразуйте его в SQL строку. А потом выполните 1 запрос. Это прилично ускорит работу скрипта. Это касается ВСЕХ ваших запросов select, insert.
3. для того, чтобы получить html с сайта лучше использовать
https://github.com/php-curl-class/php-curl-class
4. для того, чтобы достать информацию со странички отлично подходит
webcache.googleusercontent.com/search?q=cache:Qvfn...

вы получите массив на выходе, который обработать не так уж сложно.

5. Вопрос: Почему он парой просто останавливается ?
потому, что выполняется более 30 секунд. Снять ограничение можно так:
set_time_limit(0); // а лучше ограничить значение, например 10 минутами.


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

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽