我正在进行一个使用Selenium和Python 3.6在Jupyter Notebook中使用web爬虫的项目。
其目标是获取应用程序的评论以及相应的日期和评级。
目标网页是

我可以得到评论,但我没有抓住他们的日期和评分。
我用来获取评论的代码如下所示:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'https://play.google.com/store/apps/details?id=io.silvrr.installment&hl=en_US&gl=US&showAllReviews=true'
path = r"D:\Term 1\Cloud Computing\Session 4-5\CC_ETL\chromedriver"
browser = webdriver.Chrome(path) #Obrir un navegador Chrome
browser.get(url)
content = browser.find_elements_by_class_name('UD7Dzf')
User_Review = [] #Create an empty list to store the user reviews
for i in (range(0,40)):
first = {'Review -{}'.format(i+1):content[i].text}
User_Review.append(first)
User_Review然后,我尝试用类名"p2TkOb"获取日期。
date = browser.find_elements_by_class_name('p2TkOb')但是它没有返回具体的日期。相反,它返回了如下一些web元素:
[<selenium.webdriver.remote.webelement.WebElement (session="b0e4c4f85a982c03a64302931a3474d1", element="dd95dfb2-c8da-47fc-8d5e-16a0ce010db7")>,
<selenium.webdriver.remote.webelement.WebElement (session="b0e4c4f85a982c03a64302931a3474d1", element="7fd1ab9a-b654-4ec0-b6c7-e8bd5260d0db")>,另外,还有两种日期,一种是用户的日期,另一种是开发人员的日期,类名相同。然而,的目标只是获取用户评论的日期.

我在定位收视率方面也遇到了麻烦,比如div aria-label="Rated 1 stars out of five stars"。
有人能帮帮我吗?非常感谢!
发布于 2021-02-08 04:29:48
搜索分离的content和分离的date不是一个好主意。
您应该得到div,它同时保留了content和date,然后使用相对find_element_by_...在div中获取content和date。这样,您就可以获得这个date的content,并且可以控制它。
我使用'd15Mdf bAhLNe'获取content和date (每个div组都在一次评审中)的div。后来,我在每个content和date中分别搜索--使用item.find...而不是browser.find... --我得到了单身的content和singel date,我确信这个date是针对这个content的。
代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url = 'https://play.google.com/store/apps/details?id=io.silvrr.installment&hl=en_US&gl=US&showAllReviews=true'
path = r"D:\Term 1\Cloud Computing\Session 4-5\CC_ETL\chromedriver"
#browser = webdriver.Chrome(path) #Obrir un navegador Chrome
browser = webdriver.Firefox()
browser.get(url)
cards = browser.find_elements_by_class_name('d15Mdf.bAhLNe') # it has to be `dot` in place of `space`
user_reviews = [] # Create an empty list to store the user reviews
for number, item in enumerate(cards, 1):
review = item.find_element_by_class_name('UD7Dzf').text
date = item.find_element_by_class_name('p2TkOb').text
user = item.find_element_by_class_name('X43Kjb').text
rated = item.find_element_by_xpath('.//div[@class="pf5lIe"]/div').get_attribute('aria-label').split(' ')[1]
user_reviews.append({
'number': number,
'review': review,
'date': date,
'user': user,
'rated': rated,
})
for item in user_reviews:
print('---', item['number'], '---')
print('date:', item['date'])
print('user:', item['user'])
print('rated:', item['rated'])
print('review:', item['review'][:50], '...')结果:
--- 1 ---
date: January 9, 2021
user: NICASIO NICOSIA
rated: 1
review: I used to love this app because of the payment ter ...
--- 2 ---
date: February 3, 2021
user: Shitta Soewarno
rated: 1
review: After I updated the application I could no longer ...
--- 3 ---
date: January 25, 2021
user: Jennifer Jones
rated: 2
review: Used to love this alot and i always pay back on ti ...
--- 4 ---
date: February 5, 2021
user: Noy D Junior
rated: 3
review: Applications that helped out so much. But now I'm ...
--- 5 ---
date: January 31, 2021
user: Syuhada Husni
rated: 1
review: it suddenly logged me out and now i cannot log in ...BTW: Selenium在开始时将find_element_by_class_name('name')转换为带有dot的css selector -- .name --但是它有多个名称find_element_by_class_name('name1 name2')的问题。它应该将dot放在每个名称之前,并创建.name1.name2,但是它只在.name1 name2开头添加dot,所以我在
find_elements_by_class_name('d15Mdf.bAhLNe')BTW:创建唯一的键Review-1,Review-2不是个好主意,因为后来得到review是个问题--你必须知道在Review-{}中使用哪个数字。最好在所有项目中使用相同的键review。
BTW: xpath从dot (.//div)开始,创建仅在item中搜索的相对xpath。
我把它放在GitHub furas/python-示例上
https://stackoverflow.com/questions/66095101
复制相似问题