从动态页面提取完整评论和评分的问题
我想从一个网站上提取数据,网址是: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.
--------------------------------------------------------------------------------
...