📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что результаты поиска на Mac полностью отличаются от результатов на PC. На скриншотах ниже показана разница:
Есть несколько причин, по которым можно использовать API, в частности наш:
SerpApi обрабатывает все на бэкенде с быстрым временем ответа менее ~2,6 секунды (~0,6 секунды с Ludicrous speed) на запрос и без автоматизации браузера, который становится намного быстрее. Время отклика и статус показаны на странице SerpApi Status .
Если вам не нужны объяснения, посмотрите полный пример кода в онлайн IDE .
from serpapi import GoogleSearch import json params = { 'api_key': '...', # https://serpapi.com/manage-api-key 'engine': 'apple_app_store', # SerpApi search engine 'term': 'image viewer', # search query 'device': 'desktop', # device to get the results 'country': 'us', # country for the search 'lang': 'en-us', # language for the search 'disallow_explicit': False, # disallowing explicit apps 'num': 20, # number of items per page 'page': 0, # pagination # 'property': 'developer' # developer of an app } app_store_results = [] while True: search = GoogleSearch(params) # data extraction on the SerpApi backend new_page_results = search.get_dict() # JSON -> Python dict app_store_results.extend(new_page_results['organic_results']) if 'next' in new_page_results.get('serpapi_pagination', {}): params['page'] += 1 else: break print(json.dumps(app_store_results, indent=2, ensure_ascii=False))
Установите библиотеку:
pip install google-search-results
google-search-results - это пакет SerpApi API.
Импортируйте библиотеки:
from serpapi import GoogleSearch import json
Параметры определены для генерации URL. Если вы хотите передать в URL другие параметры, вы можете сделать это с помощью словаря params:
params = { 'api_key': '...', # https://serpapi.com/manage-api-key 'engine': 'apple_app_store', # SerpApi search engine 'term': 'image viewer', # search query 'device': 'desktop', # device to get the results 'country': 'us', # country for the search 'lang': 'en-us', # language for the search 'disallow_explicit': False, # disallowing explicit apps 'num': 20, # number of items per page 'page': 0, # pagination # 'property': 'developer' # developer of an app }
📌Примечание: Вы также можете добавить другие параметры API .
Определите список app_store_results, в который будут добавлены извлеченные данные:
app_store_results = []
Создается цикл while, необходимый для извлечения данных со всех страниц:
while True: # data extraction will be here
Затем мы создаем объект поиска, в котором данные извлекаются из бэкенда SerpApi. В словарь new_page_results мы получаем данные из JSON:
search = GoogleSearch(params) # data extraction on the SerpApi backend new_page_results = search.get_dict() # JSON -> Python dict
Добавляем новые данные с этой страницы в список app_store_results:
app_store_results.extend(new_page_results['organic_results']) # title = new_page_results['organic_results'][0]['title'] # version = new_page_results['organic_results'][0]['version'] # description = new_page_results['organic_results'][0]['description']
📌Примечание: В комментариях выше я показал, как извлекать определенные поля. Возможно, вы заметили new_page_results['organic_results'][0]. Это индекс продукта, что означает, что мы извлекаем данные из первого продукта. New_page_results['organic_results'][1] - из второго продукта и так далее.
После получения данных с текущей страницы выполняется проверка, существует ли следующая страница. Если таковая имеется в словаре serpapi_pagination, то параметр page увеличивается на 1. В противном случае цикл останавливается.
if 'next' in new_page_results.get('serpapi_pagination', {}): params['page'] += 1 else: break
После того, как все данные получены, они выводятся в формате JSON:
print(json.dumps(app_store_results, indent=2, ensure_ascii=False))
[ { "position": 1, "id": 1507782672, "title": "Pixea", "bundle_id": "imagetasks.Pixea", "version": "2.1", "vpp_license": true, "age_rating": "4+", "release_note": "- New \"Fixed Size and Position\" zoom mode - Fixed a bug causing crash when browsing ZIP-files - Bug fixes and improvements", "seller_link": "https://www.imagetasks.com", "minimum_os_version": "10.12", "description": "Pixea is an image viewer for macOS with a nice minimal modern user interface. Pixea works great with JPEG, HEIC, PSD, RAW, WEBP, PNG, GIF, and many other formats. Provides basic image processing, including flip and rotate, shows a color histogram, EXIF, and other information. Supports keyboard shortcuts and trackpad gestures. Shows images inside archives, without extracting them. Supported formats: JPEG, HEIC, GIF, PNG, TIFF, Photoshop (PSD), BMP, Fax images, macOS and Windows icons, Radiance images, Google's WebP. RAW formats: Leica DNG and RAW, Sony ARW, Olympus ORF, Minolta MRW, Nikon NEF, Fuji RAF, Canon CR2 and CRW, Hasselblad 3FR. Sketch files (preview only). ZIP-archives. Export formats: JPEG, JPEG-2000, PNG, TIFF, BMP. Found a bug? Have a suggestion? Please, send it to [email protected] Follow us on Twitter @imagetasks!", "link": "https://apps.apple.com/us/app/pixea/id1507782672?mt=12&uo=4", "serpapi_product_link": "https://serpapi.com/search.json?country=us&engine=apple_product&product_id=1507782672&type=app", "serpapi_reviews_link": "https://serpapi.com/search.json?country=us&engine=apple_reviews&page=1&product_id=1507782672", "release_date": "2020-04-20 07:00:00 UTC", "price": { "type": "Free" }, "rating": [ { "type": "All Times", "rating": 0.0, "count": 0 } ], "genres": [ { "name": "Photo & Video", "id": 6008, "primary": true }, { "name": "Graphics & Design", "id": 6027, "primary": false } ], "developer": { "name": "ImageTasks Inc", "id": 450316587, "link": "https://apps.apple.com/us/developer/id450316587" }, "size_in_bytes": 7113871, "supported_languages": [ "EN" ], "screenshots": { "general": [ { "link": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/e0/21/86/e021868d-b43b-0a78-8d4a-e4e0097a1d01/0131f1c2-3227-46bf-8328-7b147d2b1ea2_Pixea-1.jpg/800x500bb.jpg", "size": "800x500" }, { "link": "https://is4-ssl.mzstatic.com/image/thumb/Purple113/v4/55/3c/98/553c982d-de30-58b5-3b5a-d6b3b2b6c810/a0424c4d-4346-40e6-8cde-bc79ce690040_Pixea-2.jpg/800x500bb.jpg", "size": "800x500" }, { "link": "https://is3-ssl.mzstatic.com/image/thumb/Purple123/v4/77/d7/d8/77d7d8c1-4b4c-ba4b-4dde-94bdc59dfb71/6e66509c-5886-45e9-9e96-25154a22fd53_Pixea-3.jpg/800x500bb.jpg", "size": "800x500" }, { "link": "https://is3-ssl.mzstatic.com/image/thumb/PurpleSource113/v4/44/79/91/447991e0-518f-48b3-bb7e-c7121eb57ba4/79be2791-5b93-4c4d-b4d1-38a3599c2b2d_Pixea-4.jpg/800x500bb.jpg", "size": "800x500" } ] }, "logos": [ { "size": "60x60", "link": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/8a/a7/f7/8aa7f75f-620b-74d5-7958-35aa5d851582/AppIcon-0-0-85-220-0-0-0-0-4-0-0-0-2x-sRGB-0-0-0-0-0.png/60x60bb.png" }, { "size": "512x512", "link": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/8a/a7/f7/8aa7f75f-620b-74d5-7958-35aa5d851582/AppIcon-0-0-85-220-0-0-0-0-4-0-0-0-2x-sRGB-0-0-0-0-0.png/512x512bb.png" }, { "size": "100x100", "link": "https://is3-ssl.mzstatic.com/image/thumb/Purple113/v4/8a/a7/f7/8aa7f75f-620b-74d5-7958-35aa5d851582/AppIcon-0-0-85-220-0-0-0-0-4-0-0-0-2x-sRGB-0-0-0-0-0.png/100x100bb.png" } ] }, ... other results ]
Первоначально опубликовано на SerpApi: https://serpapi.com/blog/scraping-apple-app-store-search-with-python/
Присоединяйтесь к нам на Twitter | YouTube
Добавить запрос на улучшение 💫 или ошибку🐞
20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".
20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!
18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.
14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.