2014-09-18 2 views
3

검색 api를 사용하고 nextpagetoken을 사용하여 결과를 매김합니다. 그러나이 방법으로 모든 결과를 검색 할 수는 없습니다. 약 455000 개의 결과 중에서 500 개의 결과 만 얻을 수 있습니다.youtube api v3 페이지 토큰

다음은 검색 결과를 가져 오기 위해 자바 코드입니다 :

youtube = new YouTube.Builder(Auth.HTTP_TRANSPORT, Auth.JSON_FACTORY, new HttpRequestInitializer() {public void initialize(HttpRequest request) throws IOException {}   }).setApplicationName("youtube-search").build(); 

YouTube.Search.List search = youtube.search().list("id,snippet"); 
String apiKey = properties.getProperty("youtube.apikey"); 
search.setKey(apiKey); 
search.setType("video"); 
search.setMaxResults(50); 
search.setQ(queryTerm); 
boolean allResultsRead = false; 
while (! allResultsRead){ 
SearchListResponse searchResponse = search.execute(); 
System.out.println("Printed " + searchResponse.getPageInfo().getResultsPerPage() + " out of " + searchResponse.getPageInfo().getTotalResults() + ". Current page token: " + search.getPageToken() + "Next page token: " + searchResponse.getNextPageToken() + ". Prev page token" + searchResponse.getPrevPageToken()); 
if (searchResponse.getNextPageToken() == null) 
{ 
    allResultsRead = true;       
    search = youtube.search().list("id,snippet"); 
    search.setKey(apiKey); 
    search.setType("video"); 
    search.setMaxResults(50); 
} 
else 
{ 
    search.setPageToken(searchResponse.getNextPageToken()); 
}} 

출력은 다음 페이지 토큰이 null 있기 때문에 종료, while 루프를 통해

Printed 50 out of 455085. Current page token: null Next page token: CDIQAA. Prev page token null 
Printed 50 out of 454983. Current page token: CDIQAA Next page token: CGQQAA. Prev page token CDIQAQ 
Printed 50 out of 455081. Current page token: CGQQAA Next page token: CJYBEAA. Prev page token CGQQAQ 
Printed 50 out of 454981. Current page token: CJYBEAA Next page token: CMgBEAA. Prev page token CJYBEAE 
Printed 50 out of 455081. Current page token: CMgBEAA Next page token: CPoBEAA. Prev page token CMgBEAE 
Printed 50 out of 454981. Current page token: CPoBEAA Next page token: CKwCEAA. Prev page token CPoBEAE 
Printed 50 out of 455081. Current page token: CKwCEAA Next page token: CN4CEAA. Prev page token CKwCEAE 
Printed 50 out of 454980. Current page token: CN4CEAA Next page token: CJADEAA. Prev page token CN4CEAE 
Printed 50 out of 455081. Current page token: CJADEAA Next page token: CMIDEAA. Prev page token CJADEAE 
Printed 50 out of 455081. Current page token: CMIDEAA Next page token: null. Prev page token CMIDEAE 

10 후 반복이다.

저는 Yotube API를 처음 접했고 여기에서 잘못된 것을 잘 모릅니다. 두 가지 질문이 있습니다. 1. 모든 결과를 얻으려면 어떻게해야합니까? 2. 3 페이지의 이전 페이지 토큰이 2 페이지의 현재 토큰과 다른 이유는 무엇입니까?

도움이 될 것입니다. 감사!

답변

17

의도 한대로 발생했습니다. nextPageToken을 사용하면 최대 500 개의 결과 만 얻을 수 있습니다. 이에 대해 온 방법의 개발에 관심이 있다면, 당신은이 스레드를 통해 읽을 수 있습니다 : https://code.google.com/p/gdata-issues/issues/detail?id=4282

그러나 해당 스레드의 요약으로

, 그것은 기본적으로 사실에 온다, 그와 너무 많은 YouTube의 데이터는 검색 알고리즘이 대부분의 사람들이 생각하는 것과는 근본적으로 다릅니다. 이것은 단순히 필드에서 내용을 검색하는 간단한 데이터베이스를 수행하는 것이 아니라 결과를 관련시키기 위해 처리되는 신호의 수가 매우 많으며 약 500 개의 결과 후에 알고리즘이 결과를 보람있게 만드는 기능을 잃기 시작합니다 .

