Как получить доступ к Android Play Store для всех стран?

Я делаю макрос для извлечения информации приложений Android из Google Play Store. Мой клиент требует все детали приложений для Android в мире. Я остаюсь в Индии, так как не могу получить доступ к приложениям других стран.

Пожалуйста, помогите мне получить доступ к приложениям Google Play для всей страны.

Я использую селеин для выскабливания.

2 ответа

Поиск в Интернете о вашей проблеме, я обнаружил, что вы можете получить доступ к Google Play Store других стран с помощью приложения VPN.

Посмотрев эту страницу, вы увидите основные инструкции о том, как это сделать.

Также вы можете попробовать решение в этом вопросе, просто добавив параметр gl=(countrycode) в URL.

Например: https://play.google.com/store/apps/category/BUSINESS/collection/topselling_free

добавив gl=ru, вы получите игровой магазин для России:

https://play.google.com/store/apps/category/BUSINESS/collection/topselling_free?gl=ru

Google Play недавно изменил пользовательский интерфейс и структуру ссылок и отображения информации. Недавно я написал блог Scrape Google Play Search Apps in Python, где подробно описал весь процесс с дополнительными данными.

Чтобы получить доступ ко всемcountries, вам нужно пройтиcountry_codeк'gl'параметр . Вы можете найти полный список стран, поддерживаемых Google Play .

Например, я выбрал 3 страны из этого списка, чтобы показать, как работает мой скрипт:

      from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from parsel import Selector
import time, json

countries = [
    {
        "country_code": "us",
        "country_name": "United States"
    },
    {
        "country_code": "uk",
        "country_name": "United Kingdom"
    },
    {
        "country_code": "ua",
        "country_name": "Ukraine"
    }
]

Для каждогоcountry, генерируется отдельный запрос:

      for country in countries:
    params = {
        'hl': 'en_GB',                  # language 
        'gl': country['country_code'],  # country of the search
    }

    URL = f"https://play.google.com/store/apps?hl={params['hl']}&gl={params['gl']}"

    service = Service(ChromeDriverManager().install())

    options = webdriver.ChromeOptions()
    options.add_argument("--headless")
    options.add_argument("--lang=en")
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    driver = webdriver.Chrome(service=service, options=options)

    driver.get(URL)

После этого идет процесс прокрутки страницы, чтобы получить все приложения:

      while True:
    try:
        driver.execute_script("document.querySelector('.snByac').click();")
        time.sleep(2)
        break
    except:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)

The parcelбиблиотека использовалась для извлечения данных:

      selector = Selector(driver.page_source)
driver.quit()

data = {
    'country': country['country_name'],
    'apps': []
}

for app in selector.css('.UVEnyf'):
    title = app.css('.Epkrse::text').get()
    link = 'https://play.google.com' + app.css('.Si6A0c::attr(href)').get()
    rating = app.css('.LrNMN::text').get()
    rating = float(rating) if rating else rating
    thumbnail = app.css('.Q8CSx::attr(srcset)').get().replace(' 2x', '')

    data['apps'].append({
        'title': title,
        'link': link,
        'rating': rating,
        'thumbnail': thumbnail,
    })

google_play_apps.append(data)

Код и полный пример в онлайн-IDE.

