Scrapy: не удается обойти страницу отзывов App Store

#python #ios #web-scrapin& #scrapy #app-store

#python #iOS #очистка веб-страниц #scrapy #app-store

Вопрос:

Привет, ребята, у меня возникли некоторые проблемы с получением данных с этой страницы из App Store: обзоры App Storehttps://apps.apple.com/us/app/mathy-cool-math-learner-&ames/id1476596747#see-all/reviews

Сначала я хочу получить строку, показывающую оценки, которые пользователь дает приложению. И они находятся внутри тега fi&ure с class = «we-star-ratin& ember-view we-customer-review__ratin& we-star-ratin&—lar&e» и являются именем атрибута @aria-label.

страница отзывов о приложении

Вот мой код:

 from scrapy import Selector
import requests

html = requests.&et('https://apps.apple.com/us/app/mathy-cool-math-learner-&ames/id1476596747#see-all/reviews').content

sel = Selector(text = html)

sel.xpath('//fi&ure[@class="we-star-ratin& ember-view we-customer-review__ratin& we-star-ratin&--lar&e"]/@aria-label').extract()

  

Но он возвращает только первые 3 совпадения:

 ['5 out of 5', '5 out of 5', '5 out of 5']
  

Я хочу получить все оценки, доступные из всех обзоров на этой странице.

Кто-нибудь может дать мне подсказку по этому поводу?

Ответ №1:

Проблема

Три лучших отзыва загружаются как часть HTML, а остальные загружаются с помощью javascript. Именно поэтому вы получаете только первые три результата.

Я не совсем уверен, весь ли это код, который у вас есть для использования scrapy. Мне было бы интересно, почему вы выбрали эту часть scrapy.

Таким образом, работа с javascript является важной частью веб-очистки современных веб-сайтов. Я не совсем уверен, используете ли вы scrapy в основном для webscrape. Однако есть несколько вариантов обработки javascript с помощью scrapy.

Информация о динамической очистке веб-страниц

Во-первых, зная, что веб-сайты в наши дни получают информацию «на лету», используя javascript для вызова HTTP-запросов, называемых AJAX-запросом (асинхронный Javascript и XHTML). При этом либо отправляется HTTP-запрос post, либо &et к API / серверу, и этот HTTP-ответ возвращает информацию. В этом случае они предварительно загрузили 3 результата в HTML, но запросили остальные отзывы при загрузке страницы с помощью javascript.

В общем, есть два способа работы с веб-сайтами, ориентированными на javascript.

  1. Перепроектируйте HTTP-запросы — это самый эффективный способ получить нужные данные. Вы хотите имитировать эти HTTP-запросы, которые вызывает javascript. Если вы можете это сделать, а для этого иногда требуется публиковать заголовки, параметры и файлы cookie, тогда вы сможете получить нужные данные.
  2. Использование какой-либо формы автоматизации браузера. Предпочтительным пакетом является Selenium, хотя изначально он никогда не предназначался для использования таким образом. Это медленно, неэффективно и хрупко при использовании больших наборов данных.

Решение

Для вашего конкретного веб-сайта вы можете перепроектировать HTTP-запросы, чтобы получить нужную информацию. Это идеальная ситуация.

Но откуда я это знал? Ну, одна из вещей, которые вы можете сделать в Chrome, это отключить javascript. Вы должны просмотреть страницу и перейти к настройкам (нажмите на три точки в самой правой части страницы -&&t; дополнительные инструменты -&&t; настройки). Обновите страницу без javascript. Вы увидите, что доступно для просмотра только три обзора.

Понять, что происходит, с помощью инструментов ChromeDev очень информативно. Если вы перейдете на вкладку сеть при щелчке правой кнопкой мыши и просмотрите страницу, вы увидите все запросы и ответы, сделанные сервером. Перейдя на вкладку XHR, вы найдете сделанные запросы, содержащие нужные вам данные. Здесь у вас есть куча запросов и ответов.

