Skip to content

Commit e5d4d08

Browse files
committed
fix: prevent additional fetch when SerpResults.yield_pages is used to fetch only 1 page.
1 parent c6f7f63 commit e5d4d08

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

serpapi/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import json
22

3-
from pprint import pformat
43
from collections import UserDict
54

65
from .textui import prettify_json
7-
from .exceptions import HTTPError
86

97

108
class SerpResults(UserDict):
@@ -71,6 +69,8 @@ def yield_pages(self, max_pages=1_000):
7169
while current_page and current_page_count < max_pages:
7270
yield current_page
7371
current_page_count += 1
72+
if current_page_count >= max_pages:
73+
break
7474
if current_page.next_page_url:
7575
current_page = current_page.next_page()
7676
else:

tests/test_pagination.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import json
2+
from unittest.mock import Mock
3+
4+
import pytest
5+
import requests
6+
7+
import serpapi
8+
9+
10+
@pytest.mark.parametrize(
11+
("max_pages", "available_pages", "expected_pages"),
12+
[(1, 3, 1), (2, 3, 2), (3, 3, 3), (5, 3, 3), (5, 1, 1), (0, 3, 0)],
13+
)
14+
def test_yield_pages_does_not_request_unused_pages(
15+
max_pages, available_pages, expected_pages
16+
):
17+
responses = []
18+
for page_number in range(1, available_pages + 1):
19+
data = {"search_information": {"page_number": page_number}}
20+
if page_number < available_pages:
21+
data["serpapi_pagination"] = {
22+
"next": f"https://serpapi.com/search?engine=google&q=Coffee&start={page_number * 10}"
23+
}
24+
response = requests.Response()
25+
response.status_code = 200
26+
response.headers["Content-Type"] = "application/json"
27+
response._content = json.dumps(data).encode("utf-8")
28+
responses.append(response)
29+
30+
client = serpapi.Client(api_key="test-api-key")
31+
client.session.request = Mock(side_effect=responses)
32+
results = client.search(engine="google", q="Coffee")
33+
34+
pages = list(results.yield_pages(max_pages=max_pages))
35+
36+
assert [page["search_information"]["page_number"] for page in pages] == list(
37+
range(1, expected_pages + 1)
38+
)
39+
assert client.session.request.call_count == max(1, expected_pages)

0 commit comments

Comments
 (0)