#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.
- Перепроектируйте HTTP-запросы — это самый эффективный способ получить нужные данные. Вы хотите имитировать эти HTTP-запросы, которые вызывает javascript. Если вы можете это сделать, а для этого иногда требуется публиковать заголовки, параметры и файлы cookie, тогда вы сможете получить нужные данные.
- Использование какой-либо формы автоматизации браузера. Предпочтительным пакетом является 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
...
Объяснение кода
-
Мы используем заголовки, необходимые для выполнения запроса (мне удалось получить данные без этого, но при попытке получить все данные, казалось, нужны заголовки, хотя с этим можно поиграть)
-
Мы зацикливаем необходимые параметры, в данном случае мы хотим иметь смещение 0, 10. Поэтому мы используем
ran&e(0,20,10)
, чтобы получить это. Для каждого параметра мы создаем HTTP &et-запрос с заголовками и этими конкретными параметрами. -
Мы преобразуем ответ в словарь python с помощью
response.json()
-
Если вы выведете это, мы увидим много данных, мы должны находиться в
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}}
- Итак, вы можете видеть, что на самом деле нужные нам данные находятся за
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:
Вы можете использовать
- http://itunes.apple.com/lookup?id=APPID
- https://itunes.apple.com/rss/customerreviews/id=APPID/sortBy=mostRecent/json
Это API, предоставляемые Apple, и они намного лучше, чем очистка веб-сайта напрямую.