Выход:

      [
  {
    "country": "United States",
    "apps": [
      {
        "title": "WhatsApp Messenger",
        "link": "https://play.google.com/store/apps/details?id=com.whatsapp",
        "rating": 4.3,
        "thumbnail": "https://play-lh.googleusercontent.com/bYtqbOcTYOlgc6gqZ2rwb8lptHuwlNE75zYJu6Bn076-hTmvd96HH-6v7S0YUAAJXoJN=s512-rw"
      },
      {
        "title": "TikTok",
        "link": "https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically",
        "rating": 4.4,
        "thumbnail": "https://play-lh.googleusercontent.com/OS-MhSWOPtlUZLt0_UP5TI4juSf0XhyHxGfJa6pA-UIYkZ1BB6QHTZwaMEzZDPqYsmk=s512-rw"
      },
      {
        "title": "Gmail",
        "link": "https://play.google.com/store/apps/details?id=com.google.android.gm",
        "rating": 4.2,
        "thumbnail": "https://play-lh.googleusercontent.com/KSuaRLiI_FlDP8cM4MzJ23ml3og5Hxb9AapaGTMZ2GgR103mvJ3AAnoOFz1yheeQBBI=s512-rw"
      },
      ... other apps
    ]
  },
  {
    "country": "United Kingdom",
    "apps": [
      {
        "title": "WhatsApp Messenger",
        "link": "https://play.google.com/store/apps/details?id=com.whatsapp",
        "rating": 4.3,
        "thumbnail": "https://play-lh.googleusercontent.com/bYtqbOcTYOlgc6gqZ2rwb8lptHuwlNE75zYJu6Bn076-hTmvd96HH-6v7S0YUAAJXoJN=s512-rw"
      },
      {
        "title": "TikTok: Videos, Music & LIVE",
        "link": "https://play.google.com/store/apps/details?id=com.zhiliaoapp.musically",
        "rating": 4.4,
        "thumbnail": "https://play-lh.googleusercontent.com/DkTxmSymkcxHiady0xd_JsIxLLg0f1ducCtMTpO8El-kTW7VF1gCC6ZzhgTgTGwEqqI=s512-rw"
      },
      {
        "title": "Instagram",
        "link": "https://play.google.com/store/apps/details?id=com.instagram.android",
        "rating": 3.7,
        "thumbnail": "https://play-lh.googleusercontent.com/VRMWkE5p3CkWhJs6nv-9ZsLAs1QOg5ob1_3qg-rckwYW7yp1fMrYZqnEFpk0IoVP4LM=s512-rw"
      },
      ... other apps
    ]
  },
  {
    "country": "Ukraine",
    "apps": [
      {
        "title": "WhatsApp Messenger",
        "link": "https://play.google.com/store/apps/details?id=com.whatsapp",
        "rating": 4.3,
        "thumbnail": "https://play-lh.googleusercontent.com/bYtqbOcTYOlgc6gqZ2rwb8lptHuwlNE75zYJu6Bn076-hTmvd96HH-6v7S0YUAAJXoJN=s512-rw"
      },
      {
        "title": "Telegram",
        "link": "https://play.google.com/store/apps/details?id=org.telegram.messenger",
        "rating": 3.9,
        "thumbnail": "https://play-lh.googleusercontent.com/ZU9cSsyIJZo6Oy7HTHiEPwZg0m2Crep-d5ZrfajqtsH-qgUXSqKpNA2FpPDTn-7qA5Q=s512-rw"
      },
      {
        "title": "Instagram",
        "link": "https://play.google.com/store/apps/details?id=com.instagram.android",
        "rating": 4.0,
        "thumbnail": "https://play-lh.googleusercontent.com/VRMWkE5p3CkWhJs6nv-9ZsLAs1QOg5ob1_3qg-rckwYW7yp1fMrYZqnEFpk0IoVP4LM=s512-rw"
      },
      ... other apps
    ]
  }
]

Кроме того, вы можете использовать API магазина приложений Google Play от SerpApi. Он будет обходить блокировки со стороны поисковых систем, и вам не придется создавать парсер с нуля и поддерживать его.

Пример кода:

      from serpapi import GoogleSearch
from urllib.parse import urlsplit, parse_qsl
import os, json

countries = [
    {
        "country_code": "us",
        "country_name": "United States"
    },
    {
        "country_code": "uk",
        "country_name": "United Kingdom"
    },
    {
        "country_code": "ua",
        "country_name": "Ukraine"
    }
]

google_play_apps = []
    
for country in countries:
    params = {
        # https://docs.python.org/3/library/os.html#os.getenv
        'api_key': os.getenv('API_KEY'),    # your serpapi api
        'engine': 'google_play',            # SerpApi search engine
        'store': 'apps',                    # Google Play Apps
        'hl': 'en',                         # language 
        'gl': country['country_code'],      # country of the search
    }
    search = GoogleSearch(params)           # where data extraction happens on the SerpApi backend
    
    data = {
        'country': country['country_name'],
        'apps': []
    }
    
    while True:
        result_dict = search.get_dict()     # JSON -> Python dict

        if result_dict.get('organic_results') is None: break
            
        for result in result_dict.get('organic_results'):
            for item in result['items']:
                data['apps'].append(item)

        google_play_apps.append(data)

        if 'next' in result_dict.get('serpapi_pagination', {}):
            search.params_dict.update(dict(parse_qsl(urlsplit(result_dict.get('serpapi_pagination').get('next')).query)))
        else:
            break

print(json.dumps(google_play_apps, indent=2, ensure_ascii=False))

Выход будет таким же.

Другие вопросы по тегам