Хочу почистить отзывы с этой страницы https://www.influenster.com/reviews/garnier-fructis-sleek-shine-anti-frizz-serum-89. Сайт построен с React и нумерация страниц для обзоров полностью ajax. Я попытался селен, чтобы нажать на следующую кнопку и подождать, пока страница не изменится. Все работает хорошо, но проблема, с которой я сталкиваюсь, состоит в том, что это делает процесс очень медленным, так как мне приходится ждать около 10-20 секунд для каждого запроса. Этот продукт имеет 19 664 отзывов и представляет, сколько времени мне нужно ждать одного продукта, и есть 238084 продуктов.
Я также проверяю вкладку сети, чтобы найти URL запроса, и это был https://www.influenster.com/reviews/garnier-fructis-sleek-shine-anti-frizz-serum-89?paginate=true&review_page=15&sort=featured и когда я попытался ударить это в почтальоне, я получаю HTML вместо JSON. Любая помощь будет высоко оценена. В настоящее время я использую селен с BeautifulSoup.
Я знаю, что эти типы вопросов ответили на многие вопросы, но я попробовал все возможные решения.
Вот моя функция, чтобы очистить отзывы
def scrape_reviews(self, soup, product_id):
total_reviews = soup.select('.list-title h3')[0].get_text().strip().split(" ", 1)[0]
pagination = soup.select('.pagination-page-list')[0].findChildren('li')
total_review_pages = pagination[len(pagination) - 2].get_text().strip()
current_reviews = soup.select('.search__ReviewWrapper-sc-1ylxfoz-1 .item')
temp_reviews_ = self.parse_reviews(current_reviews, product_id)
self.temp_total_rating += temp_reviews_.get('rating')
self.temp_total_reviews += temp_reviews_.get('reviews')
n = int(total_review_pages)
def click_on_links(i, j):
# global total_rating, review_count
if i < j:
# click_n_wait(self.driver, self.driver.find_element_by_xpath('//a[@aria-label="Page ' + str(i) + '"]'))
click_n_wait(self.driver, self.driver.find_element_by_css_selector('.next a'))
sleep(20)
new_soup = self.get_soup_from_driver()
current_reviews1 = new_soup.select('.search__ReviewWrapper-sc-1ylxfoz-1 .item')
_temp_reviews = self.parse_reviews(current_reviews1, product_id)
self.temp_total_rating += _temp_reviews.get('rating')
self.temp_total_reviews += _temp_reviews.get('reviews')
click_on_links(i + 1, j)
else:
return False
click_on_links(1, n)
print('click finished...')
return {
'rating': self.temp_total_rating,
'reviews': self.temp_total_reviews
}
Вот функция click_and_wait
def click_n_wait(driver, button, timeout=5):
source = driver.page_source
button.click()
def compare_source(driver):
try:
return source != driver.page_source
except WebDriverException:
pass
WebDriverWait(driver, timeout).until(compare_source)