내 마음을 감추는 데 도움이되는 한 가지 사실은 YouTube가 검색에 대해 이야기 할 때 일치하는 것보다는 확률을 말하는 것이므로 매개 변수를 기반으로 결과가 가능성에 따라 정렬된다는 것을 깨닫는 것입니다 귀하의 검색어와 관련이 있습니다. 페이지 매김을하면 결국 통계적으로 관련성이 낮아 결과가 다시 돌아 오지 않는 계산 상 가치가없는 시점에 도달하게됩니다. 그래서 500은 한도에 따라 결정됩니다.

("결과 수"는 근사치가 아니며 잠재적 인 일치 항목의 근사치이지만 나중에 검색하기 시작할 때 해당되는 일치 항목 중 많은 수가 관련성이없는 것으로 간주됩니다. 모든 사람들이 실제로 생각하는 것을 의미하지는 않습니다. Google 검색은 같은 방식입니다.)

전통적인 문자열/데이터 일치를 사용하는 대신 YouTube 검색이 이러한 방식으로 작동하는 이유가 궁금 할 수 있습니다. 검색 량이 너무 많아서 모든 검색어에 대해 모든 데이터를 실제로 검색한다면 더 이상은 아니더라도 한 번에 몇 분씩 기다릴 수 있습니다. 기술적 인면에서 놀랍습니다. 예측, 확률 등에서 작동 할 때 알고리즘이 상위 500 개 사례에 대해 어떻게 관련 결과를 얻을 수 있는지 생각하면됩니다.

두 번째 질문에서 페이지 토큰은 고유 한 결과 집합을 나타내지 않고 일종의 알고리즘 상태를 나타내며 따라서 쿼리에 대한 포인터, 쿼리 진행률 및 query ... 그래서 반복 3은 예를 들어 반복 2의 nextPageToken과 반복 4의 prevPageToken에 의해 참조되지만,이 두 토큰은 약간 다르기 때문에 그들이 나온 방향을 나타낼 수 있습니다.

이 내가이 vardamp 쓰기 NEX 페이지는 페이지 토큰 그냥이 코드를 복사하여 실행 동일하지 있음을 보여주기 위해 표시됩니다

페이지 토큰에 매개 변수로의 nextPageToken 페이지를 통과 줄 수

0

당신이 당신의 플러그인 내가, 당신이 setFields에서의 'nextPageToken "를 포함하지 않은 것을 볼

<?php 
    function doit(){if (isset($_GET['q']) && $_GET['maxResults']) { 
     // Call set_include_path() as needed to point to your client library. 
    // require_once ($_SERVER["DOCUMENT_ROOT"].'/API/youtube/google-api-php-client/src/Google_Client.php'); 
    // require_once ($_SERVER["DOCUMENT_ROOT"].'/API/youtube/google-api-php-client/src/contrib/Google_YouTubeService.php'); 
     set_include_path("./google-api-php-client/src"); 
     require_once 'Google_Client.php'; 
     require_once 'contrib/Google_YouTubeService.php'; 
     /* Set $DEVELOPER_KEY to the "API key" value from the "Access" tab of the 
     Google APIs Console <http://code.google.com/apis/console#access> 
     Please ensure that you have enabled the YouTube Data API for your project. */ 
     $DEVELOPER_KEY = 'AIzaSyCgHHDrx5ufQlkXcSc8nm5uqrsNdXizbMs'; 

         // the old one AIzaSyDOkg-u9jnhP-WnzX5WPJyV1sc5QQrtuyc 



    $client = new Google_Client(); 
     $client->setDeveloperKey($DEVELOPER_KEY); 

     $youtube = new Google_YoutubeService($client); 

     try { 
     $searchResponse = $youtube->search->listSearch('id,snippet', array(
      'q' => $_GET['q'], 
      'maxResults' => $_GET['maxResults'], 

    )); 
    var_dump($searchResponse); 


    $searchResponse2 = $youtube->search->listSearch('id,snippet', array(
     'q' => $_GET['q'], 
     'maxResults' => $_GET['maxResults'], 
     'pageToken' => $searchResponse['nextPageToken'], 
    )); 
    var_dump($searchResponse2); 
    exit; 


    $videos = ''; 
    $channels = ''; 
     foreach ($searchResponse['items'] as $searchResult) { 
      switch ($searchResult['id']['kind']) { 
     case 'youtube#video': 

      $videoId =$searchResult['id']['videoId']; 
      $title = $searchResult['snippet']['title']; 
      $publishedAt= $searchResult['snippet']['publishedAt']; 
      $description = $searchResult['snippet']['description']; 
      $iamge_url = $searchResult['snippet'] ['thumbnails']['default']['url']; 
      $image_high = $searchResult['snippet'] ['thumbnails']['high']['url']; 




      echo '<div class="souligne" id="'.$videoId.'"> 

      <div > 
      <a href=http://www.youtube.com/watch?v='.$videoId.' target=_blank" > 
      <img src="'.$iamge_url .'" width ="150px" /> 
      </a> 
      </div> 
      <div class="title">'.$title.'</div> 
      <div class="des"> '.$description.' </div> 
      <a id="'.$videoId.'" onclick="supp(this)" class="linkeda"> 
       + ADD 
      </a>     
      </div>' 
      ; 
      break; 
     } 
    } 
    echo ' </ul></form>'; 

     } catch (Google_ServiceException $e) { 
     $htmlBody .= sprintf('<p>A service error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
     } catch (Google_Exception $e) { 
     $htmlBody .= sprintf('<p>An client error occurred: <code>%s</code></p>', 
      htmlspecialchars($e->getMessage())); 
     } 
    }} 
     doit(); 
    ?> 
    <!doctype html> 
    <html> 
     <head> 
     <title>YouTube Search</title> 
    <link href="//www.w3resource.com/includes/bootstrap.css" rel="stylesheet"> 
    <style type="text/css"> 
    body{margin-top: 50px; margin-left: 50px} 
    </style> 
     </head> 
     <body> 
     <form method="GET"> 
     <div> 
     Search Term: <input type="search" id="q" name="q" placeholder="Enter Search Term"> 
     </div> 
     <div> 

     Max Results: <input type="number" id="maxResults" name="maxResults" min="1" max="1000000" step="1" value="25"> 
     </div> 
     <div> 
     page: <input type="number" id="startIndex" name="startIndex" min="1" max="50" step="1" value="2"> 
     </div> 
     <input type="submit" value="Search"> 
    </form> 

<h3>Videos</h3> 
    <ul><?php if(isset($videos))echo $videos; ?></ul> 
    <h3>Channels</h3> 
    <ul><?php if(isset($channels)) echo $channels; ?></ul> 
</body> 
</html> 
3

의 동일한 폴더에 API를 자원 폴더를 넣어 가지고 있는지 확인하십시오. 예를 들어

:

public class ABC { 
private YouTube youtube; 
private YouTube.Search.List query; 

public static final String KEY = "YOUR API KEY"; 

public YoutubeConnector(Context context) { 
    youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() { 
     @Override 
     public void initialize(HttpRequest httpRequest) throws IOException { 
     } 
    }).setApplicationName(context.getString(R.string.app_name)).build(); 

    try { 
     query = youtube.search().list("id,snippet"); 
     query.setMaxResults(Long.parseLong("10")); 
     query.setKey(KEY); 
     query.setType("video"); 
     query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url),nextPageToken"); 
    } catch (IOException e) { 
     Log.d("YC", "Could not initialize: " + e.getMessage()); 
    } 
} 

public List<VideoItem> search(String keywords) { 
    query.setQ(keywords); 
     try { 
      List<VideoItem> items = new ArrayList<VideoItem>(); 
      String nextToken = ""; 
      int i = 0; 
      do { 
       query.setPageToken(nextToken); 
       SearchListResponse response = query.execute(); 
       List<SearchResult> results = response.getItems(); 
       for (SearchResult result : results) { 
        VideoItem item = new VideoItem(); 
        item.setTitle(result.getSnippet().getTitle()); 
         item.setDescription(result.getSnippet().getDescription()); 
        item.setThumbnailURL(result.getSnippet().getThumbnails().getDefault().getUrl()); 
        item.setId(result.getId().getVideoId()); 
        items.add(item); 
       } 
       nextToken = response.getNextPageToken(); 
       i ++; 
       System.out.println("nextToken : "+ nextToken); 
      } while (nextToken != null && i < 20); 

      return items; 
     } catch (IOException e) { 
      Log.d("YC", "Could not search: " + e); 
      return null; 
     } 

} 
} 

나는이 도움을 바랍니다.