Для того, чтобы вытащить отзывы из гугл стора, я пытаюсь изучить библиотеку красивых супов. Я написал код, который должен получить все отзывы (включая звездный рейтинг, дату и имя рецензента), но на выходе просто пустой список. Проблема, вероятно, в чем-то очень простом, о чем я слишком неопытен, чтобы знать.
from urllib.request import urlopen
from bs4 import BeautifulSoup as soup
my_url = 'https://play.google.com/store/apps/details?id=com.playstudios.popslots&showAllReviews=true'
uclient = urlopen(my_url)
page_html = uclient.read()
uclient.close()
page_soup = soup(page_html, "html.parser")
reviews = page_soup.findAll("div",{"class":'d15Mdf bAhLNe'})
len(reviews)
Выход 0.
Что мне делать, чтобы это исправить?
Потому что класса, который вы ищете, нет.
curl 'https://play.google.com/store/apps/details?id=com.playstudios.popslots&showAllReviews=true' | grep 'd15Mdf bAhLNe'
Почти все <body>
создается с помощью JavaScript, работающего в браузере, включая, я полагаю, все интересные фрагменты, которые вы ищете.
Если вы хотите попробовать очистить такую страницу, поищите парсеры, которые действительно запускают JavaScript (обычно в Chrome, работающем в автономном режиме).
Классическая библиотека Python requests
поддерживает рендеринг js. Дать ему шанс!
Спасибо! что вы подразумеваете под «рендерингом» и почему я должен его рендерить?
Вам нужно прокрутить, чтобы получить все обзоры, которые требуют автоматизации браузера, например. selenium (запрос POST, который выполняет пакетные обновления, не выглядит простым для копирования.
Если вам нужна только страница 1 , перед прокруткой обзоры вы можете использовать их регулярно (мое регулярное выражение недостаточно хорошо, чтобы получить его за один раз)
import requests
import re
url = "https://play.google.com/store/apps/details?id=com.playstudios.popslots&showAllReviews=true"
r = requests.get(url)
p = re.compile(r'gp:AOqpTOH5kmss3scHG0QoYWgIF-BGIBxKlo-1-KRNg2GEzHXfpccogYalrSCBLbjLp-Y4h-T69r-4nFVYuea8Zg",(.*)\);</script><script aria-hidden = "true"', re.DOTALL)
data = p.findall(r.text)[0]
p2 = re.compile(r'"(.*?)",|\d{21}')
items = p2.findall(data)
x = 0
for i in items:
if re.search(r'(\d{21})', i):
#print(i)
print( items[x-2], ' : ' , items[x-1])
x+=1