Скраппинг поиска Apple App Store с помощью Python

RedDeveloper
05.02.2023 12:54
Скраппинг поиска Apple App Store с помощью Python

Что будет соскабливаться

📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что результаты поиска на Mac полностью отличаются от результатов на PC. На скриншотах ниже показана разница:

  • Результаты Mac:
📌Примечание В этой статье я покажу вам как скрапировать поиск Apple App Store и получить
  • Результаты ПК:
📌Примечание В этой статье я покажу вам как скрапировать поиск Apple App Store и получить

Зачем использовать API?

Есть несколько причин, по которым можно использовать API, в частности наш:

  • Нет необходимости создавать парсер с нуля и поддерживать его.
  • Обходить блокировки от Google: решать CAPTCHA или решать блокировки по IP.
  • Платить за прокси и решатели CAPTCHA.
  • Не нужно использовать автоматизацию браузера.

SerpApi обрабатывает все на бэкенде с быстрым временем ответа менее ~2,6 секунды (~0,6 секунды с Ludicrous speed) на запрос и без автоматизации браузера, который становится намного быстрее. Время отклика и статус показаны на странице SerpApi Status .

SerpApi обрабатывает все на бэкенде с быстрым временем ответа менее ~26 секунды (~06

Полный код

Если вам не нужны объяснения, посмотрите полный пример кода в онлайн 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
  • GoogleSearch для соскабливания и разбора результатов Google с помощью SerpApi библиотеки веб-скрейпинга.
  • json для преобразования извлеченных данных в объект 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_key Параметр определяет закрытый ключ SerpApi, который необходимо использовать. Вы можете найти его в разделе ваш аккаунт -> API ключ .
  • движок Установите параметр apple_app_store для использования движка App Store API.
  • термин Параметр определяет запрос, который вы хотите найти. Вы можете использовать любой поисковый термин, который вы бы использовали при обычном поиске в App Store.
  • устройство Параметр определяет устройство, которое будет использоваться для получения результатов. Он может быть установлен как настольный, чтобы использовать Mac App Store, планшетный, чтобы использовать iPad App Store, или мобильный (по умолчанию), чтобы использовать iPhone App Store.
  • страна Параметр определяет страну, которую следует использовать для поиска. Это двухбуквенный код страны. Полный список поддерживаемых регионов Apple смотрите в разделе Регионы Apple .
  • lang Параметр определяет язык, который будет использоваться для поиска. Это четырехбуквенный код страны. Полный список поддерживаемых языков Apple смотрите в разделе Языки Apple .
  • disallow_explicit Параметр определяет фильтр для запрета явных приложений. По умолчанию он имеет значение false.
  • num Параметр определяет количество результатов, которые вы хотите получить на каждой странице. По умолчанию он равен 10. Максимальное количество результатов, которое вы можете получить на странице, - 200.
  • page Параметр используется для получения элементов на определенной странице. (например, 0 (по умолчанию) - первая страница результатов, 1 - вторая страница результатов, 2 - третья страница результатов и т.д.).
  • property Параметр позволяет искать свойство приложения. developer позволяет искать название разработчика приложения (например, property=developer и term=Coffee выдает приложения с "Coffee" в названии разработчика. (Например: Coffee Inc.)

📌Примечание: Вы также можете добавить другие параметры 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
]

Ссылки

  • Код в онлайн IDE
  • Apple App Store Search Scraper API
  • Apple App Store Search Scraper API Playground

Первоначально опубликовано на SerpApi: https://serpapi.com/blog/scraping-apple-app-store-search-with-python/

Присоединяйтесь к нам на Twitter | YouTube

Добавить запрос на улучшение 💫 или ошибку🐞

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.