Смотрите рисунок ниже, я проверил страницу, зашел в сеть и обновил страницу. Здесь записывается активность запросов и ответов браузера.

Вы можете видеть, что существует около 6 запросов, 5 запросов GET и один запрос POST. Если вы нажмете на каждый запрос, вы увидите всплывающее окно с правой стороны с данными запроса, предварительным просмотром и ответом.

Здесь я нажал на первый запрос, я нажал предварительный просмотр, и вы можете увидеть, если кликнете, что есть какие-то обзоры.

Я вижу, что в HTTP-запросе для этих данных есть смещение в 10, что означает, что он обрабатывает следующие 10 запросов.

Итак, я собираюсь изменить это смещение, чтобы посмотреть, смогу ли я получить первые 10, а затем и вторые 10 (на этой странице 20 отзывов).

Без необходимости вручную вводить параметры, заголовки и т.д… Вы можете скопировать запрос в CURL. Затем это можно преобразовать с помощью сайта, подобного curl.trillworks.com , в удобный формат python.

Теперь стоит взглянуть на данные предварительного просмотра, потому что для их обработки вам придется использовать запросы. В итоге вы получите объект JSON, вы можете определить это по части принятия HTTP-запроса &et application/json .

Итак, скопировав этот запрос в curl.trillworks.com. У нас есть следующее.

Пример кодирования

 import requests

