20

PHPのcURLがいくつかのURLを含む空の文字列を返すことに問題があります。さまざまなWebページのOGメタデータを解析しようとしていますが、NYTimesを除くすべてのWebサイトで機能します。これが私のこれまでのコードです。

print_r(get_og_metadata('http://somewebsite.com'));


public function get_data($url)
{
    $ch = curl_init();
    $timeout = 5;
    // the url to fetch
    curl_setopt($ch, CURLOPT_URL, $url);
    // return result as a string rather than direct output
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // set max time of cURL execution
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

public function get_og_metadata($url)
{
    libxml_use_internal_errors(TRUE);
    $data = $this->_get_data($url);
    $doc = new DOMDocument();
    $doc->loadHTML($data);

    $xpath = new DOMXPath($doc);
    $query = '//*/meta[starts-with(@property, \'og:\')]';

    $metadatas = $xpath->query($query);
    $result = array();
    foreach($metadatas as $metadata)
    {
        $property = $metadata->getAttribute('property');
        $content = $metadata->getAttribute('content');
        $result[$property] = $content;
    }

    return $result;
}
4

4 に答える 4

32

これらの5行は私のために魔法をかけました。

   curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17');
   curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_VERBOSE, 1);
于 2014-07-22T05:46:17.013 に答える
19

私の推測では、ニューヨークタイムズのようなサイトはそのような振る舞いから保護されています。ほとんどの場合、これはユーザーエージェントに基づいており、次のように偽造することができます。

curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17');

これは、最も一般的なエージェントです。

于 2013-02-04T03:26:18.997 に答える
11

(他の答えも私です)

これが私のためにそれをしたことです。それはSSL検証を探していましたが、この特定のケースではたまたま必要ありませんでした。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
于 2016-10-14T03:09:39.073 に答える
3

これが私のためにそれをしたことです。それはSSL検証を探していましたが、この特定のケースではたまたま必要ありませんでした。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
于 2016-10-14T03:02:05.507 に答える