Python 从Google play store应用程序网站提取评论

Python 从Google play store应用程序网站提取评论,python,html,selenium,google-play,screen-scraping,Python,Html,Selenium,Google Play,Screen Scraping,div html标记有两个标记,一个是jsname作为'fbQN7e',用于保存较大的评论,这些评论将有一个称为“完整评论”的按钮。同一div html标签中的另一个跨度是“bN97Pc”,它用于保存较小的评论,而在该评论的末尾不会有“完整评论”按钮。我无法获得这两种类型span的评论。在这里,我试图将reviewFullText列表直接写入dataframe,但只获取元素数据类型,而不是文本。我不知道为什么这也会发生 import time from selenium import webdr

div html标记有两个标记,一个是jsname作为'fbQN7e',用于保存较大的评论,这些评论将有一个称为“完整评论”的按钮。同一div html标签中的另一个跨度是“bN97Pc”,它用于保存较小的评论,而在该评论的末尾不会有“完整评论”按钮。我无法获得这两种类型span的评论。在这里,我试图将reviewFullText列表直接写入dataframe,但只获取元素数据类型,而不是文本。我不知道为什么这也会发生

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)

我已修改您的解决方案,以从页面检索所有评论

    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()
导入时间
从selenium导入webdriver
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
从selenium.webdriver.common.by导入
从selenium.common.exceptions导入TimeoutException
类FindByXpathCss():
driver=webdriver.Chrome(可执行文件\u path=r“C:\New folder\chromedriver.exe”)
驱动程序。最大化_窗口()
baseUrl=”https://play.google.com/store/apps/details?id=com.delta.mobile.android&hl=en_US&showAllReviews=true"
获取驱动程序(baseUrl)
卷轴=3
尽管如此:
卷轴-=1
执行_脚本(“window.scrollTo(0,document.body.scrollHeight)”)
时间。睡眠(3)
如果滚动小于0:
打破
buttonClick=WebDriverWait(驱动程序,30)。直到(
所有元素的可见性((By.XPATH,//button[contains(@class,)]][contains(text(),'Full Review')]))
对于按钮中的元素,单击:
驱动程序。执行_脚本(“参数[0]。单击();”,元素)
reviewText=WebDriverWait(驱动程序,30)。直到(
EC.所有元素的存在((By.XPATH,“/*[@class='UD7Dzf']))
对于reviewText中的textreview:
打印textreview.text
reviewText=WebDriverWait(驱动程序,30)。直到(
EC.所有元素的存在((By.XPATH,“/*[@class='UD7Dzf']))
#reviewText=driver。通过xpath(“/*[@class='UD7Dzf']”)查找元素
对于reviewText中的textreview:
打印textreview.text
输出:


我已修改您的解决方案,以从页面检索所有评论

    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()
导入时间
从selenium导入webdriver
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
从selenium.webdriver.common.by导入
从selenium.common.exceptions导入TimeoutException
类FindByXpathCss():
driver=webdriver.Chrome(可执行文件\u path=r“C:\New folder\chromedriver.exe”)
驱动程序。最大化_窗口()
baseUrl=”https://play.google.com/store/apps/details?id=com.delta.mobile.android&hl=en_US&showAllReviews=true"
获取驱动程序(baseUrl)
卷轴=3
尽管如此:
卷轴-=1
执行_脚本(“window.scrollTo(0,document.body.scrollHeight)”)
时间。睡眠(3)
如果滚动小于0:
打破
buttonClick=WebDriverWait(驱动程序,30)。直到(
所有元素的可见性((By.XPATH,//button[contains(@class,)]][contains(text(),'Full Review')]))
对于按钮中的元素,单击:
驱动程序。执行_脚本(“参数[0]。单击();”,元素)
reviewText=WebDriverWait(驱动程序,30)。直到(
EC.所有元素的存在((By.XPATH,“/*[@class='UD7Dzf']))
对于reviewText中的textreview:
打印textreview.text
reviewText=WebDriverWait(驱动程序,30)。直到(
EC.所有元素的存在((By.XPATH,“/*[@class='UD7Dzf']))
#reviewText=driver。通过xpath(“/*[@class='UD7Dzf']”)查找元素
对于reviewText中的textreview:
打印textreview.text
输出:


这里我们将遇到两个问题:-1)应在任何适用的地方单击“全面审查”按钮,然后必须删除审查,如果“全面审查”按钮不可见,审查文本必须位于差异span ID中,我们也应该得到这一点,在您的代码中,是否未单击“全面审查”,审查也未完全提取,无论如何,谢谢你的时间。如果可能,请尝试我的以下逻辑:-如果审查有完整审查按钮,则应单击该按钮,审查必须提取并添加到列表中,如果审查没有完整的审查btn,必须提取评论并将其添加到列表中。@RaghuYoutuber:我已经提取了整个评论,如果它是present@RaghuYoutuber:请接受回答此处我们将遇到2个问题:-1)应在任何适用的位置单击“全面审查”按钮,然后必须删除审查,如果“全面审查”按钮不可见,评论文本必须存在于diff span ID中,我们也应该得到它,在您的代码中,完整的评论没有被点击,并且评论也没有被完全提取,无论如何谢谢您的时间。如果可能,请尝试我的以下逻辑:-如果评论有完整的评论按钮,则应单击该按钮,并且必须将评论提取并添加到列表中;如果评论没有完整的评论btn,则必须将评论提取并添加到列表中。@RaghuYoutuber:我已提取整个评论,如果它是present@RaghuYoutuber:请接受回答