Как очистить сайт, который использует нумерацию на основе ajax с python? - PullRequest
0 голосов
/ 23 апреля 2020

Хочу почистить отзывы с этой страницы 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...