Вопрос по php, image, search – php Извлечь Лучшая догадка для этого изображения в результате поиска картинок Google?

4

У меня есть требование, при котором я должен выполнить обратный поиск изображения в Google и извлечь имя, напечатанное на & quot; Лучший вариант для этого изображения: & quot; заглавие. Нет, я сделал некоторые изменения в существующем коде curl в сети и зашел так далеко:

<?php

function fetch_google($terms="sample search",$numpages=1,$user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0')  
{
    $searched="";
    for($i=0;$i<=$numpages;$i++)
    {
        $ch = curl_init();
        $url="http://www.google.com/searchbyimage?hl=en&image_url=".urlencode($terms);
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_REFERER, 'http://www.google.com/');
        curl_setopt ($ch,CURLOPT_CONNECTTIMEOUT,120);
        curl_setopt ($ch,CURLOPT_TIMEOUT,120);
        curl_setopt ($ch,CURLOPT_MAXREDIRS,10);
        curl_setopt ($ch,CURLOPT_COOKIEFILE,"cookie.txt");
        curl_setopt ($ch,CURLOPT_COOKIEJAR,"cookie.txt");
        $searched=$searched.curl_exec ($ch);
        curl_close ($ch);
    }

    $xml = new DOMDocument();
    @$xml->loadHTML($searched);
    foreach($xml->getElementsByTagName('div') as $div)
    {
        if(strpos($div->nodeValue,"Best guess for this image:"))
            return $div->nodeValue;
    } 
}

$content = fetch_google("http://media.il.edmunds-media.com/aston-martin/as/03/de/aston-martin_front_03-de-as_1_276.jpg",1);
echo $content."<br>";

?>

но это дает мне много текста, и я не могу получить точный div для него. поскольку "а"; не имеет атрибута класса, я должен был сделать это таким образом.

Пожалуйста помоги!

Можете ли вы взглянуть наthis question с аналогичным контекстом, чтобы ваш, и пролить свет на то, как решить проблему, пожалуйста? 7usam

Ваш Ответ

2   ответа
3

Вы можете использовать вместо preg_match.

Когда вы получаете HTML обратно из CURL, вы можете использовать Regex для сопоставления текста:

function fetch_google($terms="sample search",$numpages=1,$user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0')  
{
    $searched="";
    for($i=0;$i<=$numpages;$i++)
    {
        $ch = curl_init();
        $url="http://www.google.com/searchbyimage?hl=en&image_url=".urlencode($terms);
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_REFERER, 'http://www.google.com/');
        curl_setopt ($ch,CURLOPT_CONNECTTIMEOUT,120);
        curl_setopt ($ch,CURLOPT_TIMEOUT,120);
        curl_setopt ($ch,CURLOPT_MAXREDIRS,10);
        curl_setopt ($ch,CURLOPT_COOKIEFILE,"cookie.txt");
        curl_setopt ($ch,CURLOPT_COOKIEJAR,"cookie.txt");
        $searched=$searched.curl_exec ($ch);
        curl_close ($ch);
    }

    $matches = array();
    preg_match('/Best guess for this image:[^<]+<a[^>]+>([^<]+)/', $searched, $matches);
    return (count($matches) > 1 ? $matches[1] : false);
}
Оно работает! Но я всегда читаю на stackoverflow, чтобы не использовать регулярные выражения, а использовать только dom. Suyash
У каждого есть свои плюсы и минусы, но в этой ситуации я бы всегда использовал Regex. DOMDocument хорош, но в ситуациях, когда вы загружаете внешний контент, который вы не можете контролировать, любая допущенная ими ошибка нарушит ваш код. Regex чрезвычайно гибок, поэтому пример, который я привел, просто ищет "Лучшее предположение для этого изображения: & lt; a href =" ... "aston martin vantage & lt; / a & got;" он не заботится об остальном контенте. Конечно, они могут изменить это, но когда это произойдет, вам потребуется гораздо больше времени для обновления вашего метода DOMDocument, чем метода Regex. НТН
2

Если вы хотите использовать DOMDocument, вы можете получить значения со следующей модификацией.

    <?php

function fetch_google($terms="sample search",$numpages=1,$user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0')  
{
    $searched="";
    for($i=0;$i<=$numpages;$i++)
    {
        $ch = curl_init();
        $url="http://www.google.com/searchbyimage?hl=en&image_url=".urlencode($terms);
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_REFERER, 'http://www.google.com/');
        curl_setopt ($ch,CURLOPT_CONNECTTIMEOUT,120);
        curl_setopt ($ch,CURLOPT_TIMEOUT,120);
        curl_setopt ($ch,CURLOPT_MAXREDIRS,10);
        curl_setopt ($ch,CURLOPT_COOKIEFILE,"cookie.txt");
        curl_setopt ($ch,CURLOPT_COOKIEJAR,"cookie.txt");
        $searched=$searched.curl_exec ($ch);
        curl_close ($ch);
    }

    $xml = new DOMDocument();
    @$xml->loadHTML($searched);
    if(true == ($topblock = $xml->getElementByID('topstuff')))
    {

        foreach($topblock->getElementsByTagName('div') as $div){

            if(strstr(strtolower($div->nodeValue), "guess")){
                foreach($div->getElementsByTagName('a') as $a){
                    $last = $a->nodeValue;
                }
            }
        }
    }

    return $last; 
}

$content = fetch_google($_GET['img'],1);
echo $content."<br>";

?>

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