crawlora 1.6.0.dev1__tar.gz → 1.6.0.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. {crawlora-1.6.0.dev1/crawlora.egg-info → crawlora-1.6.0.dev3}/PKG-INFO +2 -2
  2. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/client.py +1 -1
  3. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/client.pyi +125 -0
  4. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/operations.py +38 -2
  5. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3/crawlora.egg-info}/PKG-INFO +2 -2
  6. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/docs/operations.md +3 -1
  7. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/pyproject.toml +17 -2
  8. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_client.py +2 -2
  9. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/LICENSE +0 -0
  10. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/MANIFEST.in +0 -0
  11. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/README.md +0 -0
  12. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/__init__.py +0 -0
  13. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/_pagination.py +0 -0
  14. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/_transport_sync.py +0 -0
  15. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/async_client.py +0 -0
  16. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora/py.typed +0 -0
  17. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora.egg-info/SOURCES.txt +0 -0
  18. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora.egg-info/dependency_links.txt +0 -0
  19. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora.egg-info/requires.txt +0 -0
  20. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/crawlora.egg-info/top_level.txt +0 -0
  21. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/docs/recipes.md +0 -0
  22. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/examples/async_search.py +0 -0
  23. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/examples/bing_search.py +0 -0
  24. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/examples/paginate.py +0 -0
  25. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/examples/youtube_transcript.py +0 -0
  26. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/setup.cfg +0 -0
  27. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_async_httpx.py +0 -0
  28. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_examples.py +0 -0
  29. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_v14_features.py +0 -0
  30. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_v15_features.py +0 -0
  31. {crawlora-1.6.0.dev1 → crawlora-1.6.0.dev3}/tests/test_w2_features.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlora
3
- Version: 1.6.0.dev1
3
+ Version: 1.6.0.dev3
4
4
  Summary: Official Python SDK for the Crawlora web-scraping API: typed grouped and dynamic operation calls for every public endpoint, with retries, pagination, hooks, and an async client.
5
5
  Author: Crawlora
6
6
  License-Expression: MIT
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://crawlora.net/
8
8
  Project-URL: Documentation, https://crawlora.net/docs
9
9
  Project-URL: Repository, https://github.com/Crawlora-org/crawlora-python-sdk
10
10
  Project-URL: Issues, https://github.com/Crawlora-org/crawlora-python-sdk/issues
11
- Keywords: crawlora,sdk,web-scraping,api-client
11
+ Keywords: crawlora,crawlora-sdk,web-scraping,scraping,scraper,web-scraper,api,api-client,rest-api,rest-api-client,sdk,client,data-extraction,serp
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: Programming Language :: Python :: 3
@@ -20,7 +20,7 @@ from ._transport_sync import KeepAliveTransport
20
20
  from .operations import GROUPS, OPERATIONS
21
21
 
22
22
  DEFAULT_BASE_URL = "https://api.crawlora.net/api/v1"
23
- VERSION = "1.6.0-sdk.1"
23
+ VERSION = "1.6.0-sdk.3"
24
24
  DEFAULT_USER_AGENT = f"crawlora-python-sdk/{VERSION}"
25
25
  DEFAULT_MAX_RETRY_DELAY = 30.0
26
26
  DEFAULT_RETRY_STATUSES = (408, 409, 425, 429)
@@ -2666,6 +2666,21 @@ ModelGoogleMapSearchOption = TypedDict('ModelGoogleMapSearchOption', {
2666
2666
  'language': NotRequired[str],
2667
2667
  }, total=False)
2668
2668
 
