从动态页面提取完整评论和评分的问题

1 投票
1 回答
36 浏览
提问于 2025-04-14 17:43

我想从一个网站上提取数据,网址是:https://www.kununu.com/de/adidas/kommentare

但是,当我尝试通过webdriver提取整个HTML代码时,有些数据没有被提取出来。

缺失的数据存储在一个地方,不过我能成功提取到这些数据。因此,我使用了两种方式来处理数据(Soup和JSON)。

不过,这个页面是动态的,所以我需要点击“查看更多评论”。通过Soup获取的数据是扩展过的,但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,使其包含所有数据呢?

1 个回答

0

这里有一个例子,教你怎么用他们的Ajax接口来加载更多的评论:

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.
--------------------------------------------------------------------------------

...

撰写回答