Пагинация 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