Извлечение описания и ключевых слов из Википедии в php и mysql

У меня есть веб-страница со всеми ссылками на избранные статьи из Википедии, и я извлекаю из них заголовок, описание и ключевые слова. Но у меня есть проблема, когда веб-краулер начинает извлекать содержимое статей, описание поля в моей базе данных остается пустым, а ключевые слова показывают мне «Массив Массив Массив».

как я могу извлечь описание и ключевые слова из статей Википедии?

Поисковый робот запрограммирован на php и mysql, и это фактический код:

<?php
error_reporting(E_ALL | E_STRICT);
set_time_limit(0);
$server_link = mysql_connect("localhost", "root", "");
if (!$server_link) {
    die("Fall&oacute; la Conexi&oacute;n " . mysql_error());
}
$db_selected = mysql_select_db("test", $server_link);
if (!$db_selected) {
    die("No se pudo seleccionar la Base de Datos " . mysql_error());
}
@mysql_query("SET NAMES 'utf8'");
function storeLink($titulo, $descripcion, $url, $keywords) {
    $query = "INSERT INTO webs (webTitulo, webDescripcion, weburl, webkeywords) VALUES ('$titulo', '$descripcion', '$url', '$keywords')";
    mysql_query($query) or die('Error, falló la inserción de datos');
}
function extraer($url, $prof, $patron) {
    $userAgent = 'Interredu';
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(("Accept-Language: es-es,en")));
    curl_setopt($ch, CURLOPT_FAILONERROR, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $html = curl_exec($ch);
    // La salvo de Entrada, para que no se me corra en la entrada a la base de datos
    saveUrl($url, $prof, $patron, $html);
    // Mando error pero no corto porque si una url esta mal formada termina con la
    // ejecucion
    if (!$html) {
        echo "<br />cURL error number:" . curl_errno($ch);
        echo "<br />cURL error:" . curl_error($ch);
    }
    $dom = new DOMDocument();
    $dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    $hrefs = $xpath->evaluate("/html/body//a");
    for ($i = 0;$i < $hrefs->length;++$i) {
        $href = $hrefs->item($i);
        $url2 = $href->getAttribute('href');
        $var = strstr($url2, '#', true);
        if ($var !== false) {
            $url2 = $var;
        }
        // Me aseguro que este bajo nuestro sitio.
        if (strpos($url2, $patron) === false) {
            continue;
        }
        // Me aseguro que ya no este ingresada, para no iterar sobre ella misam
        if ($url2 != $url && $url2 != '') {
            // Se podria agregar un campo timestap para luego reescanera paginas
            // que tuvieran una fecha menor.
            // URL Unica para que falle y como es mysql poner INSERT INTO ...... ON DUPLICATE KEY ... en la funcion de guardado
            $busqueda = mysql_query("SELECT weburl FROM webs WHERE weburl='$url2'");
            $cantidad = mysql_num_rows($busqueda);
            if (150 >= $prof && 0 == $cantidad) {
                extraer($url2, ++$prof, $patron);
            }
        }
    }
}
function saveUrl($url, $prof, $patron, $html) {
    $retorno = false;
    $pos = strpos($url, $patron);
    if ($prof >= 1) {
        preg_match_all("(<title>(.*)<\/title>)siU", $html, $title);
        $metas = get_meta_tags($url, 1);
        $title = $title[1][0];
        $titulo = html_entity_decode($title, ENT_QUOTES, 'UTF-8');
        $descripcion = isset($metas["description"])?$metas["description"] : '';
        $keywords = isset($metas["keywords"])?$metas["keywords"] : '';
    if (empty($descripcion)){
obtenerMetaDescription($html);
    }
    if (empty($keywords)){
    preg_match_all("#<\s*h1[^>]*>[^<]+</h1>#is", $html, $encabezado);
    preg_match_all("#<\s*b[^>]*>[^<]+</b>#is", $html, $negrita);
    preg_match_all("#<\s*i[^>]*>[^<]+</i>#is", $html, $italica);
    if(!empty($encabezado)){
    $h1 = $encabezado[0];
    }
    if(!empty($negrita)){
    $bold = $negrita[0];
    }
    if(!empty($italica)){
    $italic = $italica[0];
    }
    $keys .= $bold;
    $keys .= " ";
    $keys .= $h1;
    $keys .= " ";
    $keys .= $italic;
    $keywords = substr(strip_tags($keys), 0, 200);
}
        storeLink($titulo, $descripcion, $url, $keywords, $prof);
        $retorno = true;
    }
    return $retorno;
}
function obtenerMetaDescription($html) {
    preg_match_all('#<p>(.*)</p>#Us', $html, $parraf);
    if(!empty($parraf)){
    $descripcion = substr(strip_tags($parraf[1][0]), 0, 200);
    }
    }
$url = "http://www.mywebsite.with.articlesofwikipedia";
$patron = "http://es.wikipedia.org/wiki/";
$prof = 150;
libxml_use_internal_errors(true);
extraer($url, 1, $patron);
$errores = libxml_get_errors();
libxml_clear_errors();
mysql_close();
?>

person Malagan Martin    schedule 26.11.2012    source источник
comment
если вы получаете Array как буквальный текст в своей базе данных, то вы используете массив где-то вместо строки. например $x = array('hello'); echo $x выведет Array, а не hello.   -  person Marc B    schedule 26.11.2012
comment
Вы можете заглянуть в dbpedia   -  person lynks    schedule 26.11.2012
comment
Спасибо за ответ. Но я не вижу никакого массива. Как можно восстановить описание?? С уважением и спасибо за ответ   -  person Malagan Martin    schedule 27.11.2012


Ответы (1)


Откажитесь от причудливой очистки экрана и регулярных выражений, используйте Викиданные для структурированных данных из Википедии: https://www.wikidata.org/wiki/Wikidata:Data_access

MediaWiki API имеет несколько библиотек PHP: https://www.mediawiki.org/wiki/API:Client_code#PHP

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

person Nemo    schedule 25.07.2015