我想从网站上抓取提取数据: 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 以包含所有数据?
以下是如何使用他们的 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.
--------------------------------------------------------------------------------
...