2016-04-22 3 views
1

В настоящее время я пытаюсь манипулировать dom throuhg php, чтобы извлекать просмотры с видеофрагмента fb. Код ниже работал немного назад. Однако теперь он не находит node, содержащий количество просмотров. Эта информация находится внутри div с идентификатором fbPhotoPageMediaInfo. Каким будет лучший способ манипулировать dom через php, чтобы получить представление о странице видео fb?Манипулировать dom с php, чтобы очистить данные

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. Если вы var_dump() на $request вы можете увидеть, что это дает вам 302 код (перенаправлять), а не 200 (ОК).
  2. Изменение CURLOPT_FOLLOWLOCATION до true или комментирование его полностью заставляет проблему уйти, но теперь мы получаем другую страницу от ожидаемой.

Я побежал следующий видеть, где я был перенаправлен:

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

Это дало мне страницу говоря, что я использовал устаревший браузер, и необходимо, чтобы обновить его. Так что, по-видимому, Facebook не нравится User Agent.

Я обновил его следующим образом:

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/44.0.2'); 

Это, кажется, решить эту проблему.

0

Лично я предпочитаю использовать Simplehtmldom.

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

<?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>"); 
?> 
Смежные вопросы