2016-04-22 3 views
1

私は現在、fbビデオページからビューを抽出するためにdom throuhg phpを操作しようとしています。以下のコードは少し前まで動作していました。しかし、現在はビュー数を含むnodeが見つかりません。この情報は、IDがfbPhotoPageMediaInfoのdiv内にあります。どのようなfbのビデオページのビューを取得するPHPを介してDOMを操作するための最良の方法は?あなたは$requestvar_dump()あなたはそれがあなたにむしろ200(OK)より302コード(リダイレクト)を与えていることが確認できた場合はここでphpでdomを操作してデータを削る

private function _callCurl($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
     curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Linux; Android 5.0.1; SAMSUNG-SGH-I337 Build/LRX22C; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.2311.138 Mobile Safari/537.36'); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    $response = curl_exec($ch); 
    $http  = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    return array(
     $http, 
     $response, 
    ); 
} 



function test() 
{ 

    $url  = "https://www.facebook.com/TaylorSwift/videos/10153665021155369/"; 
    $request = callCurl($url); 
    if ($request[0] == 200) { 
     $dom = new DOMDocument(); 
     @$dom->loadHTML($request[1]); 
     $elm = $dom->getElementById('fbPhotoPageMediaInfo'); 
     if (isset($elm->nodeValue)) { 
      $views = preg_replace('/[^0-9]/', '', $elm->nodeValue); 
     } else { 
      $views = null; 
     } 
    } else { 
     echo "Error!"; 
    } 

    return isset($views) ? $views : null; 
} 

答えて

1

  1. ...私が決めたものです。
  2. CURLOPT_FOLLOWLOCATIONからtrueに変更するか、完全にコメントアウトすると、エラーは消えてしまいますが、ここでは予想外のページが表示されています。

私はにリダイレクトされていた場所を確認するには、次のように走った。

$htm = file_get_contents("https://www.facebook.com/TaylorSwift/videos/10153665021155369/"); 
var_dump($htm); 

これは私が古いブラウザを使用していたと言って私にページを与え、それを更新する必要がありました。だから明らかにFacebookはユーザーエージェントを好まない。

次のように私はそれを更新:

問題を解決するために表示されます
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/44.0.2'); 

0

個人的に私はSimplehtmldomを使用することを好みます。

他のトラフィックの多いサイトのように、ソースを更新してスクレイピングを防止します。将来、ノード検索を調整する必要があります。

<?php 
$ua = "Mozilla/5.0 (Windows NT 5.0) AppleWebKit/5321 (KHTML, like Gecko) Chrome/13.0.872.0 Safari/5321"; // must be a valid User Agent 
ini_set('user_agent', $ua); 

require_once('simplehtmldom/simple_html_dom.php'); // http://simplehtmldom.sourceforge.net/ 

Function Scrape_FB_Views($url) { 

    IF (!filter_var($url, FILTER_VALIDATE_URL) === false) { 

     // Create DOM from URL 
     $html = file_get_html($url); 
     IF ($html) { 

      IF (($html->find('span[class=fcg]', 3))) { // 4th instance of span with fcg class 
       $text = trim($html->find('span[class=fcg]', 3)->plaintext); // get content of span as plain text 
       $result = preg_replace('/[^0-9]/', '', $text); // replace all non-numeric characters 
      }ELSE{ 
       $result = "Node is no longer valid." 
      } 

     }ELSE{ 
      $result = "Could not get HTML."; 
     } 
    }ELSE{ 
     $result = "URL is invalid."; 
    } 

    return $result; 

} 

$url = "https://www.facebook.com/TaylorSwift/videos/10153665021155369/"; 
echo("<p>".Scrape_FB_Views($url)."</p>"); 
?> 
関連する問題