我相信 python 客户端库为您抽象出了 pageToken。如果您深入到源代码中 search_jobs 方法的末尾,您将看到它构建了一个知道 pageToken 和 nextPageToken 字段的迭代器:
iterator = google.api_core.page_iterator.GRPCIterator(
client=None,
method=functools.partial(
self._inner_api_calls["search_jobs"],
retry=retry,
timeout=timeout,
metadata=metadata,
),
request=request,
items_field="matching_jobs",
request_token_field="page_token",
response_token_field="next_page_token",
)
return iterator
因此,您需要做的就是以下内容 - 从https://googleapis.github.io/google-cloud-python/latest/talent/gapic/v4beta1/api.html的文档中复制:
from google.cloud import talent_v4beta1
client = talent_v4beta1.JobServiceClient()
parent = client.tenant_path('[PROJECT]', '[TENANT]')
# TODO: Initialize `request_metadata`:
request_metadata = {}
# Iterate over all results
for element in client.search_jobs(parent, request_metadata):
# process element
pass
# Alternatively:
# Iterate over results one page at a time
for page in client.search_jobs(parent, request_metadata).pages:
for element in page:
# process element
pass
默认页面大小显然是 10,您可以使用 pageSize 参数对其进行修改。页面迭代器文档可以在这里找到:
文档:https ://googleapis.github.io/google-cloud-python/latest/core/page_iterator.html
来源:https ://googleapis.github.io/google-cloud-python/latest/_modules/google/api_core/page_iterator.html#GRPCIterator
可能最简单的处理方法是使用所有结果
allResults = list(results_iterator)
如果您有大量数据并且不想一次性翻页,我会执行以下操作。“.pages”只是返回一个您可以照常使用的生成器。
resultsIterator = client.search_jobs(parent, request_metadata)
pages = resultsIterator.pages
currentPageIter = next(pages)
#do work with page
currentItem = next(currentPageIter)
currentPageIter = next(pages)
# etc...
当您用完项目或页面时,您需要捕获 StopIteration 错误:
https://anandology.com/python-practice-book/iterators.html
这就是为什么:
def _page_iter(self, increment):
"""Generator of pages of API responses.
Args:
increment (bool): Flag indicating if the total number of results
should be incremented on each page. This is useful since a page
iterator will want to increment by results per page while an
items iterator will want to increment per item.
Yields:
Page: each page of items from the API.
"""
page = self._next_page()
while page is not None:
self.page_number += 1
if increment:
self.num_results += page.num_items
yield page
page = self._next_page()
看看它在 yield 之后如何调用 _next_page?这将检查更多页面,然后为您执行另一个请求(如果存在)。
def _next_page(self):
"""Get the next page in the iterator.
Returns:
Page: The next page in the iterator or :data:`None` if
there are no pages left.
"""
if not self._has_next_page():
return None
if self.next_page_token is not None:
setattr(self._request, self._request_token_field, self.next_page_token)
response = self._method(self._request)
self.next_page_token = getattr(response, self._response_token_field)
items = getattr(response, self._items_field)
page = Page(self, items, self.item_to_value)
return page
如果您想要一个无会话选项,您可以使用偏移量 + 页面大小并在每个 ajax 请求上将当前偏移量传递给用户:
偏移量(整数)-</p>
可选的。一个整数,指定搜索结果中的当前偏移量(即起始结果位置,在 API 认为相关的工作中)。仅当 page_token 未设置时才考虑此字段。
例如,0 表示从第一个匹配的作业开始返回结果,10 表示从第 11 个作业返回。这可以用于分页,(例如,pageSize = 10 和 offset = 10 表示从第二页返回)。