从动态页面提取完整评论和评级时遇到问题

问题描述 投票:0回答:1

我想从网站上抓取提取数据: https://www.kununu.com/de/adidas/kommentare

但是,当我尝试通过 webdriver 提取整个 HTML 代码时,某些数据未提取。

丢失的数据包含在存储中,但到目前为止我也可以成功提取它。 因此,我使用两个源来处理数据(Soup 和 JSON)。

但是,该页面是动态的,所以我必须点击“阅读更多评论”。我通过汤检索的数据已扩展。 JSON 数据的情况并非如此。通过我的程序,我仍然只获取第一个“阅读更多评论”按钮之前的数据。

这是我到目前为止的方法

driver = webdriver.Chrome()

driver.get(url)

consent_accept_button(driver)

show_more_reviews(driver, 2)

soup = BeautifulSoup(driver.page_source, "html.parser")

JSON = json.loads(soup.select_one("#__NEXT_DATA__").text)

driver.quit()

Soup 现在包含通过单击“阅读更多评论”两次可以收集的所有评论(取决于 show_more_reviews)。 JSON 没有,因为它仍然只包含前十条评论。

这是为什么呢?我如何扩展 JSON 以包含所有数据?

python html json selenium-webdriver beautifulsoup
1个回答
0
投票

以下是如何使用他们的 Ajax API 加载更多评论的示例:

import requests

url = "https://www.kununu.com/de/adidas/kommentare"
api_url = "https://www.kununu.com/middlewares/profiles/de/adidas/{id_}/reviews"

params = {
    "fetchFactorScores": "0",
    "reviewType": "employees",
    "urlParams": "",
    "page": "1",
}

soup = BeautifulSoup(requests.get(url).content, "html.parser")
id_ = soup.select_one('a[href*="/review/"]')["href"].split("/")[5]

for params["page"] in range(1, 3):  # <-- increase number of pages here
    data = requests.get(api_url.format(id_=id_), params=params).json()
    for r in data["reviews"]:
        for t in r["texts"]:
            print(t["text"])
        print("-" * 80)

打印:


...

--------------------------------------------------------------------------------
Akkord arbeiten mit weniger MA.
Mehr Gehalt für die Mitarbeiter die sich jeden Tag den Abschluss ausreißen, damit die Sesselpuper sich nicht bewegen müsse
--------------------------------------------------------------------------------
Schulung für Vorgesetzte
--------------------------------------------------------------------------------
Kantine
Fehlende Transparenz, kein Respekt, kaum Fairness.<br/>Viel Ignoranz.
Transparenz, Respekt und Fairness gegenüber allen Mitarbeitenden.
--------------------------------------------------------------------------------

...
© www.soinside.com 2019 - 2024. All rights reserved.