Пагинация Bing Search API v7

Я работаю над интеграцией Bing News API v7. Точнее используюhttps://api.cognitive.microsoft.com/bing/v7.0/news/search Конечная точка API.

Я обнаружил "неожиданное" поведение при подкачке. (Ожидаемое поведение - каждая страница имеет постоянный размер).

На этой странице объясняется, как пролистывать результаты.

Я следую этому подходу. Я использую 30 для размера страницы; по этой причине значения смещения равны 0, 30, 60 и так далее.

Например, при использовании этих параметров: запрос "Java 14", рынок "en-US", сортировка по дате и значения смещения: 0, 30, 60, 90, 120, 150(/bing/v7.0/news/search?q=Java 14&count=30&offset=0&mkt=en-US&sortBy=date).

Я получаю шесть страниц результатов, каждая из которых содержит менее 30 URL-адресов на странице.

Page: 0 Total: 27 results
Page: 1 Total: 26 results
Page: 2 Total: 26 results
Page: 3 Total: 29 results
Page: 4 Total: 29 results
Page: 5 Total: 7 results
...

Этот Stackru. Каково ожидаемое поведение Bing Search API v5 при глубоком разбиении на страницы? относится к Bing API v5. Значения разбиения на страницы не соответствуют последовательности фиксированного размера, но формулаprevious result size + 1.

Итак, мой вопрос: какие значения я должен использовать для смещения для второй страницы (Page: 1)? Сейчас 28 или 30? И какое значение для третьей страницы (Page 2): 54 или 60?

0 ответов

Сделайте первый переход к API, чтобы определить totalEstimatedMatches. Разделите totalEstimatedMatches / 25 или размер каждой страницы, чтобы получить количество вызовов API. Например, если totalEstimatedMatches = 100, тогда сделайте 4 вызова API, каждый из которых должен возвращать 25 URL. Я перестраховываюсь и уменьшаю это на 1, но вы можете попробовать это сделать. s.Count в этом примере будет 25. Решение в VB.Net, но вы поняли идею.

        'the secret key 
        Dim accessKey As String = "xxxxxxxxxxxxxxxxxxxxxxxxx"
        Dim endpoint As String = "https://api.cognitive.microsoft.com/bing/v7.0/news/search?"

        Dim queryString = HttpUtility.ParseQueryString(String.Empty)
        queryString("q") = search_criteria 'Uri.EscapeDataString(search_criteria)
        queryString("mkt") = market
        queryString("count") = "25"
        queryString("offset") = "0"
        queryString("freshness") = freshness
        queryString("SafeSearch") = "strict"

        ' Construct the URI of the search request
        uriQuery = endpoint & queryString.ToString

        ' Perform the Web request and get the response
        request = HttpWebRequest.Create(uriQuery)
        request.Headers.Add("Ocp-Apim-Subscription-Key", accessKey)

        response = CType(request.GetResponseAsync.Result, HttpWebResponse)
        json = (New StreamReader(response.GetResponseStream)).ReadToEnd

        'create json object
        Dim converter = New ExpandoObjectConverter()
        Dim message As Object = JsonConvert.DeserializeObject(Of ExpandoObject)(json, converter)

        'get top level object and its sub objects
        s = message.value

        Try
            totalEstimatedMatches = CInt(message.totalEstimatedMatches)
            total_available_for_processing = s.Count
        Catch ex As Exception
        End Try

        'get total number of pages availble at 25 records per page, so we page thru 25 records at a time and then call api
        Dim page_count As Integer = totalEstimatedMatches / 25

        'loop thru page_count and 
        For p As Integer = 0 To page_count - 1

            If p = 0 Then
                queryString("count") = "25"
                queryString("offset") = "0"
            Else
                'determine offset
                queryString("count") = "25"
                queryString("offset") = p * 25
            End If

            ' Construct the URI of the search request
            uriQuery = endpoint & queryString.ToString

            ' Perform the Web request and get the response
            request = HttpWebRequest.Create(uriQuery)
            request.Headers.Add("Ocp-Apim-Subscription-Key", accessKey)

            response = CType(request.GetResponseAsync.Result, HttpWebResponse)
            json = (New StreamReader(response.GetResponseStream)).ReadToEnd

            'create json object
            message = JsonConvert.DeserializeObject(Of ExpandoObject)(json, converter)

            'get top level object and its sub objects
            s = message.value

            For i As Integer = 0 To s.Count - 1

                Dim myuri As Uri = New Uri(s(i).url.ToString)
                Dim vendor_domain As String = myuri.Host

                System.Diagnostics.Debug.WriteLine(icount & "," & myuri.ToString & "," & vendor_domain)
                icount = icount + 1
            Next
            System.Threading.Thread.Sleep(100)

        Next
Другие вопросы по тегам