Извлечение отзывов с сайта приложения Google Play Store - PullRequest
1 голос
/ 08 апреля 2020
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pandas as pd

class FindByXpathCss():
    # Declaring variables
    Reviews = []  # List to store final set of reviews
    reviewText = []  # List to store reviews extracted from XPath
    reviewFullText = []

    # Chromedriver path
    driver = webdriver.Chrome(executable_path=r"F:\Chrome-webdriver\chromedriver.exe")
    driver.maximize_window()

    baseUrl = "https://play.google.com/store/apps/details?id=com.delta.mobile.android&hl=en_US&showAllReviews=true"

    driver.get(baseUrl)
    # driver.execute_script("scrollBy(0,300);")
    # Scrolling down
    for i in range(20):
        driver.find_element_by_xpath('//*[@id="yDmH0d"]').send_keys(Keys.ARROW_DOWN, i)
        time.sleep(0.5)

    # To click on Show more button
    #btnShowMore = driver.find_element_by_xpath('//*[@id="fcxH9b"]/div[4]/c-wiz/div/div[2]''/div/div[1]/div/div/div[1]/div[2]/div[2]/div/span/span').click()
    # Scrolling to top
    for j in range(10):
        driver.find_element_by_xpath('//*[@id="yDmH0d"]').send_keys(Keys.ARROW_UP, j)

    #for i in range(10):
    review_btn = driver.find_elements_by_xpath("//button[contains(@class,'')][contains(text(),'Full Review')]")
    single_review_btn = driver.find_element_by_xpath("//button[contains(@class,'')][contains(text(),'Full Review')]")
    #time.sleep(1)

Тег div html имеет 2 тега, один из которых имеет имя jsname как 'fbQN7e', которое предназначено для хранения больших обзоров, и эти обзоры будут иметь кнопку под названием "Полный обзор". Еще один интервал в том же теге div html - это «bN97P c», который предназначен для хранения небольших обзоров, у которых в конце этого обзора не будет кнопки «Полный обзор». Я не мог получить обзоры обоих типов промежутка. Здесь я попытался написать список reviewFullText непосредственно в dataframe, но получил только элемент данных, а не текст. Я не знаю, почему это тоже происходит.

    for btn in review_btn:
        btn.click()
        reviewFullText = driver.find_elements_by_css_selector("span[jsname='fbQN7e']")

    #if(single_review_btn.is_enabled()==False):
        #reviewText = driver.find_elements_by_css_selector("span[jsname=\"bN97Pc\"]")
    ##else:
        #pass

    # Iterating each reviews and appending into list Reviews
    for txtreview in reviewText:
        reviewFullText.append(txtreview.text)

    print(len(reviewFullText))

        # Writing the list values into csv file
    df = pd.DataFrame(reviewFullText)
        #df = pd.DataFrame({'Reviews': 'Reviews'}) #'Sentiment': 'null'})
    df.to_csv('Reviews.csv', index=True, encoding='utf-8')

    driver.close()

1 Ответ

0 голосов
/ 08 апреля 2020

Я изменил ваше решение, чтобы получить все отзывы со страницы.

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
class FindByXpathCss():
        driver = webdriver.Chrome(executable_path=r"C:\New folder\chromedriver.exe")
        driver.maximize_window()
        baseUrl = "https://play.google.com/store/apps/details?id=com.delta.mobile.android&hl=en_US&showAllReviews=true"
        driver.get(baseUrl)

        scrolls = 3
        while True:
            scrolls -= 1
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
            time.sleep(3)
            if scrolls < 0:
                break

        buttonClick = WebDriverWait(driver, 30).until(
            EC.visibility_of_all_elements_located((By.XPATH, "//button[contains(@class,'')][contains(text(),'Full Review')]")))
        for element in buttonClick:
            driver.execute_script("arguments[0].click();", element)

        reviewText = WebDriverWait(driver, 30).until(
            EC.presence_of_all_elements_located((By.XPATH, "//*[@class='UD7Dzf']")))


        for textreview in reviewText:
            print textreview.text

        reviewText = WebDriverWait(driver, 30).until(
            EC.presence_of_all_elements_located((By.XPATH, "//*[@class='UD7Dzf']")))

        # reviewText = driver.find_elements_by_xpath("//*[@class='UD7Dzf']")
        for textreview in reviewText:
            print textreview.text

Выход:

enter image description here

...