2669
+ ModelGoogleNewsResponse = TypedDict('ModelGoogleNewsResponse', {
2670
+ 'pagination': NotRequired[ModelGoogleVerticalPagination],
2671
+ 'results': NotRequired[list[ModelGoogleNewsResult]],
2672
+ }, total=False)
2673
+
2674
+ ModelGoogleNewsResult = TypedDict('ModelGoogleNewsResult', {
2675
+ 'age': NotRequired[str],
2676
+ 'description': NotRequired[str],
2677
+ 'position': NotRequired[int],
2678
+ 'source': NotRequired[str],
2679
+ 'thumbnail': NotRequired[str],
2680
+ 'title': NotRequired[str],
2681
+ 'url': NotRequired[str],
2682
+ }, total=False)
2683
+
2669
2684
  ModelGooglePeopleAlsoAskItem = TypedDict('ModelGooglePeopleAlsoAskItem', {
2670
2685
  'answer': NotRequired[str],
2671
2686
  'date': NotRequired[str],
@@ -2728,6 +2743,28 @@ ModelGoogleSuggestionResult = TypedDict('ModelGoogleSuggestionResult', {
2728
2743
  'query': NotRequired[str],
2729
2744
  }, total=False)
2730
2745
 
2746
+ ModelGoogleVerticalPagination = TypedDict('ModelGoogleVerticalPagination', {
2747
+ 'next_page': NotRequired[int],
2748
+ 'page': NotRequired[int],
2749
+ 'previous_page': NotRequired[int],
2750
+ }, total=False)
2751
+
2752
+ ModelGoogleVideoResult = TypedDict('ModelGoogleVideoResult', {
2753
+ 'age': NotRequired[str],
2754
+ 'description': NotRequired[str],
2755
+ 'duration': NotRequired[str],
2756
+ 'platform': NotRequired[str],
2757
+ 'position': NotRequired[int],
2758
+ 'thumbnail': NotRequired[str],
2759
+ 'title': NotRequired[str],
2760
+ 'url': NotRequired[str],
2761
+ }, total=False)
2762
+
2763
+ ModelGoogleVideosResponse = TypedDict('ModelGoogleVideosResponse', {
2764
+ 'pagination': NotRequired[ModelGoogleVerticalPagination],
2765
+ 'results': NotRequired[list[ModelGoogleVideoResult]],
2766
+ }, total=False)
2767
+
2731
2768
  ModelGoogleMapPlaceResponseDoc = TypedDict('ModelGoogleMapPlaceResponseDoc', {
2732
2769
  'code': NotRequired[int],
2733
2770
  'data': NotRequired[ModelGooglePlace],
@@ -2740,6 +2777,12 @@ ModelGoogleMapSearchResponseDoc = TypedDict('ModelGoogleMapSearchResponseDoc', {
2740
2777
  'msg': NotRequired[str],
2741
2778
  }, total=False)
2742
2779
 
2780
+ ModelGoogleNewsResponseDoc = TypedDict('ModelGoogleNewsResponseDoc', {
2781
+ 'code': NotRequired[int],
2782
+ 'data': NotRequired[ModelGoogleNewsResponse],
2783
+ 'msg': NotRequired[str],
2784
+ }, total=False)
2785
+
2743
2786
  ModelGoogleSearchResponseDoc = TypedDict('ModelGoogleSearchResponseDoc', {
2744
2787
  'code': NotRequired[int],
2745
2788
  'data': NotRequired[ModelGoogleSearchResp],
@@ -2752,6 +2795,12 @@ ModelGoogleSuggestResponseDoc = TypedDict('ModelGoogleSuggestResponseDoc', {
2752
2795
  'msg': NotRequired[str],
2753
2796
  }, total=False)
2754
2797
 
2798
+ ModelGoogleVideosResponseDoc = TypedDict('ModelGoogleVideosResponseDoc', {
2799
+ 'code': NotRequired[int],
2800
+ 'data': NotRequired[ModelGoogleVideosResponse],
2801
+ 'msg': NotRequired[str],
2802
+ }, total=False)
2803
+
2755
2804
  ModelGoogleplayApp = TypedDict('ModelGoogleplayApp', {
2756
2805
  'ad_supported': NotRequired[bool],
2757
2806
  'android_max_version': NotRequired[str],
@@ -9814,6 +9863,18 @@ GoogleMapSearchParams = TypedDict('GoogleMapSearchParams', {
9814
9863
  'mapSearchOption': Required[GoogleMapSearchBody],
9815
9864
  }, total=False)
9816
9865
 
9866
+ GoogleNewsResponse = ModelGoogleNewsResponseDoc
9867
+ GoogleNewsParams = TypedDict('GoogleNewsParams', {
9868
+ '_response_type': NotRequired[ResponseType],
9869
+ '_timeout': NotRequired[float],
9870
+ '_headers': NotRequired[Mapping[str, str]],
9871
+ 'q': Required[str],
9872
+ 'page': NotRequired[int],
9873
+ 'count': NotRequired[int],
9874
+ 'country': NotRequired[str],
9875
+ 'lang': NotRequired[str],
9876
+ }, total=False)
9877
+
9817
9878
  GoogleSearchBody = ModelGoogleSearchOption
9818
9879
  GoogleSearchResponse = ModelGoogleSearchResponseDoc
9819
9880
  GoogleSearchParams = TypedDict('GoogleSearchParams', {
@@ -9934,6 +9995,18 @@ GoogleTrendsTrendingDetailParams = TypedDict('GoogleTrendsTrendingDetailParams',
9934
9995
  'request': Required[GoogleTrendsTrendingDetailBody],
9935
9996
  }, total=False)
9936
9997
 
9998
+ GoogleVideosResponse = ModelGoogleVideosResponseDoc
9999
+ GoogleVideosParams = TypedDict('GoogleVideosParams', {
10000
+ '_response_type': NotRequired[ResponseType],
10001
+ '_timeout': NotRequired[float],
10002
+ '_headers': NotRequired[Mapping[str, str]],
10003
+ 'q': Required[str],
10004
+ 'page': NotRequired[int],
10005
+ 'count': NotRequired[int],
10006
+ 'country': NotRequired[str],
10007
+ 'lang': NotRequired[str],
10008
+ }, total=False)
10009
+
9937
10010
  GooglePlayAppResponse = ModelGoogleplayAppDetailsResponse
9938
10011
  GooglePlayAppParams = TypedDict('GooglePlayAppParams', {
9939
10012
  '_response_type': NotRequired[ResponseType],
@@ -12317,6 +12390,7 @@ class GoogleGroup:
12317
12390
  def jobs(self, **params: Unpack[GoogleJobsParams]) -> GoogleJobsResponse: ...
12318
12391
  def map_place(self, **params: Unpack[GoogleMapPlaceParams]) -> GoogleMapPlaceResponse: ...
12319
12392
  def map_search(self, **params: Unpack[GoogleMapSearchParams]) -> GoogleMapSearchResponse: ...
12393
+ def news(self, **params: Unpack[GoogleNewsParams]) -> GoogleNewsResponse: ...
12320
12394
  def search(self, **params: Unpack[GoogleSearchParams]) -> GoogleSearchResponse: ...
12321
12395
  def suggest(self, **params: Unpack[GoogleSuggestParams]) -> GoogleSuggestResponse: ...
12322
12396
  def trends_categories(self, **params: Unpack[GoogleTrendsCategoriesParams]) -> GoogleTrendsCategoriesResponse: ...
@@ -12330,6 +12404,7 @@ class GoogleGroup:
12330
12404
  def trends_locations(self, **params: Unpack[GoogleTrendsLocationsParams]) -> GoogleTrendsLocationsResponse: ...
12331
12405
  def trends_trending(self, **params: Unpack[GoogleTrendsTrendingParams]) -> GoogleTrendsTrendingResponse: ...
12332
12406
  def trends_trending_detail(self, **params: Unpack[GoogleTrendsTrendingDetailParams]) -> GoogleTrendsTrendingDetailResponse: ...
12407
+ def videos(self, **params: Unpack[GoogleVideosParams]) -> GoogleVideosResponse: ...
12333
12408
 
12334
12409
  class GooglePlayGroup:
12335
12410
  def app(self, **params: Unpack[GooglePlayAppParams]) -> GooglePlayAppResponse: ...
@@ -12697,6 +12772,7 @@ OperationId = Literal[
12697
12772
  'google-jobs',
12698
12773
  'google-map-place',
12699
12774
  'google-map-search',
12775
+ 'google-news',
12700
12776
  'google-search',
12701
12777
  'google-suggest',
12702
12778
  'google-trends-categories',
@@ -12710,6 +12786,7 @@ OperationId = Literal[
12710
12786
  'google-trends-locations',
12711
12787
  'google-trends-trending',
12712
12788
  'google-trends-trending-detail',
12789
+ 'google-videos',
12713
12790
  'googleplay-app',
12714
12791
  'googleplay-categories',
12715
12792
  'googleplay-datasafety',
@@ -14240,6 +14317,18 @@ class CrawloraClient:
14240
14317
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
14241
14318
  ) -> GoogleMapSearchResponse: ...
14242
14319
  @overload
14320
+ def operation(
14321
+ self,
14322
+ operation_id: Literal['google-news'],
14323
+ params: GoogleNewsParams,
14324
+ *,
14325
+ response_type: ResponseType = ...,
14326
+ timeout: float | None = ...,
14327
+ headers: Mapping[str, str] | None = ...,
14328
+ retries: int | None = ...,
14329
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
14330
+ ) -> GoogleNewsResponse: ...
14331
+ @overload
14243
14332
  def operation(
14244
14333
  self,
14245
14334
  operation_id: Literal['google-search'],
@@ -14396,6 +14485,18 @@ class CrawloraClient:
14396
14485
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
14397
14486
  ) -> GoogleTrendsTrendingDetailResponse: ...
14398
14487
  @overload
14488
+ def operation(
14489
+ self,
14490
+ operation_id: Literal['google-videos'],
14491
+ params: GoogleVideosParams,
14492
+ *,
14493
+ response_type: ResponseType = ...,
14494
+ timeout: float | None = ...,
14495
+ headers: Mapping[str, str] | None = ...,
14496
+ retries: int | None = ...,
14497
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
14498
+ ) -> GoogleVideosResponse: ...
14499
+ @overload
14399
14500
  def operation(
14400
14501
  self,
14401
14502
  operation_id: Literal['googleplay-app'],
@@ -18284,6 +18385,18 @@ class CrawloraClient:
18284
18385
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
18285
18386
  ) -> GoogleMapSearchResponse: ...
18286
18387
  @overload
18388
+ def request(
18389
+ self,
18390
+ operation_id: Literal['google-news'],
18391
+ params: GoogleNewsParams,
18392
+ *,
18393
+ response_type: ResponseType = ...,
18394
+ timeout: float | None = ...,
18395
+ headers: Mapping[str, str] | None = ...,
18396
+ retries: int | None = ...,
18397
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
18398
+ ) -> GoogleNewsResponse: ...
18399
+ @overload
18287
18400
  def request(
18288
18401
  self,
18289
18402
  operation_id: Literal['google-search'],
@@ -18440,6 +18553,18 @@ class CrawloraClient:
18440
18553
  retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
18441
18554
  ) -> GoogleTrendsTrendingDetailResponse: ...
18442
18555
  @overload
18556
+ def request(
18557
+ self,
18558
+ operation_id: Literal['google-videos'],
18559
+ params: GoogleVideosParams,
18560
+ *,
18561
+ response_type: ResponseType = ...,
18562
+ timeout: float | None = ...,
18563
+ headers: Mapping[str, str] | None = ...,
18564
+ retries: int | None = ...,
18565
+ retry_predicate: Callable[[int, BaseException | None], bool] | None = ...,
18566
+ ) -> GoogleVideosResponse: ...
18567
+ @overload
18443
18568
  def request(
18444
18569
  self,
18445
18570
  operation_id: Literal['googleplay-app'],
@@ -2640,6 +2640,22 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
2640
2640
  'produces': ['application/json'],
2641
2641
  'queryParams': [],
2642
2642
  'security': ['ApiKeyAuth']},
2643
+ 'google-news': {'bodyParam': None,
2644
+ 'bodyRequired': False,
2645
+ 'consumes': ['application/json'],
2646
+ 'formParams': [],
2647
+ 'id': 'google-news',
2648
+ 'method': 'GET',
2649
+ 'paginatable': True,
2650
+ 'path': '/google/news',
2651
+ 'pathParams': [],
2652
+ 'produces': ['application/json'],
2653
+ 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'},
2654
+ {'in': 'query', 'name': 'page', 'type': 'integer'},
2655
+ {'in': 'query', 'name': 'count', 'type': 'integer'},
2656
+ {'in': 'query', 'name': 'country', 'type': 'string'},
2657
+ {'in': 'query', 'name': 'lang', 'type': 'string'}],
2658
+ 'security': ['ApiKeyAuth']},
2643
2659
  'google-search': {'bodyParam': 'searchOption',
2644
2660
  'bodyRequired': True,
2645
2661
  'consumes': ['application/json'],
@@ -3086,6 +3102,22 @@ OPERATIONS = {'airbnb-room': {'bodyParam': None,
3086
3102
  'produces': ['application/json'],
3087
3103
  'queryParams': [],
3088
3104
  'security': ['ApiKeyAuth']},
3105
+ 'google-videos': {'bodyParam': None,
3106
+ 'bodyRequired': False,
3107
+ 'consumes': ['application/json'],
3108
+ 'formParams': [],
3109
+ 'id': 'google-videos',
3110
+ 'method': 'GET',
3111
+ 'paginatable': True,
3112
+ 'path': '/google/videos',
3113
+ 'pathParams': [],
3114
+ 'produces': ['application/json'],
3115
+ 'queryParams': [{'in': 'query', 'name': 'q', 'required': True, 'type': 'string'},
3116
+ {'in': 'query', 'name': 'page', 'type': 'integer'},
3117
+ {'in': 'query', 'name': 'count', 'type': 'integer'},
3118
+ {'in': 'query', 'name': 'country', 'type': 'string'},
3119
+ {'in': 'query', 'name': 'lang', 'type': 'string'}],
3120
+ 'security': ['ApiKeyAuth']},
3089
3121
  'googleplay-app': {'bodyParam': None,
3090
3122
  'bodyRequired': False,
3091
3123
  'consumes': ['application/json'],
@@ -6335,6 +6367,7 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6335
6367
  'jobs': 'google-jobs',
6336
6368
  'map_place': 'google-map-place',
6337
6369
  'map_search': 'google-map-search',
6370
+ 'news': 'google-news',
6338
6371
  'search': 'google-search',
6339
6372
  'suggest': 'google-suggest',
6340
6373
  'trends_categories': 'google-trends-categories',
@@ -6347,7 +6380,8 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6347
6380
  'trends_explore_top_queries': 'google-trends-explore-top-queries',
6348
6381
  'trends_locations': 'google-trends-locations',
6349
6382
  'trends_trending': 'google-trends-trending',
6350
- 'trends_trending_detail': 'google-trends-trending-detail'},
6383
+ 'trends_trending_detail': 'google-trends-trending-detail',
6384
+ 'videos': 'google-videos'},
6351
6385
  'google_play': {'app': 'googleplay-app',
6352
6386
  'categories': 'googleplay-categories',
6353
6387
  'datasafety': 'googleplay-datasafety',
@@ -6565,7 +6599,7 @@ GROUPS = {'airbnb': {'room': 'airbnb-room',
6565
6599
  'video': 'youtube-video'},
6566
6600
  'zillow': {'autocomplete': 'zillow-autocomplete', 'property': 'zillow-property', 'search': 'zillow-search'}}
6567
6601
 
6568
- OPERATION_COUNT = 336
6602
+ OPERATION_COUNT = 338
6569
6603
 
6570
6604
  class OperationId:
6571
6605
  AIRBNB_ROOM = 'airbnb-room'
@@ -6667,6 +6701,7 @@ class OperationId:
6667
6701
  GOOGLE_JOBS = 'google-jobs'
6668
6702
  GOOGLE_MAP_PLACE = 'google-map-place'
6669
6703
  GOOGLE_MAP_SEARCH = 'google-map-search'
6704
+ GOOGLE_NEWS = 'google-news'
6670
6705
  GOOGLE_PLAY_APP = 'googleplay-app'
6671
6706
  GOOGLE_PLAY_CATEGORIES = 'googleplay-categories'
6672
6707
  GOOGLE_PLAY_DATASAFETY = 'googleplay-datasafety'
@@ -6690,6 +6725,7 @@ class OperationId:
6690
6725
  GOOGLE_TRENDS_LOCATIONS = 'google-trends-locations'
6691
6726
  GOOGLE_TRENDS_TRENDING = 'google-trends-trending'
6692
6727
  GOOGLE_TRENDS_TRENDING_DETAIL = 'google-trends-trending-detail'
6728
+ GOOGLE_VIDEOS = 'google-videos'
6693
6729
  INSTAGRAM_POST = 'instagram-post'
6694
6730
  INSTAGRAM_PROFILE = 'instagram-profile'
6695
6731
  INSTAGRAM_REELS = 'instagram-reels'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlora
3
- Version: 1.6.0.dev1
3
+ Version: 1.6.0.dev3
4
4
  Summary: Official Python SDK for the Crawlora web-scraping API: typed grouped and dynamic operation calls for every public endpoint, with retries, pagination, hooks, and an async client.
5
5
  Author: Crawlora
6
6
  License-Expression: MIT
@@ -8,7 +8,7 @@ Project-URL: Homepage, https://crawlora.net/
8
8
  Project-URL: Documentation, https://crawlora.net/docs
9
9
  Project-URL: Repository, https://github.com/Crawlora-org/crawlora-python-sdk
10
10
  Project-URL: Issues, https://github.com/Crawlora-org/crawlora-python-sdk/issues
11
- Keywords: crawlora,sdk,web-scraping,api-client
11
+ Keywords: crawlora,crawlora-sdk,web-scraping,scraping,scraper,web-scraper,api,api-client,rest-api,rest-api-client,sdk,client,data-extraction,serp
12
12
  Classifier: Development Status :: 4 - Beta
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: Programming Language :: Python :: 3
@@ -2,7 +2,7 @@
2
2
 
3
3
  Generated from `openapi/public.json`. Deprecated, admin, and internal operations are excluded from this SDK contract.
4
4
 
5
- Total operations: `336`
5
+ Total operations: `338`
6
6
 
7
7
  | Group | SDK method | Operation ID | HTTP | Params | Auth | Response | Notes |
8
8
  | --- | --- | --- | --- | --- | --- | --- | --- |
@@ -105,6 +105,7 @@ Total operations: `336`
105
105
  | google | `google.jobs` | `google-jobs` | `POST /google/jobs` | `option` (body str required) | `ApiKeyAuth` | `GoogleJobsResponse` | |
106
106
  | google | `google.map_place` | `google-map-place` | `GET /google/map/place/{place_id}` | `place_id` (path str required) | `ApiKeyAuth` | `GoogleMapPlaceResponse` | |
107
107
  | google | `google.map_search` | `google-map-search` | `POST /google/map/search` | `mapSearchOption` (body str required) | `ApiKeyAuth` | `GoogleMapSearchResponse` | |
108
+ | google | `google.news` | `google-news` | `GET /google/news` | `q` (query str required)<br>`page` (query int)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `GoogleNewsResponse` | |
108
109
  | google | `google.search` | `google-search` | `POST /google/search` | `searchOption` (body str required) | `ApiKeyAuth` | `GoogleSearchResponse` | |
109
110
  | google | `google.suggest` | `google-suggest` | `GET /google/suggest` | `q` (query str required)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `GoogleSuggestResponse` | |
110
111
  | google | `google.trends_categories` | `google-trends-categories` | `GET /google/trends/categories` | none | `ApiKeyAuth` | `GoogleTrendsCategoriesResponse` | |
@@ -118,6 +119,7 @@ Total operations: `336`
118
119
  | google | `google.trends_locations` | `google-trends-locations` | `GET /google/trends/locations` | none | `ApiKeyAuth` | `GoogleTrendsLocationsResponse` | |
119
120
  | google | `google.trends_trending` | `google-trends-trending` | `GET /google/trends/trending` | `geo` (query Literal['AF', 'AX', 'AL', 'DZ', 'AS', 'AD', 'AO', 'AI', 'AQ', 'AG', 'AR', 'AM', 'AW', 'AU', 'AT', 'AZ', 'BS', 'BH', 'BD', 'BB', 'BY', 'BE', 'BZ', 'BJ', 'BM', 'BT', 'BO', 'BA', 'BW', 'BV', 'BR', 'IO', 'VG', 'BN', 'BG', 'BF', 'BI', 'KH', 'CM', 'CA', 'CV', 'BQ', 'KY', 'CF', 'TD', 'CL', 'CN', 'CX', 'CC', 'CO', 'KM', 'CG', 'CD', 'CK', 'CR', 'CI', 'HR', 'CU', 'CW', 'CY', 'CZ', 'DK', 'DJ', 'DM', 'DO', 'EC', 'EG', 'SV', 'GQ', 'ER', 'EE', 'SZ', 'ET', 'FK', 'FO', 'FJ', 'FI', 'FR', 'GF', 'PF', 'TF', 'GA', 'GM', 'GE', 'DE', 'GH', 'GI', 'GR', 'GL', 'GD', 'GP', 'GU', 'GT', 'GG', 'GN', 'GW', 'GY', 'HT', 'HM', 'HN', 'HK', 'HU', 'IS', 'IN', 'ID', 'IR', 'IQ', 'IE', 'IM', 'IL', 'IT', 'JM', 'JP', 'JE', 'JO', 'KZ', 'KE', 'KI', 'XK', 'KW', 'KG', 'LA', 'LV', 'LB', 'LS', 'LR', 'LY', 'LI', 'LT', 'LU', 'MO', 'MG', 'MW', 'MY', 'MV', 'ML', 'MT', 'MH', 'MQ', 'MR', 'MU', 'YT', 'MX', 'FM', 'MD', 'MC', 'MN', 'ME', 'MS', 'MA', 'MZ', 'MM', 'NA', 'NR', 'NP', 'NL', 'NC', 'NZ', 'NI', 'NE', 'NG', 'NU', 'NF', 'KP', 'MK', 'MP', 'NO', 'OM', 'PK', 'PW', 'PS', 'PA', 'PG', 'PY', 'PE', 'PH', 'PN', 'PL', 'PT', 'PR', 'QA', 'RE', 'RO', 'RU', 'RW', 'WS', 'SM', 'ST', 'SA', 'SN', 'RS', 'SC', 'SL', 'SG', 'SX', 'SK', 'SI', 'SB', 'SO', 'ZA', 'GS', 'KR', 'SS', 'ES', 'LK', 'BL', 'SH', 'KN', 'LC', 'MF', 'PM', 'VC', 'SD', 'SR', 'SJ', 'SE', 'CH', 'SY', 'TW', 'TJ', 'TZ', 'TH', 'TL', 'TG', 'TK', 'TO', 'TT', 'TN', 'TR', 'TM', 'TC', 'TV', 'UM', 'VI', 'UG', 'UA', 'AE', 'GB', 'US', 'UY', 'UZ', 'VU', 'VA', 'VE', 'VN', 'WF', 'EH', 'YE', 'ZM', 'ZW'])<br>`hl` (query str)<br>`tz` (query int)<br>`window` (query Literal['4h', '24h', '48h', '7d'])<br>`time_range` (query Literal['4h', '24h', '48h', '7d'])<br>`category` (query Literal['0', '3', '47', '44', '22', '12', '5', '7', '71', '8', '45', '65', '11', '13', '958', '19', '16', '299', '14', '66', '29', '533', '174', '18', '20', '67'])<br>`status` (query Literal['all', 'active', 'ended'])<br>`sort_by` (query Literal['relevance', 'title', 'recency', 'search_volume'])<br>`limit` (query int) | `ApiKeyAuth` | `GoogleTrendsTrendingResponse` | |
120
121
  | google | `google.trends_trending_detail` | `google-trends-trending-detail` | `POST /google/trends/trending/detail` | `request` (body str required) | `ApiKeyAuth` | `GoogleTrendsTrendingDetailResponse` | |
122
+ | google | `google.videos` | `google-videos` | `GET /google/videos` | `q` (query str required)<br>`page` (query int)<br>`count` (query int)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `GoogleVideosResponse` | |
121
123
  | google_play | `google_play.app` | `googleplay-app` | `GET /googleplay/app` | `app_id` (query str required)<br>`country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `GooglePlayAppResponse` | |
122
124
  | google_play | `google_play.categories` | `googleplay-categories` | `GET /googleplay/categories` | `country` (query str)<br>`lang` (query str) | `ApiKeyAuth` | `GooglePlayCategoriesResponse` | |
123
125
  | google_play | `google_play.datasafety` | `googleplay-datasafety` | `GET /googleplay/datasafety` | `app_id` (query str required)<br>`lang` (query str) | `ApiKeyAuth` | `GooglePlayDatasafetyResponse` | |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "crawlora"
7
- version = "1.6.0.dev1"
7
+ version = "1.6.0.dev3"
8
8
  description = "Official Python SDK for the Crawlora web-scraping API: typed grouped and dynamic operation calls for every public endpoint, with retries, pagination, hooks, and an async client."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -13,7 +13,22 @@ license-files = ["LICENSE"]
13
13
  authors = [
14
14
  { name = "Crawlora" },
15
15
  ]
16
- keywords = ["crawlora", "sdk", "web-scraping", "api-client"]
16
+ keywords = [
17
+ "crawlora",
18
+ "crawlora-sdk",
19
+ "web-scraping",
20
+ "scraping",
21
+ "scraper",
22
+ "web-scraper",
23
+ "api",
24
+ "api-client",
25
+ "rest-api",
26
+ "rest-api-client",
27
+ "sdk",
28
+ "client",
29
+ "data-extraction",
30
+ "serp",
31
+ ]
17
32
  classifiers = [
18
33
  "Development Status :: 4 - Beta",
19
34
  "Intended Audience :: Developers",
@@ -267,7 +267,7 @@ class CrawloraClientTest(unittest.TestCase):
267
267
  self.assertIs(raised.exception.__cause__, cause)
268
268
 
269
269
  def test_operation_metadata_count(self):
270
- self.assertEqual(OPERATION_COUNT, 336)
270
+ self.assertEqual(OPERATION_COUNT, 338)
271
271
 
272
272
  def test_deprecated_endpoints_are_not_generated(self):
273
273
  self.assertFalse(hasattr(CrawloraClient(api_key="api_test", base_url=self.base_url).google, "lens"))
@@ -296,7 +296,7 @@ class CrawloraClientTest(unittest.TestCase):
296
296
  recipes_doc = root.joinpath("docs", "recipes.md").read_text()
297
297
 
298
298
  for expected in [
299
- "Total operations: `336`",
299
+ "Total operations: `338`",
300
300
  "`bing-search`",
301
301
  "`GET /bing/search`",
302
302
  "`bing.search`",
File without changes
File without changes
File without changes
File without changes