新手求助:使用BeautifulSoup抓取WhatClinic网站span类评分数据
解决WhatClinic诊所评分与评论抓取问题(含翻页)
一、你的代码问题分析
results = soup.find_all("span", attrs={"class":"stars-rate"})返回的是BeautifulSoup结果列表,直接调用results.contents会报错,需要遍历列表中的每个元素来获取内容。- 仅用
requests获取静态HTML可能拿不到评论数据——很多网站会通过JavaScript动态加载评论/分页内容,静态请求返回的页面里没有这部分数据。
二、修正后的静态抓取(针对评分)
如果评分是静态渲染的,修正代码如下:
!pip install beautifulsoup4 requests import requests from bs4 import BeautifulSoup # 发起请求,添加请求头模拟浏览器,避免被反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } url = "https://www.whatclinic.com/dentists/turkey/mugla-province/yalikavak/dt-ufuk-kayhan" r = requests.get(url, headers=headers) r.encoding = r.apparent_encoding # 解决编码问题 soup = BeautifulSoup(r.text, "html.parser") # 提取星级评分(遍历结果列表) results = soup.find_all("span", attrs={"class": "stars-rate"}) for item in results: # 提取评分文本或属性值,比如有些网站会用data-rating存储数值 rating_text = item.get_text(strip=True) rating_data = item.get("data-rating") # 检查是否有这个属性 print(f"星级评分文本:{rating_text},数据值:{rating_data}")
三、动态评论抓取与翻页实现
如果评论是JS动态加载的,需要用selenium模拟浏览器加载页面:
步骤1:安装依赖
pip install selenium webdriver-manager
步骤2:完整抓取代码(含翻页)
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time # 初始化浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://www.whatclinic.com/dentists/turkey/mugla-province/yalikavak/dt-ufuk-kayhan") time.sleep(3) # 等待页面加载完成 # 定义抓取函数 def scrape_comments(): soup = BeautifulSoup(driver.page_source, "html.parser") # 抓取评论内容 comments = soup.find_all("div", class_="review-item") for comment in comments: # 提取用户名 username = comment.find("span", class_="reviewer-name").get_text(strip=True) if comment.find("span", class_="reviewer-name") else "匿名" # 提取评分 rating = comment.find("span", class_="stars-rate").get("data-rating") if comment.find("span", class_="stars-rate") else "无评分" # 提取评论内容 content = comment.find("p", class_="review-text").get_text(strip=True) if comment.find("p", class_="review-text") else "无内容" print(f"用户:{username}\n评分:{rating}星\n评论:{content}\n---") # 第一次抓取 scrape_comments() # 翻页逻辑(假设分页按钮是"Next"或类似文本) while True: try: # 找到下一页按钮并点击 next_btn = driver.find_element("xpath", "//a[contains(text(), 'Next')]") # 检查按钮是否可点击(避免重复点击) if next_btn.is_enabled() and next_btn.is_displayed(): next_btn.click() time.sleep(2) # 等待页面加载 scrape_comments() else: break except: # 没有下一页时退出循环 break # 关闭浏览器 driver.quit()
四、注意事项
- 反爬应对:添加请求头、控制请求间隔,避免频繁访问被封IP。
- 元素定位:如果网站更新了类名或结构,需要用浏览器开发者工具(F12)重新检查元素的选择器。
- 数据存储:可以把抓取到的评论存入CSV或JSON文件,方便后续分析。
内容的提问来源于stack exchange,提问作者armagan aydin
相关产品推荐
相关产品推荐

