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);
}
  • Вопрос задан
  • 2208 просмотров
Решения вопроса 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 кода действительно много и написан он не лучшим образом, поэтому его читать не самая интересная задача.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы