The Google Books API returns only 10 results

I am implementing a PHP application that requires some data from the Google Books APIs for the first time. This is rather inconvenient, but when I use the typical request http://books.google.com/books/feeds/volumes?q=search+term (someone who has experience with a specific API can understand me), he returns only 10 results.

For example, the XML response for http://books.google.com/books/feeds/volumes?q=php contains the following field: totalResults> 582. However, I get only 10.

After reading the relevant documentation, I did not come to a decision.

Can anyone help me?

+6
source share
2 answers

No, its another parameter: max-results . But it seems that the maximum number of results on one page is still quite low - by 20.

For example, this query:

http://books.google.com/books/feeds/volumes?q=php&max-results=40

... gave me only 20 entries. However, it is useful that you can iterate over the collection using the start-index parameter, for example:

http://books.google.com/books/feeds/volumes?q=php&max-results=20&start-index=21

... then 41, 61, etc. It starts with 1, not 0, I checked. )

+6
source

The keyword is maxResults , not max-results , as in raina77ow's answer. Source As stated in the documentation, the maximum number of books that can be obtained right away is 40. However, you can overcome this limitation with a few queries, for example, using this PHP function:

 private $books = array('items' => array()); /** * Searches the Google Books database through their public API * and returns the result. Notice that this function will (due to * Google restriction) perform one request per 40 books. * If there aren't as many books as requested, those found will be * returned. If no books at all is found, false will be returned. * * @author Dakniel * @param string $query Search-query, API documentation * @param int $numBooksToGet Amount of results wanted * @param int [optional] $startIndex Which index to start searching from * @return False if no book is found, otherwise the books */ private function getBooks($query, $numBooksToGet, $startIndex = 0) { // If we've already fetched all the books needed, or // all results are already stored if(count($this->books['items']) >= $numBooksToGet) return $this->books; $booksNeeded = $numBooksToGet - count($this->books['items']); // Max books / fetch = 40, this is therefore our limit if($booksNeeded > 40) $booksNeeded = 40; $url = "https://www.googleapis.com/books/v1/volumes?q=". urlencode($query) ."&startIndex=$startIndex&maxResults=$booksNeeded"; // Get the data with cURL $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $bookBatch = curl_exec($ch); curl_close($ch); // If we got no matches.. if($bookBatch['totalItems'] === 0) { // .. but we already have some books, return those if(count($this->books) > 0) return $this->books; else return false; } // Convert the JSON to an array and merge the existing books with // this request new books $bookBatch = json_decode($bookBatch, true); $this->books['items'] = array_merge($this->books['items'], $bookBatch['items']); // Even if we WANT more, but the API can't give us more: stop if( ($bookBatch['totalItems'] - count($this->books['items'])) === 0 ) { return $this->books; } // We need more books, and there more to get: use recursion return $this->getBooks($query, $numBooksToGet, $startIndex); } 

A simple use case:

 $books = $this->getBooks("programming", 50); 

which will return up to 50 books that match keyword programming. Hope someone will use this, good luck!

+7
source

Source: https://habr.com/ru/post/919931/


All Articles