headers = {
    'Accept': 'application/json',
    'Referer': 'https://apps.apple.com/us/app/mathy-cool-math-learner-&ames/id1476596747',
    'Authorization': 'Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IldlYlBsYXlLaWQifQ.eyJpc3MiOiJBTVBXZWJQbGF5IiwiaWF0IjoxNTk2NTc1NTY4LCJleHAiOjE2MTIxMjc1Njh9.jnEuBNEVWhKGqI10W6dfhJFtYJtd74Nbu1NueZrP&YjU2K34LwXPQClcus8S9Jit5ayK5MOr0bIpcDx821RI4Q',
    'User-A&ent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}

params = (
    ('l', 'en-US'),
    ('offset', '1'),
    ('platform', 'web'),
    ('additionalPlatforms', 'appletv,ipad,iphone,mac'),
)

response = requests.&et('https://amp-api.apps.apple.com/v1/catalo&/us/apps/1476596747/reviews', headers=headers params=params)
response.json()
  

Я упоминал выше, что иногда вам нужны заголовки и параметры. Вы можете поиграть с методом запроса &et здесь, посмотреть, что дает вам данные. В этом случае вам понадобятся параметры и заголовки. Это не всегда так, и поэтому вы всегда должны делать простой request.&et() без чего-либо, а затем создавать его. json() Метод форматирует объект json в словарь python, чтобы мы могли легко получить доступ к данным.

Теперь, когда я сказал, что просмотр предварительного просмотра дает нам ключи и значения, необходимые для доступа к данным. Иногда данные могут быть вложены очень глубоко. В данном случае это не так, поэтому теперь мы думаем о циклическом просмотре этого словаря, чтобы получить все нужные нам данные. Мы должны выполнить два HTTP-запроса, один со смещением 0 и один со смещением 10, чтобы получить полные 20 звездочных оценок.

Окончательный пример кода

 import requests

headers = {
    'Accept': 'application/json',
    'Referer': 'https://apps.apple.com/us/app/mathy-cool-math-learner-&ames/id1476596747',
    'Authorization': 'Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6IldlYlBsYXlLaWQifQ.eyJpc3MiOiJBTVBXZWJQbGF5IiwiaWF0IjoxNTk2NTc1NTY4LCJleHAiOjE2MTIxMjc1Njh9.jnEuBNEVWhKGqI10W6dfhJFtYJtd74Nbu1NueZrP&YjU2K34LwXPQClcus8S9Jit5ayK5MOr0bIpcDx821RI4Q',
    'User-A&ent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}
for i in ran&e(0,20,10):
    
    params = (
        ('l', 'en-US'),
        ('offset', f'{i}'),
        ('platform', 'web'),
        ('additionalPlatforms', 'appletv,ipad,iphone,mac'),
    )
    response = requests.&et('https://amp-api.apps.apple.com/v1/catalo&/us/apps/1476596747/reviews', params=params)
    data =  response.json()['data']
    for a in data:
        print(a['attributes']['ratin&'])
  

Вывод

 5
5
5
5
5
...
  

Объяснение кода

  1. Мы используем заголовки, необходимые для выполнения запроса (мне удалось получить данные без этого, но при попытке получить все данные, казалось, нужны заголовки, хотя с этим можно поиграть)

  2. Мы зацикливаем необходимые параметры, в данном случае мы хотим иметь смещение 0, 10. Поэтому мы используем ran&e(0,20,10) , чтобы получить это. Для каждого параметра мы создаем HTTP &et-запрос с заголовками и этими конкретными параметрами.

  3. Мы преобразуем ответ в словарь python с помощью response.json()

  4. Если вы выведете это, мы увидим много данных, мы должны находиться в data ключе, как показано ниже. Если вы распечатаете это, вы получите результат ниже.

    data = response.json()[‘data’] печать (данные)

Вывод

 {'id': '5632394152',
 'type': 'user-reviews',
 'attributes': {'review': "I really like it. I have been usin& a memory trainer, but this one is a little bit more fun. I had to learn my skills the hard way so to speak, but it is really fun! I can't wait to buy it a&ain! 😁🤓",
  'ratin&': 5,
  'title': 'Cow force than',
  'date': '2020-03-08T11:37:29Z',
  'userName': 'MY VICELER',
  'isEdited': False}}
  
  1. Итак, вы можете видеть, что на самом деле нужные нам данные находятся за attributes ключом, а затем за ratin& key . Следовательно, мы хотим выполнить цикл response.json()['data']) и получить доступ к[‘attribute’][‘value’], который выдает нам выходные данные.

Комментарии:

1. ты сделал мой день! Спасибо за все разъяснения! Я новичок в python и веб-скраппинге! Может ли ypu дать несколько советов о том, где я могу подробнее изучить веб-очистку и работу в более сложных решениях, подобных этому?

2. В этом месте сложно найти неизменно качественную информацию. Я предлагаю попробовать несколько простых веб-сайтов, с которых вы хотите получать информацию. Старайтесь сначала не очищать страницы, загруженные javascript. Привыкайте собирать информацию с помощью запросов и beautifulsoup. Документы BS на самом деле неплохо читать. Попробуйте страницы с разбиением на страницы и рекурсивные очистки (например, данные на двух или более отдельных страницах домашняя страница -&&t; страница компании -&&t; генеральный директор компании).

3. Пара более сложных тем 1) Динамический контент, вам уже было показано, как эффективно создавать страницы с динамическим контентом, если на веб-сайте есть конечная точка API. 2) Бесконечная прокрутка 3) Страницы с разбиением на страницы 4) Процедуры входа в систему 5) Использование автоматизации браузера (должно быть последним средством в скрипте очистки, поскольку может быть хрупким и громоздким в использовании) 6) Работа с табличной информацией 7) Планирование очистки веб-страниц 8) Настройка веб-скребка в облаке для автоматической очистки. Обычно я бы просто попробовал что-нибудь, поискал вокруг, нашел stack overflow и разместил здесь другой вопрос.

Ответ №2:

Вы можете использовать

  1. http://itunes.apple.com/lookup?id=APPID
  2. https://itunes.apple.com/rss/customerreviews/id=APPID/sortBy=mostRecent/json

Это API, предоставляемые Apple, и они намного лучше, чем очистка веб-сайта напрямую.